diff --git a/org.eclipse.osbp.xtext.datainterchange.common/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.datainterchange.common/META-INF/MANIFEST.MF
index 67e0a5f..1bdb517 100644
--- a/org.eclipse.osbp.xtext.datainterchange.common/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datainterchange.common/META-INF/MANIFEST.MF
@@ -5,11 +5,14 @@
 Bundle-Vendor: Eclipse OSBP
 Bundle-Version: 0.9.0.qualifier
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
-Import-Package: org.eclipse.e4.core.services.events,
+Import-Package: org.eclipse.core.resources,
+ org.eclipse.core.runtime;version="3.5.0",
+ org.eclipse.e4.core.services.events,
  org.eclipse.osbp.core.api.persistence;version="0.9.0",
  org.eclipse.osbp.eventbroker;version="0.9.0",
  org.eclipse.osbp.runtime.common.event;version="0.9.0",
  org.eclipse.osbp.ui.api.customfields;version="0.9.0",
+ org.eclipse.osbp.utils.common;version="0.9.0",
  org.slf4j;version="1.7.2"
 Export-Package: org.eclipse.osbp.xtext.datainterchange.common;version="0.9.0"
 Require-Bundle: com.vaadin.server;bundle-version="[7.7.6,7.8.0)",
diff --git a/org.eclipse.osbp.xtext.datainterchange.common/src/org/eclipse/osbp/xtext/datainterchange/common/WorkerThreadRunnable.java b/org.eclipse.osbp.xtext.datainterchange.common/src/org/eclipse/osbp/xtext/datainterchange/common/WorkerThreadRunnable.java
index cd40c8f..cc2c559 100644
--- a/org.eclipse.osbp.xtext.datainterchange.common/src/org/eclipse/osbp/xtext/datainterchange/common/WorkerThreadRunnable.java
+++ b/org.eclipse.osbp.xtext.datainterchange.common/src/org/eclipse/osbp/xtext/datainterchange/common/WorkerThreadRunnable.java
@@ -15,10 +15,23 @@
  */
 package org.eclipse.osbp.xtext.datainterchange.common;
 
+import java.io.File;
 import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.Files;
+import java.nio.file.InvalidPathException;
 import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.text.SimpleDateFormat;
+import java.util.Locale;
 
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.IPath;
 import org.eclipse.osbp.core.api.persistence.IPersistenceService;
 import org.eclipse.osbp.datainterchange.api.IDataInterchangeExecutionEvent;
 import org.eclipse.osbp.datainterchange.api.IDataInterchangeExecutionEventListener;
@@ -32,7 +45,7 @@
 import com.vaadin.ui.UI;
 
 public abstract class WorkerThreadRunnable implements Runnable, IDataInterchangeExecutionEventListener {
-	static final Logger log = LoggerFactory.getLogger(WorkerThreadRunnable.class);
+	static final Logger log = LoggerFactory.getLogger("dataInterchange");
 	private String name = null;
 	private String status = null;
 	private IEventDispatcher eventDispatcher;
@@ -42,8 +55,10 @@
 	private long counter = 0 ;
 	private long length = 0;
 	private long avgElementSize = 0;
-	private static float previousValue = 0.0f;
+	private float previousValue = 0.0f;
 	private UI ui = null;
+	private URL fileURL;
+	private SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddhhmmssa", Locale.US);
 	
 	public enum Direction {IMPORT, EXPORT}
 	
@@ -52,6 +67,10 @@
 	
 	private boolean deleteFileAfterImport=false;
 	private boolean failedExecution = false;
+	private boolean executionDone = false;
+	private float progress;
+	
+	private final String ERROR_MESSAGE = "The directory you've chosen does not exist or is not accessible. Please adapt the url.";
 	
 	public WorkerThreadRunnable() {
 		progressBarArea = new HorizontalLayout();
@@ -153,62 +172,266 @@
 		if(ui != null) {
 			switch(event.getType()) {
 			case STARTED:
-				log.debug("started");
 	            ui.access(() -> {
                 	progressBar.setValue(0.0f);
                 	progressBar.setEnabled(false);
                 });
 				break;
 			case FINISHED:
-				log.debug("finished");
 	            ui.access(() -> {
                 	progressBar.setValue(1.0f);
                 	progressBar.setIndeterminate(true);
                 });
 				break;
 			case ELEMENT:
-				log.debug("element");
-		    	counter ++; 
-				if (length != 0 && Math.abs(((float)counter*avgElementSize)/length-previousValue) > 0.01) {
-		            ui.access(() -> {
-	        			log.debug("new value:"+((float)counter*avgElementSize)/length);
-	                	progressBar.setValue(((float)counter*avgElementSize)/length);
-		            });
-				}
+		    	counter ++;
+		    	if (length != 0) {
+		    		progress = ((float)counter*avgElementSize)/length;
+					if (Math.abs(progress-previousValue) > 0.01) {
+			            ui.access(() -> {
+		            		log.debug("progress {}", progress);
+		                	progressBar.setValue(progress);
+		                	previousValue = progress;
+			            });
+					}
+		    	}
 				break;
 			}
 		}
 	}
-
+	
+	/**
+	 * Sets the {@link #fileURL}.
+	 * @param filepath the file URl
+	 */
+	public void setFileURL(String filepath) {
+		fileURL = null;
+		try {
+			fileURL = new URL(filepath);
+		} catch (MalformedURLException e1) {
+			if (e1.getMessage().startsWith("unknown protocol") || e1.getMessage().startsWith("no protocol")) {
+				try {
+					fileURL = Paths.get(filepath).toUri().toURL();
+				} catch (MalformedURLException e2) {
+					StringWriter sw = new StringWriter();
+					e2.printStackTrace(new PrintWriter(sw));
+					log.error("{}", sw);
+				}
+			}
+		}
+//		fileURL = produceAppropiateInterchangeURL(filepath);
+	}
+	
+	/**
+	 * Gives the {@link #fileURL}.
+	 * @return {@link URL} the file url
+	 */
+	public URL getFileURL() {
+		return this.fileURL;
+	}
+	
+	/**
+	 * Checks whether the import file has to be deleted 
+	 * at the end of the process.
+	 * @return true if yes, false if not
+	 */
 	public boolean isDeleteFileAfterImport() {
 		return deleteFileAfterImport;
 	}
 	
+	/**
+	 * Sets whether the import file has to be deleted 
+	 * at the end of the process.
+	 * @param deleteFileAfterImport
+	 */
 	public void setDeleteFileAfterImport(boolean deleteFileAfterImport) {
 		this.deleteFileAfterImport = deleteFileAfterImport;
 	}
 	
 	/**
 	 * Make sure that the given file is deleted.
+	 * @param file the file to rename
+	 * @param logidinfo log information from the caller.
 	 */
-	public void deleteFile(final Path file) {
+	public void deleteFile(final Path file, String logidinfo) {
 		try {
 			if(Files.deleteIfExists(file)){
-				log.debug("File: " + file + " successfuly removed.");				
+				log.info("{} [{}] successfuly removed.", logidinfo, file);				
 			}
 			else{
-				log.debug("File: " + file + " doesn't exist and could not be deleted.");								
+				log.info("{} [{}] doesn't exist and could not be removed.", logidinfo, file);								
 			}
 		} catch (IOException e) {
-			log.error("File: " + file + " could not be deleted.\n" + e.getMessage());
+			log.error("{} [{}] could not be deleted.\n{}", logidinfo, file, e.getMessage());
 		}
 	}
-
+	
+	/**
+	 * Renames the given file with the given new name. If a file with the given 
+	 * new name already exists then a number offset will be added to it.
+	 * @param file the file to rename
+	 * @param newname the new file name
+	 */
+	public void renameFile(final Path file, String newname) {
+		try {
+			if(Files.exists(file)){
+				String filename = file.getFileName().toString();
+				if(newname == null || newname.isEmpty()){
+					log.info("file [{}] has not been renamed!", filename);
+				}
+				else{					
+					int renameTry = 0;
+					boolean done = false;
+					String tempname = newname;
+					String extension = newname.substring(newname.length()-4);
+					do{
+						try{						
+							Files.move(file, file.resolveSibling(tempname));
+							done =  true;
+						}catch (FileAlreadyExistsException ae) {
+							renameTry ++;
+							tempname = newname.replace(extension, renameTry+extension);
+						}						
+					}while(!done);
+					log.info("file [{}] renamed to {}.", filename, tempname);			 	
+				}
+			}
+			else{
+				log.info("file [{}] doesn't exist and could not be renamed.", file);								
+			}
+		} catch (IOException e) {
+			log.error("file [{}] could not be renamed.\n{}", file, e.getMessage());
+		}
+	}
+	
+	/**
+	 * Checks whether the import or export execution is done.  
+	 * @return true if yes, false if not
+	 */
+	public boolean isExecutionDone() {
+		return executionDone;
+	}
+	
+	/**
+	 * Sets whether the import or export execution is done.
+	 * @param executionDone the execution state
+	 */
+	public void setExecutionDone(boolean executionDone) {
+		this.executionDone = executionDone;
+	}
+	
+	/**
+	 * Checks whether the import or export execution has failed. 
+	 * @return true if yes, false if not
+	 */
 	public boolean hasExecutionFailed() {
 		return failedExecution;
 	}
 
+	/**
+	 * Sets whether the import or export execution has failed.
+	 * @param failedExecution the new state
+	 */
 	public void setExecutionFailed(boolean failedExecution) {
 		this.failedExecution = failedExecution;
 	}
+	
+	/**
+	 * Gives the {@link #formatter}.
+	 * @return {@link SimpleDateFormat}
+	 */
+	public SimpleDateFormat getFormatter(){
+		return formatter;
+	}
+	
+	/**
+	 * Generates the right directory url depending on whether
+	 * the given file path is relative or absolute.
+	 * @return the URL
+	 */
+	public URL produceAppropiateInterchangeURL(String filepath){
+		URL url = null;
+		String filename = null;
+		String directory = null;
+		
+		if(filepath != null && !filepath.isEmpty()){
+			
+			int index = filepath.lastIndexOf("/");
+			if( index != -1) {
+				directory = filepath.substring(0, index + 1);
+				filename = filepath.substring(index + 1, filepath.length());
+			}else{
+				index = filepath.lastIndexOf("\\");
+				if(index != -1){
+					directory = filepath.substring(0, index + 1);
+					filename = filepath.substring(index + 1, filepath.length());
+				}						
+			}
+			// TODO for relative path check if directory is valid
+			// check most needed for configuration file entries
+			if(directory != null && !directory.isEmpty() && filename != null && !filename.isEmpty()) {
+				try {
+					url = new URL(filepath);
+					if(url.getProtocol().equals("file")){ 
+						// do nothing for now
+					}
+				} catch (InvalidPathException | MalformedURLException e1) {
+					if (e1.getMessage().startsWith("unknown protocol") || e1.getMessage().startsWith("no protocol")) {
+						try {
+							if(!Paths.get(filepath).isAbsolute()) { // check for relative path
+								IPath folderlocation = null;
+								//check if WITHIN all projects a directory exists corresponding to the relative path
+								for(IProject prj : ResourcesPlugin.getWorkspace().getRoot().getProjects()){
+									IPath templocation  =  prj.getFolder(directory).getLocation();
+									Path folder = Paths.get(templocation.toString());
+									if(folder != null && folder.toFile() != null ) {   
+										// find the first folder
+										folderlocation = templocation;
+										break;
+									}
+									//else 1. in the base projects for ../..
+									//else 2. outside the base project
+								}
+								
+								File file = Paths.get(folderlocation.append(filename).toOSString()).toFile();
+								if(file != null && file.exists() && file.isDirectory()){
+									url = Paths.get(folderlocation.append(filename).toString()).toUri().toURL();
+								}
+								else {
+									// TODO to be cleared with Joerg, if fale safe is needed 
+									// if the folder doesn't exist then use the base directory as main location for all interchanges
+									// url = Paths.get(ResourcesPlugin.getWorkspace().getRoot().getProjectRelativePath().append(filename).toString()).toUri().toURL();
+									throw new InvalidPathException(ERROR_MESSAGE, filepath);
+								}
+							}
+							else{ // for absolute paths that were malformed or else   
+								url = Paths.get(filepath).toUri().toURL();
+							}
+						} catch (InvalidPathException | MalformedURLException e2) {
+							StringWriter sw = new StringWriter();
+							e2.printStackTrace(new PrintWriter(sw));
+							log.error("{}", sw);
+						}
+					}
+				}
+			}
+		}
+		// if the path is absolute or from another protocol like http, ftp ... just return
+		return url;
+	}
+	
+	/**
+	 * Returns the path of the given file name or directory name.  
+	  */
+	public IPath findProjectFileOrFolderLocation(String projectname, String fname, boolean isFile) {
+		if(projectname != null && !projectname.isEmpty() && fname != null && !fname.isEmpty()){
+			IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectname);
+			if(isFile){
+				return project.getFile(fname).getLocation();
+			}
+			return project.getFolder(fname).getLocation();
+		}
+		return null;
+	}
+
 }
diff --git a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/DataDSLParser.java b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/DataDSLParser.java
index aec41a5..3902c90 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/DataDSLParser.java
+++ b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/DataDSLParser.java
@@ -49,7 +49,10 @@
 					put(grammarAccess.getDataInterchangeFileAccess().getAlternatives(), "rule__DataInterchangeFile__Alternatives");
 					put(grammarAccess.getDataInterchangeExpressionAccess().getAlternatives(), "rule__DataInterchangeExpression__Alternatives");
 					put(grammarAccess.getDataInterchangeExposeAccess().getAlternatives_3(), "rule__DataInterchangeExpose__Alternatives_3");
+					put(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getAlternatives(), "rule__DataInterchangeLookupFilterOperand__Alternatives");
 					put(grammarAccess.getDataInterchangeMappingAccess().getAlternatives(), "rule__DataInterchangeMapping__Alternatives");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0(), "rule__DataInterchangeFixedColumnMapping__Alternatives_5_0");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_1(), "rule__DataInterchangeFixedColumnMapping__Alternatives_5_1");
 					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_2(), "rule__XImportDeclaration__Alternatives_2");
 					put(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3(), "rule__XImportDeclaration__Alternatives_2_0_3");
 					put(grammarAccess.getXAnnotationAccess().getAlternatives_3_1(), "rule__XAnnotation__Alternatives_3_1");
@@ -97,8 +100,8 @@
 					put(grammarAccess.getPredefinedBeanEnumAccess().getAlternatives(), "rule__PredefinedBeanEnum__Alternatives");
 					put(grammarAccess.getPredefinedBeanTypeEnumAccess().getAlternatives(), "rule__PredefinedBeanTypeEnum__Alternatives");
 					put(grammarAccess.getEntityManagerModeAccess().getAlternatives(), "rule__EntityManagerMode__Alternatives");
-					put(grammarAccess.getConditionAndOperator1Access().getAlternatives(), "rule__ConditionAndOperator1__Alternatives");
-					put(grammarAccess.getConditionAndOperator2Access().getAlternatives(), "rule__ConditionAndOperator2__Alternatives");
+					put(grammarAccess.getOperatorAccess().getAlternatives(), "rule__Operator__Alternatives");
+					put(grammarAccess.getJunctionAccess().getAlternatives(), "rule__Junction__Alternatives");
 					put(grammarAccess.getDataInterchangeModelAccess().getGroup(), "rule__DataInterchangeModel__Group__0");
 					put(grammarAccess.getDataInterchangePackageAccess().getGroup(), "rule__DataInterchangePackage__Group__0");
 					put(grammarAccess.getDataInterchangePackageAccess().getGroup_3(), "rule__DataInterchangePackage__Group_3__0");
@@ -120,6 +123,9 @@
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getGroup(), "rule__DataInterchangeFileEDI__Group__0");
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_0(), "rule__DataInterchangeFileEDI__Group_3_0__0");
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_1(), "rule__DataInterchangeFileEDI__Group_3_1__0");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getGroup(), "rule__DataInterchangeFileFixed__Group__0");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0(), "rule__DataInterchangeFileFixed__Group_3_0__0");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_1(), "rule__DataInterchangeFileFixed__Group_3_1__0");
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup(), "rule__DataInterchangeBean__Group__0");
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_3(), "rule__DataInterchangeBean__Group_3__0");
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_4(), "rule__DataInterchangeBean__Group_4__0");
@@ -127,16 +133,17 @@
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_6(), "rule__DataInterchangeBean__Group_6__0");
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_7(), "rule__DataInterchangeBean__Group_7__0");
 					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8(), "rule__DataInterchangeBean__Group_8__0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_9(), "rule__DataInterchangeBean__Group_9__0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_10(), "rule__DataInterchangeBean__Group_10__0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_11(), "rule__DataInterchangeBean__Group_11__0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_12(), "rule__DataInterchangeBean__Group_12__0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_13(), "rule__DataInterchangeBean__Group_13__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_0(), "rule__DataInterchangeBean__Group_8_0__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_1(), "rule__DataInterchangeBean__Group_8_1__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_2(), "rule__DataInterchangeBean__Group_8_2__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_3(), "rule__DataInterchangeBean__Group_8_3__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_4(), "rule__DataInterchangeBean__Group_8_4__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_5(), "rule__DataInterchangeBean__Group_8_5__0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_6(), "rule__DataInterchangeBean__Group_8_6__0");
 					put(grammarAccess.getDataInterchangeKeyAccess().getGroup(), "rule__DataInterchangeKey__Group__0");
 					put(grammarAccess.getDataInterchangeLookupAccess().getGroup(), "rule__DataInterchangeLookup__Group__0");
-					put(grammarAccess.getDataInterchangeLookupAccess().getGroup_5(), "rule__DataInterchangeLookup__Group_5__0");
-					put(grammarAccess.getDataInterchangeLookupAccess().getGroup_8(), "rule__DataInterchangeLookup__Group_8__0");
-					put(grammarAccess.getDataInterchangeLookupAccess().getGroup_9(), "rule__DataInterchangeLookup__Group_9__0");
+					put(grammarAccess.getDataInterchangeLookupAccess().getGroup_12(), "rule__DataInterchangeLookup__Group_12__0");
+					put(grammarAccess.getDataInterchangeLookupAccess().getGroup_13(), "rule__DataInterchangeLookup__Group_13__0");
 					put(grammarAccess.getDataInterchangeMarkerPathAccess().getGroup(), "rule__DataInterchangeMarkerPath__Group__0");
 					put(grammarAccess.getDataInterchangeMarkerEntityAccess().getGroup(), "rule__DataInterchangeMarkerEntity__Group__0");
 					put(grammarAccess.getDataInterchangeMarkerEntityAccess().getGroup_3(), "rule__DataInterchangeMarkerEntity__Group_3__0");
@@ -148,14 +155,19 @@
 					put(grammarAccess.getDataInterchangeExportFilterAccess().getGroup(), "rule__DataInterchangeExportFilter__Group__0");
 					put(grammarAccess.getDataInterchangeExportFilterAccess().getGroup_1(), "rule__DataInterchangeExportFilter__Group_1__0");
 					put(grammarAccess.getDataInterchangeExportFilterAccess().getGroup_2(), "rule__DataInterchangeExportFilter__Group_2__0");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup(), "rule__DataInterchangeFilterCondition__Group__0");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup_3(), "rule__DataInterchangeFilterCondition__Group_3__0");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup(), "rule__DataInterchangeExportFilterCondition__Group__0");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup_3(), "rule__DataInterchangeExportFilterCondition__Group_3__0");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup(), "rule__DataInterchangeLookupFilterCondition__Group__0");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup_3(), "rule__DataInterchangeLookupFilterCondition__Group_3__0");
+					put(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getGroup(), "rule__DataInterchangeLookupFilterOperandProperty__Group__0");
+					put(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getGroup(), "rule__DataInterchangeLookupFilterOperandString__Group__0");
 					put(grammarAccess.getDataInterchangeExportHideAccess().getGroup(), "rule__DataInterchangeExportHide__Group__0");
 					put(grammarAccess.getDataInterchangePredefinedExpressionAccess().getGroup(), "rule__DataInterchangePredefinedExpression__Group__0");
 					put(grammarAccess.getDataInterchangeValueMappingAccess().getGroup(), "rule__DataInterchangeValueMapping__Group__0");
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup(), "rule__DataInterchangeBlobMapping__Group__0");
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup_5(), "rule__DataInterchangeBlobMapping__Group_5__0");
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup_6(), "rule__DataInterchangeBlobMapping__Group_6__0");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getGroup(), "rule__DataInterchangeFixedColumnMapping__Group__0");
 					put(grammarAccess.getLFQNAccess().getGroup(), "rule__LFQN__Group__0");
 					put(grammarAccess.getLFQNAccess().getGroup_1(), "rule__LFQN__Group_1__0");
 					put(grammarAccess.getXImportDeclarationAccess().getGroup(), "rule__XImportDeclaration__Group__0");
@@ -391,31 +403,35 @@
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getLocaleAssignment_3_1_1(), "rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1");
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getMappingModelAssignment_5(), "rule__DataInterchangeFileEDI__MappingModelAssignment_5");
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getValidateAssignment_6(), "rule__DataInterchangeFileEDI__ValidateAssignment_6");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLAssignment_2(), "rule__DataInterchangeFileFixed__FileURLAssignment_2");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingAssignment_3_0_1(), "rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleAssignment_3_1_1(), "rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1");
 					put(grammarAccess.getDataInterchangeBeanAccess().getEntityAssignment_2(), "rule__DataInterchangeBean__EntityAssignment_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_3_1(), "rule__DataInterchangeBean__NodeNameAssignment_3_1");
-					put(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_4_1(), "rule__DataInterchangeBean__ElementMapAssignment_4_1");
-					put(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_5_0(), "rule__DataInterchangeBean__MarkLatestImportAssignment_5_0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_5_1(), "rule__DataInterchangeBean__LatestPropertyAssignment_5_1");
-					put(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_6_0(), "rule__DataInterchangeBean__MarkLatestExportAssignment_6_0");
-					put(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_6_1(), "rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1");
-					put(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_7_2(), "rule__DataInterchangeBean__ExpressionAssignment_7_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_2(), "rule__DataInterchangeBean__LookupAssignment_8_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_9_2(), "rule__DataInterchangeBean__FormatAssignment_9_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_10_2(), "rule__DataInterchangeBean__ExportExposesAssignment_10_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_11_2(), "rule__DataInterchangeBean__MappingsAssignment_11_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_12_2(), "rule__DataInterchangeBean__LookupKeysAssignment_12_2");
-					put(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_13_2(), "rule__DataInterchangeBean__ExportFilterAssignment_13_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceAssignment_3_1(), "rule__DataInterchangeBean__RefDataSourceAssignment_3_1");
+					put(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_4_1(), "rule__DataInterchangeBean__NodeNameAssignment_4_1");
+					put(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_5_1(), "rule__DataInterchangeBean__ElementMapAssignment_5_1");
+					put(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_6_0(), "rule__DataInterchangeBean__MarkLatestImportAssignment_6_0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_6_1(), "rule__DataInterchangeBean__LatestPropertyAssignment_6_1");
+					put(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_7_0(), "rule__DataInterchangeBean__MarkLatestExportAssignment_7_0");
+					put(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_7_1(), "rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1");
+					put(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_8_0_2(), "rule__DataInterchangeBean__ExpressionAssignment_8_0_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_1_2(), "rule__DataInterchangeBean__LookupAssignment_8_1_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_8_2_2(), "rule__DataInterchangeBean__FormatAssignment_8_2_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_8_3_2(), "rule__DataInterchangeBean__ExportExposesAssignment_8_3_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_8_4_2(), "rule__DataInterchangeBean__MappingsAssignment_8_4_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_8_5_2(), "rule__DataInterchangeBean__LookupKeysAssignment_8_5_2");
+					put(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_8_6_2(), "rule__DataInterchangeBean__ExportFilterAssignment_8_6_2");
 					put(grammarAccess.getDataInterchangeKeyAccess().getPropertyAssignment_2(), "rule__DataInterchangeKey__PropertyAssignment_2");
 					put(grammarAccess.getDataInterchangeLookupAccess().getTargetPropertyAssignment_2(), "rule__DataInterchangeLookup__TargetPropertyAssignment_2");
 					put(grammarAccess.getDataInterchangeLookupAccess().getEntityAssignment_4(), "rule__DataInterchangeLookup__EntityAssignment_4");
-					put(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_5_1(), "rule__DataInterchangeLookup__ElementMapAssignment_5_1");
-					put(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_7(), "rule__DataInterchangeLookup__QueryPropertyAssignment_7");
-					put(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_8_0(), "rule__DataInterchangeLookup__CachedAssignment_8_0");
-					put(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_8_1(), "rule__DataInterchangeLookup__CacheSizeAssignment_8_1");
-					put(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_9_1(), "rule__DataInterchangeLookup__DataMapAssignment_9_1");
-					put(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0(), "rule__DataInterchangeLookup__AllowNoResultAssignment_10_0");
-					put(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1(), "rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1");
-					put(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_10_2(), "rule__DataInterchangeLookup__MarkerPathAssignment_10_2");
+					put(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_6(), "rule__DataInterchangeLookup__ElementMapAssignment_6");
+					put(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_8(), "rule__DataInterchangeLookup__DataMapAssignment_8");
+					put(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0(), "rule__DataInterchangeLookup__AllowNoResultAssignment_9_0");
+					put(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_9_1(), "rule__DataInterchangeLookup__MarkerPathAssignment_9_1");
+					put(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_11(), "rule__DataInterchangeLookup__QueryPropertyAssignment_11");
+					put(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_12_0(), "rule__DataInterchangeLookup__CachedAssignment_12_0");
+					put(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_12_1(), "rule__DataInterchangeLookup__CacheSizeAssignment_12_1");
+					put(grammarAccess.getDataInterchangeLookupAccess().getConditionAssignment_13_2(), "rule__DataInterchangeLookup__ConditionAssignment_13_2");
 					put(grammarAccess.getDataInterchangeMarkerPathAccess().getPathAssignment_3(), "rule__DataInterchangeMarkerPath__PathAssignment_3");
 					put(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityAssignment_2(), "rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2");
 					put(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestAssignment_3_0(), "rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0");
@@ -430,11 +446,18 @@
 					put(grammarAccess.getDataInterchangeExposeAccess().getSubExposeAssignment_3_1_2(), "rule__DataInterchangeExpose__SubExposeAssignment_3_1_2");
 					put(grammarAccess.getDataInterchangeExportFilterAccess().getConditionAssignment_1_2(), "rule__DataInterchangeExportFilter__ConditionAssignment_1_2");
 					put(grammarAccess.getDataInterchangeExportFilterAccess().getHiddenpropertiesAssignment_2_1(), "rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyAssignment_0(), "rule__DataInterchangeFilterCondition__RefPropertyAssignment_0");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorAssignment_1(), "rule__DataInterchangeFilterCondition__OperatorAssignment_1");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getValueAssignment_2(), "rule__DataInterchangeFilterCondition__ValueAssignment_2");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2Assignment_3_0(), "rule__DataInterchangeFilterCondition__Operator2Assignment_3_0");
-					put(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionAssignment_3_1(), "rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyAssignment_0(), "rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorAssignment_1(), "rule__DataInterchangeExportFilterCondition__OperatorAssignment_1");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueAssignment_2(), "rule__DataInterchangeExportFilterCondition__ValueAssignment_2");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2Assignment_3_0(), "rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0");
+					put(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionAssignment_3_1(), "rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyAssignment_0(), "rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorAssignment_1(), "rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandAssignment_2(), "rule__DataInterchangeLookupFilterCondition__OperandAssignment_2");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2Assignment_3_0(), "rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0");
+					put(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionAssignment_3_1(), "rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1");
+					put(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyAssignment_1(), "rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1");
+					put(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueAssignment_1(), "rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1");
 					put(grammarAccess.getDataInterchangeExportHideAccess().getPropertyAssignment_1(), "rule__DataInterchangeExportHide__PropertyAssignment_1");
 					put(grammarAccess.getDataInterchangePredefinedExpressionAccess().getTargetPropertyAssignment_2(), "rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2");
 					put(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanAssignment_4(), "rule__DataInterchangePredefinedExpression__BeanAssignment_4");
@@ -446,6 +469,16 @@
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobFileExtensionAssignment_5_1(), "rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1");
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobPathAssignment_6_1(), "rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1");
 					put(grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypeAssignment_8(), "rule__DataInterchangeBlobMapping__MimeTypeAssignment_8");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyAssignment_2(), "rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthAssignment_4(), "rule__DataInterchangeFixedColumnMapping__LengthAssignment_4");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimAssignment_5_0_0(), "rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimAssignment_5_0_1(), "rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimAssignment_5_0_2(), "rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseAssignment_5_1_0(), "rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseAssignment_5_1_1(), "rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstAssignment_5_1_2(), "rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstAssignment_5_1_3(), "rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeAssignment_5_1_4(), "rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4");
 					put(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0(), "rule__XImportDeclaration__StaticAssignment_2_0_0");
 					put(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1(), "rule__XImportDeclaration__ExtensionAssignment_2_0_1");
 					put(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2(), "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2");
@@ -606,7 +639,9 @@
 					put(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), "rule__DataInterchangeFileXML__UnorderedGroup_3");
 					put(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), "rule__DataInterchangeFileCSV__UnorderedGroup_3");
 					put(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), "rule__DataInterchangeFileEDI__UnorderedGroup_3");
-					put(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), "rule__DataInterchangeLookup__UnorderedGroup_10");
+					put(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), "rule__DataInterchangeFileFixed__UnorderedGroup_3");
+					put(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), "rule__DataInterchangeLookup__UnorderedGroup_9");
+					put(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5");
 				}
 			};
 		}
diff --git a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.g b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.g
index 912251e..8e4caec 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.g
+++ b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.g
@@ -265,6 +265,31 @@
 	restoreStackSize(stackSize);
 }
 
+// Entry rule entryRuleDataInterchangeFileFixed
+entryRuleDataInterchangeFileFixed
+:
+{ before(grammarAccess.getDataInterchangeFileFixedRule()); }
+	 ruleDataInterchangeFileFixed
+{ after(grammarAccess.getDataInterchangeFileFixedRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeFileFixed
+ruleDataInterchangeFileFixed 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup()); }
+		(rule__DataInterchangeFileFixed__Group__0)
+		{ after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 // Entry rule entryRuleDataInterchangeBean
 entryRuleDataInterchangeBean
 :
@@ -515,25 +540,125 @@
 	restoreStackSize(stackSize);
 }
 
-// Entry rule entryRuleDataInterchangeFilterCondition
-entryRuleDataInterchangeFilterCondition
+// Entry rule entryRuleDataInterchangeExportFilterCondition
+entryRuleDataInterchangeExportFilterCondition
 :
-{ before(grammarAccess.getDataInterchangeFilterConditionRule()); }
-	 ruleDataInterchangeFilterCondition
-{ after(grammarAccess.getDataInterchangeFilterConditionRule()); } 
+{ before(grammarAccess.getDataInterchangeExportFilterConditionRule()); }
+	 ruleDataInterchangeExportFilterCondition
+{ after(grammarAccess.getDataInterchangeExportFilterConditionRule()); } 
 	 EOF 
 ;
 
-// Rule DataInterchangeFilterCondition
-ruleDataInterchangeFilterCondition 
+// Rule DataInterchangeExportFilterCondition
+ruleDataInterchangeExportFilterCondition 
 	@init {
 		int stackSize = keepStackSize();
 	}
 	:
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup()); }
-		(rule__DataInterchangeFilterCondition__Group__0)
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup()); }
+		(rule__DataInterchangeExportFilterCondition__Group__0)
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataInterchangeLookupFilterCondition
+entryRuleDataInterchangeLookupFilterCondition
+:
+{ before(grammarAccess.getDataInterchangeLookupFilterConditionRule()); }
+	 ruleDataInterchangeLookupFilterCondition
+{ after(grammarAccess.getDataInterchangeLookupFilterConditionRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeLookupFilterCondition
+ruleDataInterchangeLookupFilterCondition 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup()); }
+		(rule__DataInterchangeLookupFilterCondition__Group__0)
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperand
+entryRuleDataInterchangeLookupFilterOperand
+:
+{ before(grammarAccess.getDataInterchangeLookupFilterOperandRule()); }
+	 ruleDataInterchangeLookupFilterOperand
+{ after(grammarAccess.getDataInterchangeLookupFilterOperandRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeLookupFilterOperand
+ruleDataInterchangeLookupFilterOperand 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getAlternatives()); }
+		(rule__DataInterchangeLookupFilterOperand__Alternatives)
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getAlternatives()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperandProperty
+entryRuleDataInterchangeLookupFilterOperandProperty
+:
+{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); }
+	 ruleDataInterchangeLookupFilterOperandProperty
+{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeLookupFilterOperandProperty
+ruleDataInterchangeLookupFilterOperandProperty 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getGroup()); }
+		(rule__DataInterchangeLookupFilterOperandProperty__Group__0)
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperandString
+entryRuleDataInterchangeLookupFilterOperandString
+:
+{ before(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); }
+	 ruleDataInterchangeLookupFilterOperandString
+{ after(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeLookupFilterOperandString
+ruleDataInterchangeLookupFilterOperandString 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getGroup()); }
+		(rule__DataInterchangeLookupFilterOperandString__Group__0)
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getGroup()); }
 	)
 ;
 finally {
@@ -665,6 +790,31 @@
 	restoreStackSize(stackSize);
 }
 
+// Entry rule entryRuleDataInterchangeFixedColumnMapping
+entryRuleDataInterchangeFixedColumnMapping
+:
+{ before(grammarAccess.getDataInterchangeFixedColumnMappingRule()); }
+	 ruleDataInterchangeFixedColumnMapping
+{ after(grammarAccess.getDataInterchangeFixedColumnMappingRule()); } 
+	 EOF 
+;
+
+// Rule DataInterchangeFixedColumnMapping
+ruleDataInterchangeFixedColumnMapping 
+	@init {
+		int stackSize = keepStackSize();
+	}
+	:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getGroup()); }
+		(rule__DataInterchangeFixedColumnMapping__Group__0)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getGroup()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 // Entry rule entryRuleLFQN
 entryRuleLFQN
 :
@@ -2851,32 +3001,32 @@
 	restoreStackSize(stackSize);
 }
 
-// Rule ConditionAndOperator1
-ruleConditionAndOperator1
+// Rule Operator
+ruleOperator
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getAlternatives()); }
-		(rule__ConditionAndOperator1__Alternatives)
-		{ after(grammarAccess.getConditionAndOperator1Access().getAlternatives()); }
+		{ before(grammarAccess.getOperatorAccess().getAlternatives()); }
+		(rule__Operator__Alternatives)
+		{ after(grammarAccess.getOperatorAccess().getAlternatives()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-// Rule ConditionAndOperator2
-ruleConditionAndOperator2
+// Rule Junction
+ruleJunction
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getConditionAndOperator2Access().getAlternatives()); }
-		(rule__ConditionAndOperator2__Alternatives)
-		{ after(grammarAccess.getConditionAndOperator2Access().getAlternatives()); }
+		{ before(grammarAccess.getJunctionAccess().getAlternatives()); }
+		(rule__Junction__Alternatives)
+		{ after(grammarAccess.getJunctionAccess().getAlternatives()); }
 	)
 ;
 finally {
@@ -2905,6 +3055,12 @@
 		ruleDataInterchangeFileEDI
 		{ after(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileEDIParserRuleCall_2()); }
 	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3()); }
+		ruleDataInterchangeFileFixed
+		{ after(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3()); }
+	)
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -2952,6 +3108,27 @@
 	restoreStackSize(stackSize);
 }
 
+rule__DataInterchangeLookupFilterOperand__Alternatives
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0()); }
+		ruleDataInterchangeLookupFilterOperandString
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1()); }
+		ruleDataInterchangeLookupFilterOperandProperty
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__DataInterchangeMapping__Alternatives
 	@init {
 		int stackSize = keepStackSize();
@@ -2968,6 +3145,78 @@
 		ruleDataInterchangeBlobMapping
 		{ after(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeBlobMappingParserRuleCall_1()); }
 	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2()); }
+		ruleDataInterchangeFixedColumnMapping
+		{ after(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Alternatives_5_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimAssignment_5_0_0()); }
+		(rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimAssignment_5_0_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimAssignment_5_0_1()); }
+		(rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimAssignment_5_0_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimAssignment_5_0_2()); }
+		(rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimAssignment_5_0_2()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Alternatives_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseAssignment_5_1_0()); }
+		(rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseAssignment_5_1_0()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseAssignment_5_1_1()); }
+		(rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseAssignment_5_1_1()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstAssignment_5_1_2()); }
+		(rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstAssignment_5_1_2()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstAssignment_5_1_3()); }
+		(rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstAssignment_5_1_3()); }
+	)
+	|
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeAssignment_5_1_4()); }
+		(rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeAssignment_5_1_4()); }
+	)
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -4278,78 +4527,78 @@
 	restoreStackSize(stackSize);
 }
 
-rule__ConditionAndOperator1__Alternatives
+rule__Operator__Alternatives
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0()); }
+		{ before(grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0()); }
 		('=')
-		{ after(grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0()); }
+		{ after(grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1()); }
+		{ before(grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1()); }
 		('!=')
-		{ after(grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1()); }
+		{ after(grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2()); }
+		{ before(grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2()); }
 		('>')
-		{ after(grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2()); }
+		{ after(grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3()); }
+		{ before(grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3()); }
 		('>=')
-		{ after(grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3()); }
+		{ after(grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4()); }
+		{ before(grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4()); }
 		('<')
-		{ after(grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4()); }
+		{ after(grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5()); }
+		{ before(grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5()); }
 		('<=')
-		{ after(grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5()); }
+		{ after(grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6()); }
+		{ before(grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6()); }
 		('isnull')
-		{ after(grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6()); }
+		{ after(grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7()); }
+		{ before(grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7()); }
 		('isnotnull')
-		{ after(grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7()); }
+		{ after(grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__ConditionAndOperator2__Alternatives
+rule__Junction__Alternatives
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0()); }
+		{ before(grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0()); }
 		('and')
-		{ after(grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0()); }
+		{ after(grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0()); }
 	)
 	|
 	(
-		{ before(grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1()); }
+		{ before(grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1()); }
 		('or')
-		{ after(grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1()); }
+		{ after(grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1()); }
 	)
 ;
 finally {
@@ -6246,6 +6495,222 @@
 }
 
 
+rule__DataInterchangeFileFixed__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group__0__Impl
+	rule__DataInterchangeFileFixed__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0()); }
+	()
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group__1__Impl
+	rule__DataInterchangeFileFixed__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1()); }
+	'Fixed'
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group__2__Impl
+	rule__DataInterchangeFileFixed__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLAssignment_2()); }
+	(rule__DataInterchangeFileFixed__FileURLAssignment_2)
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3()); }
+	(rule__DataInterchangeFileFixed__UnorderedGroup_3)
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeFileFixed__Group_3_0__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group_3_0__0__Impl
+	rule__DataInterchangeFileFixed__Group_3_0__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_0__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0()); }
+	'encoding'
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group_3_0__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingAssignment_3_0_1()); }
+	(rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1)
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingAssignment_3_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeFileFixed__Group_3_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group_3_1__0__Impl
+	rule__DataInterchangeFileFixed__Group_3_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0()); }
+	'locale'
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFileFixed__Group_3_1__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__Group_3_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleAssignment_3_1_1()); }
+	(rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1)
+	{ after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleAssignment_3_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
 rule__DataInterchangeBean__Group__0
 	@init {
 		int stackSize = keepStackSize();
@@ -6468,7 +6933,6 @@
 	}
 :
 	rule__DataInterchangeBean__Group__8__Impl
-	rule__DataInterchangeBean__Group__9
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -6481,7 +6945,7 @@
 :
 (
 	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8()); }
-	(rule__DataInterchangeBean__Group_8__0)?
+	(rule__DataInterchangeBean__Group_8__0)
 	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8()); }
 )
 ;
@@ -6489,140 +6953,6 @@
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group__9
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group__9__Impl
-	rule__DataInterchangeBean__Group__10
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__9__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_9()); }
-	(rule__DataInterchangeBean__Group_9__0)?
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_9()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__10
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group__10__Impl
-	rule__DataInterchangeBean__Group__11
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__10__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_10()); }
-	(rule__DataInterchangeBean__Group_10__0)?
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_10()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__11
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group__11__Impl
-	rule__DataInterchangeBean__Group__12
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__11__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_11()); }
-	(rule__DataInterchangeBean__Group_11__0)?
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_11()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__12
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group__12__Impl
-	rule__DataInterchangeBean__Group__13
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__12__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_12()); }
-	(rule__DataInterchangeBean__Group_12__0)?
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_12()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__13
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group__13__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group__13__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_13()); }
-	(rule__DataInterchangeBean__Group_13__0)?
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_13()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
 
 rule__DataInterchangeBean__Group_3__0
 	@init {
@@ -6642,9 +6972,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0()); }
-	'nodeName'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0()); }
+	'referencedBy'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0()); }
 )
 ;
 finally {
@@ -6668,9 +6998,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_3_1()); }
-	(rule__DataInterchangeBean__NodeNameAssignment_3_1)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_3_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceAssignment_3_1()); }
+	(rule__DataInterchangeBean__RefDataSourceAssignment_3_1)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceAssignment_3_1()); }
 )
 ;
 finally {
@@ -6696,9 +7026,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0()); }
-	'createOn'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0()); }
+	'nodeName'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0()); }
 )
 ;
 finally {
@@ -6722,9 +7052,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_4_1()); }
-	(rule__DataInterchangeBean__ElementMapAssignment_4_1)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_4_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_4_1()); }
+	(rule__DataInterchangeBean__NodeNameAssignment_4_1)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_4_1()); }
 )
 ;
 finally {
@@ -6750,9 +7080,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_5_0()); }
-	(rule__DataInterchangeBean__MarkLatestImportAssignment_5_0)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_5_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0()); }
+	'createOn'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0()); }
 )
 ;
 finally {
@@ -6776,9 +7106,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_5_1()); }
-	(rule__DataInterchangeBean__LatestPropertyAssignment_5_1)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_5_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_5_1()); }
+	(rule__DataInterchangeBean__ElementMapAssignment_5_1)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_5_1()); }
 )
 ;
 finally {
@@ -6804,9 +7134,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_6_0()); }
-	(rule__DataInterchangeBean__MarkLatestExportAssignment_6_0)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_6_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_6_0()); }
+	(rule__DataInterchangeBean__MarkLatestImportAssignment_6_0)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_6_0()); }
 )
 ;
 finally {
@@ -6830,9 +7160,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_6_1()); }
-	(rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_6_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_6_1()); }
+	(rule__DataInterchangeBean__LatestPropertyAssignment_6_1)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_6_1()); }
 )
 ;
 finally {
@@ -6858,9 +7188,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0()); }
-	'expression'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_7_0()); }
+	(rule__DataInterchangeBean__MarkLatestExportAssignment_7_0)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_7_0()); }
 )
 ;
 finally {
@@ -6873,7 +7203,6 @@
 	}
 :
 	rule__DataInterchangeBean__Group_7__1__Impl
-	rule__DataInterchangeBean__Group_7__2
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -6885,62 +7214,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1()); }
-	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group_7__2
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group_7__2__Impl
-	rule__DataInterchangeBean__Group_7__3
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group_7__2__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_7_2()); }
-	(rule__DataInterchangeBean__ExpressionAssignment_7_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_7_2()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group_7__3
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeBean__Group_7__3__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__Group_7__3__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3()); }
-	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_7_1()); }
+	(rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_7_1()); }
 )
 ;
 finally {
@@ -6966,9 +7242,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0()); }
-	'lookup'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_0()); }
+	(rule__DataInterchangeBean__Group_8_0__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_0()); }
 )
 ;
 finally {
@@ -6993,9 +7269,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1()); }
-	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_1()); }
+	(rule__DataInterchangeBean__Group_8_1__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_1()); }
 )
 ;
 finally {
@@ -7020,9 +7296,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_2()); }
-	(rule__DataInterchangeBean__LookupAssignment_8_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_2()); }
+	(rule__DataInterchangeBean__Group_8_2__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_2()); }
 )
 ;
 finally {
@@ -7035,6 +7311,7 @@
 	}
 :
 	rule__DataInterchangeBean__Group_8__3__Impl
+	rule__DataInterchangeBean__Group_8__4
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -7046,9 +7323,89 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3()); }
-	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_3()); }
+	(rule__DataInterchangeBean__Group_8_3__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8__4__Impl
+	rule__DataInterchangeBean__Group_8__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_4()); }
+	(rule__DataInterchangeBean__Group_8_4__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8__5__Impl
+	rule__DataInterchangeBean__Group_8__6
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_5()); }
+	(rule__DataInterchangeBean__Group_8_5__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__6
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8__6__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8__6__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_6()); }
+	(rule__DataInterchangeBean__Group_8_6__0)?
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_6()); }
 )
 ;
 finally {
@@ -7056,107 +7413,323 @@
 }
 
 
-rule__DataInterchangeBean__Group_9__0
+rule__DataInterchangeBean__Group_8_0__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_9__0__Impl
-	rule__DataInterchangeBean__Group_9__1
+	rule__DataInterchangeBean__Group_8_0__0__Impl
+	rule__DataInterchangeBean__Group_8_0__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__0__Impl
+rule__DataInterchangeBean__Group_8_0__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0()); }
+	'expression'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_0__1__Impl
+	rule__DataInterchangeBean__Group_8_0__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1()); }
+	'{'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_0__2__Impl
+	rule__DataInterchangeBean__Group_8_0__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_8_0_2()); }
+	(rule__DataInterchangeBean__ExpressionAssignment_8_0_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_8_0_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_0__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_0__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3()); }
+	'}'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeBean__Group_8_1__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_1__0__Impl
+	rule__DataInterchangeBean__Group_8_1__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0()); }
+	'lookup'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_1__1__Impl
+	rule__DataInterchangeBean__Group_8_1__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1()); }
+	'{'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_1__2__Impl
+	rule__DataInterchangeBean__Group_8_1__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_1_2()); }
+	(rule__DataInterchangeBean__LookupAssignment_8_1_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_1_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_1__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_1__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3()); }
+	'}'
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeBean__Group_8_2__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeBean__Group_8_2__0__Impl
+	rule__DataInterchangeBean__Group_8_2__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__Group_8_2__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0()); }
 	'format'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__1
+rule__DataInterchangeBean__Group_8_2__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_9__1__Impl
-	rule__DataInterchangeBean__Group_9__2
+	rule__DataInterchangeBean__Group_8_2__1__Impl
+	rule__DataInterchangeBean__Group_8_2__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__1__Impl
+rule__DataInterchangeBean__Group_8_2__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1()); }
 	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__2
+rule__DataInterchangeBean__Group_8_2__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_9__2__Impl
-	rule__DataInterchangeBean__Group_9__3
+	rule__DataInterchangeBean__Group_8_2__2__Impl
+	rule__DataInterchangeBean__Group_8_2__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__2__Impl
+rule__DataInterchangeBean__Group_8_2__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_9_2()); }
-	(rule__DataInterchangeBean__FormatAssignment_9_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_9_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_8_2_2()); }
+	(rule__DataInterchangeBean__FormatAssignment_8_2_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_8_2_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__3
+rule__DataInterchangeBean__Group_8_2__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_9__3__Impl
+	rule__DataInterchangeBean__Group_8_2__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_9__3__Impl
+rule__DataInterchangeBean__Group_8_2__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3()); }
 	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3()); }
 )
 ;
 finally {
@@ -7164,107 +7737,107 @@
 }
 
 
-rule__DataInterchangeBean__Group_10__0
+rule__DataInterchangeBean__Group_8_3__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_10__0__Impl
-	rule__DataInterchangeBean__Group_10__1
+	rule__DataInterchangeBean__Group_8_3__0__Impl
+	rule__DataInterchangeBean__Group_8_3__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__0__Impl
+rule__DataInterchangeBean__Group_8_3__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0()); }
 	'expose'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__1
+rule__DataInterchangeBean__Group_8_3__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_10__1__Impl
-	rule__DataInterchangeBean__Group_10__2
+	rule__DataInterchangeBean__Group_8_3__1__Impl
+	rule__DataInterchangeBean__Group_8_3__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__1__Impl
+rule__DataInterchangeBean__Group_8_3__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1()); }
 	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__2
+rule__DataInterchangeBean__Group_8_3__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_10__2__Impl
-	rule__DataInterchangeBean__Group_10__3
+	rule__DataInterchangeBean__Group_8_3__2__Impl
+	rule__DataInterchangeBean__Group_8_3__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__2__Impl
+rule__DataInterchangeBean__Group_8_3__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_10_2()); }
-	(rule__DataInterchangeBean__ExportExposesAssignment_10_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_10_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_8_3_2()); }
+	(rule__DataInterchangeBean__ExportExposesAssignment_8_3_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_8_3_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__3
+rule__DataInterchangeBean__Group_8_3__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_10__3__Impl
+	rule__DataInterchangeBean__Group_8_3__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_10__3__Impl
+rule__DataInterchangeBean__Group_8_3__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3()); }
 	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3()); }
 )
 ;
 finally {
@@ -7272,107 +7845,107 @@
 }
 
 
-rule__DataInterchangeBean__Group_11__0
+rule__DataInterchangeBean__Group_8_4__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_11__0__Impl
-	rule__DataInterchangeBean__Group_11__1
+	rule__DataInterchangeBean__Group_8_4__0__Impl
+	rule__DataInterchangeBean__Group_8_4__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__0__Impl
+rule__DataInterchangeBean__Group_8_4__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0()); }
 	'mapping'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__1
+rule__DataInterchangeBean__Group_8_4__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_11__1__Impl
-	rule__DataInterchangeBean__Group_11__2
+	rule__DataInterchangeBean__Group_8_4__1__Impl
+	rule__DataInterchangeBean__Group_8_4__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__1__Impl
+rule__DataInterchangeBean__Group_8_4__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1()); }
 	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__2
+rule__DataInterchangeBean__Group_8_4__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_11__2__Impl
-	rule__DataInterchangeBean__Group_11__3
+	rule__DataInterchangeBean__Group_8_4__2__Impl
+	rule__DataInterchangeBean__Group_8_4__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__2__Impl
+rule__DataInterchangeBean__Group_8_4__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_11_2()); }
-	(rule__DataInterchangeBean__MappingsAssignment_11_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_11_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_8_4_2()); }
+	(rule__DataInterchangeBean__MappingsAssignment_8_4_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_8_4_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__3
+rule__DataInterchangeBean__Group_8_4__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_11__3__Impl
+	rule__DataInterchangeBean__Group_8_4__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_11__3__Impl
+rule__DataInterchangeBean__Group_8_4__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3()); }
 	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3()); }
 )
 ;
 finally {
@@ -7380,107 +7953,107 @@
 }
 
 
-rule__DataInterchangeBean__Group_12__0
+rule__DataInterchangeBean__Group_8_5__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_12__0__Impl
-	rule__DataInterchangeBean__Group_12__1
+	rule__DataInterchangeBean__Group_8_5__0__Impl
+	rule__DataInterchangeBean__Group_8_5__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__0__Impl
+rule__DataInterchangeBean__Group_8_5__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0()); }
 	'keys'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__1
+rule__DataInterchangeBean__Group_8_5__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_12__1__Impl
-	rule__DataInterchangeBean__Group_12__2
+	rule__DataInterchangeBean__Group_8_5__1__Impl
+	rule__DataInterchangeBean__Group_8_5__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__1__Impl
+rule__DataInterchangeBean__Group_8_5__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1()); }
 	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__2
+rule__DataInterchangeBean__Group_8_5__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_12__2__Impl
-	rule__DataInterchangeBean__Group_12__3
+	rule__DataInterchangeBean__Group_8_5__2__Impl
+	rule__DataInterchangeBean__Group_8_5__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__2__Impl
+rule__DataInterchangeBean__Group_8_5__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_12_2()); }
-	(rule__DataInterchangeBean__LookupKeysAssignment_12_2)*
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_12_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_8_5_2()); }
+	(rule__DataInterchangeBean__LookupKeysAssignment_8_5_2)*
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_8_5_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__3
+rule__DataInterchangeBean__Group_8_5__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_12__3__Impl
+	rule__DataInterchangeBean__Group_8_5__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_12__3__Impl
+rule__DataInterchangeBean__Group_8_5__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3()); }
 	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3()); }
 )
 ;
 finally {
@@ -7488,107 +8061,107 @@
 }
 
 
-rule__DataInterchangeBean__Group_13__0
+rule__DataInterchangeBean__Group_8_6__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_13__0__Impl
-	rule__DataInterchangeBean__Group_13__1
+	rule__DataInterchangeBean__Group_8_6__0__Impl
+	rule__DataInterchangeBean__Group_8_6__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__0__Impl
+rule__DataInterchangeBean__Group_8_6__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0()); }
 	'exportFilter'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__1
+rule__DataInterchangeBean__Group_8_6__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_13__1__Impl
-	rule__DataInterchangeBean__Group_13__2
+	rule__DataInterchangeBean__Group_8_6__1__Impl
+	rule__DataInterchangeBean__Group_8_6__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__1__Impl
+rule__DataInterchangeBean__Group_8_6__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1()); }
 	'{'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__2
+rule__DataInterchangeBean__Group_8_6__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_13__2__Impl
-	rule__DataInterchangeBean__Group_13__3
+	rule__DataInterchangeBean__Group_8_6__2__Impl
+	rule__DataInterchangeBean__Group_8_6__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__2__Impl
+rule__DataInterchangeBean__Group_8_6__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_13_2()); }
-	(rule__DataInterchangeBean__ExportFilterAssignment_13_2)
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_13_2()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_8_6_2()); }
+	(rule__DataInterchangeBean__ExportFilterAssignment_8_6_2)
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_8_6_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__3
+rule__DataInterchangeBean__Group_8_6__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeBean__Group_13__3__Impl
+	rule__DataInterchangeBean__Group_8_6__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__Group_13__3__Impl
+rule__DataInterchangeBean__Group_8_6__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3()); }
+	{ before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3()); }
 	'}'
-	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3()); }
+	{ after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3()); }
 )
 ;
 finally {
@@ -7776,9 +8349,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3()); }
-	'on'
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3()); }
+	'in'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3()); }
 )
 ;
 finally {
@@ -7830,9 +8403,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getGroup_5()); }
-	(rule__DataInterchangeLookup__Group_5__0)?
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getGroup_5()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5()); }
+	'createOn'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5()); }
 )
 ;
 finally {
@@ -7857,9 +8430,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6()); }
-	'with'
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_6()); }
+	(rule__DataInterchangeLookup__ElementMapAssignment_6)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_6()); }
 )
 ;
 finally {
@@ -7884,9 +8457,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_7()); }
-	(rule__DataInterchangeLookup__QueryPropertyAssignment_7)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_7()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7()); }
+	'mapFrom'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7()); }
 )
 ;
 finally {
@@ -7911,9 +8484,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getGroup_8()); }
-	(rule__DataInterchangeLookup__Group_8__0)?
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getGroup_8()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_8()); }
+	(rule__DataInterchangeLookup__DataMapAssignment_8)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_8()); }
 )
 ;
 finally {
@@ -7938,9 +8511,9 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getGroup_9()); }
-	(rule__DataInterchangeLookup__Group_9__0)?
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getGroup_9()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9()); }
+	(rule__DataInterchangeLookup__UnorderedGroup_9)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9()); }
 )
 ;
 finally {
@@ -7953,6 +8526,7 @@
 	}
 :
 	rule__DataInterchangeLookup__Group__10__Impl
+	rule__DataInterchangeLookup__Group__11
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -7964,171 +8538,251 @@
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10()); }
-	(rule__DataInterchangeLookup__UnorderedGroup_10)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__DataInterchangeLookup__Group_5__0
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeLookup__Group_5__0__Impl
-	rule__DataInterchangeLookup__Group_5__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_5__0__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0()); }
-	'createOn'
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_5__1
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeLookup__Group_5__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_5__1__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_5_1()); }
-	(rule__DataInterchangeLookup__ElementMapAssignment_5_1)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_5_1()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__DataInterchangeLookup__Group_8__0
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeLookup__Group_8__0__Impl
-	rule__DataInterchangeLookup__Group_8__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_8__0__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_8_0()); }
-	(rule__DataInterchangeLookup__CachedAssignment_8_0)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_8_0()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_8__1
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeLookup__Group_8__1__Impl
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_8__1__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_8_1()); }
-	(rule__DataInterchangeLookup__CacheSizeAssignment_8_1)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_8_1()); }
-)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-
-rule__DataInterchangeLookup__Group_9__0
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	rule__DataInterchangeLookup__Group_9__0__Impl
-	rule__DataInterchangeLookup__Group_9__1
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__Group_9__0__Impl
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-(
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10()); }
 	'mapTo'
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0()); }
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__Group_9__1
+rule__DataInterchangeLookup__Group__11
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeLookup__Group_9__1__Impl
+	rule__DataInterchangeLookup__Group__11__Impl
+	rule__DataInterchangeLookup__Group__12
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__Group_9__1__Impl
+rule__DataInterchangeLookup__Group__11__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_9_1()); }
-	(rule__DataInterchangeLookup__DataMapAssignment_9_1)
-	{ after(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_9_1()); }
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_11()); }
+	(rule__DataInterchangeLookup__QueryPropertyAssignment_11)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_11()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group__12
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group__12__Impl
+	rule__DataInterchangeLookup__Group__13
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group__12__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getGroup_12()); }
+	(rule__DataInterchangeLookup__Group_12__0)?
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getGroup_12()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group__13
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group__13__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group__13__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getGroup_13()); }
+	(rule__DataInterchangeLookup__Group_13__0)?
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getGroup_13()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookup__Group_12__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_12__0__Impl
+	rule__DataInterchangeLookup__Group_12__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_12__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_12_0()); }
+	(rule__DataInterchangeLookup__CachedAssignment_12_0)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_12_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_12__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_12__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_12__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_12_1()); }
+	(rule__DataInterchangeLookup__CacheSizeAssignment_12_1)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_12_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookup__Group_13__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_13__0__Impl
+	rule__DataInterchangeLookup__Group_13__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0()); }
+	'where'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_13__1__Impl
+	rule__DataInterchangeLookup__Group_13__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1()); }
+	'{'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_13__2__Impl
+	rule__DataInterchangeLookup__Group_13__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getConditionAssignment_13_2()); }
+	(rule__DataInterchangeLookup__ConditionAssignment_13_2)
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getConditionAssignment_13_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__Group_13__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__Group_13__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3()); }
+	'}'
+	{ after(grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3()); }
 )
 ;
 finally {
@@ -9270,107 +9924,107 @@
 }
 
 
-rule__DataInterchangeFilterCondition__Group__0
+rule__DataInterchangeExportFilterCondition__Group__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group__0__Impl
-	rule__DataInterchangeFilterCondition__Group__1
+	rule__DataInterchangeExportFilterCondition__Group__0__Impl
+	rule__DataInterchangeExportFilterCondition__Group__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__0__Impl
+rule__DataInterchangeExportFilterCondition__Group__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyAssignment_0()); }
-	(rule__DataInterchangeFilterCondition__RefPropertyAssignment_0)
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyAssignment_0()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyAssignment_0()); }
+	(rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0)
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyAssignment_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__1
+rule__DataInterchangeExportFilterCondition__Group__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group__1__Impl
-	rule__DataInterchangeFilterCondition__Group__2
+	rule__DataInterchangeExportFilterCondition__Group__1__Impl
+	rule__DataInterchangeExportFilterCondition__Group__2
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__1__Impl
+rule__DataInterchangeExportFilterCondition__Group__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorAssignment_1()); }
-	(rule__DataInterchangeFilterCondition__OperatorAssignment_1)
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorAssignment_1()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorAssignment_1()); }
+	(rule__DataInterchangeExportFilterCondition__OperatorAssignment_1)
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorAssignment_1()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__2
+rule__DataInterchangeExportFilterCondition__Group__2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group__2__Impl
-	rule__DataInterchangeFilterCondition__Group__3
+	rule__DataInterchangeExportFilterCondition__Group__2__Impl
+	rule__DataInterchangeExportFilterCondition__Group__3
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__2__Impl
+rule__DataInterchangeExportFilterCondition__Group__2__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getValueAssignment_2()); }
-	(rule__DataInterchangeFilterCondition__ValueAssignment_2)?
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getValueAssignment_2()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueAssignment_2()); }
+	(rule__DataInterchangeExportFilterCondition__ValueAssignment_2)?
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueAssignment_2()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__3
+rule__DataInterchangeExportFilterCondition__Group__3
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group__3__Impl
+	rule__DataInterchangeExportFilterCondition__Group__3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group__3__Impl
+rule__DataInterchangeExportFilterCondition__Group__3__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup_3()); }
-	(rule__DataInterchangeFilterCondition__Group_3__0)?
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup_3()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup_3()); }
+	(rule__DataInterchangeExportFilterCondition__Group_3__0)?
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup_3()); }
 )
 ;
 finally {
@@ -9378,53 +10032,323 @@
 }
 
 
-rule__DataInterchangeFilterCondition__Group_3__0
+rule__DataInterchangeExportFilterCondition__Group_3__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group_3__0__Impl
-	rule__DataInterchangeFilterCondition__Group_3__1
+	rule__DataInterchangeExportFilterCondition__Group_3__0__Impl
+	rule__DataInterchangeExportFilterCondition__Group_3__1
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group_3__0__Impl
+rule__DataInterchangeExportFilterCondition__Group_3__0__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2Assignment_3_0()); }
-	(rule__DataInterchangeFilterCondition__Operator2Assignment_3_0)
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2Assignment_3_0()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2Assignment_3_0()); }
+	(rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0)
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2Assignment_3_0()); }
 )
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group_3__1
+rule__DataInterchangeExportFilterCondition__Group_3__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeFilterCondition__Group_3__1__Impl
+	rule__DataInterchangeExportFilterCondition__Group_3__1__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Group_3__1__Impl
+rule__DataInterchangeExportFilterCondition__Group_3__1__Impl
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 (
-	{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionAssignment_3_1()); }
-	(rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1)
-	{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionAssignment_3_1()); }
+	{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionAssignment_3_1()); }
+	(rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1)
+	{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookupFilterCondition__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group__0__Impl
+	rule__DataInterchangeLookupFilterCondition__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyAssignment_0()); }
+	(rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0)
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyAssignment_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group__1__Impl
+	rule__DataInterchangeLookupFilterCondition__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorAssignment_1()); }
+	(rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1)
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group__2__Impl
+	rule__DataInterchangeLookupFilterCondition__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandAssignment_2()); }
+	(rule__DataInterchangeLookupFilterCondition__OperandAssignment_2)?
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group__3__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup_3()); }
+	(rule__DataInterchangeLookupFilterCondition__Group_3__0)?
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookupFilterCondition__Group_3__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl
+	rule__DataInterchangeLookupFilterCondition__Group_3__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2Assignment_3_0()); }
+	(rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0)
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2Assignment_3_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group_3__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionAssignment_3_1()); }
+	(rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1)
+	{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionAssignment_3_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookupFilterOperandProperty__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl
+	rule__DataInterchangeLookupFilterOperandProperty__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0()); }
+	()
+	{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandProperty__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyAssignment_1()); }
+	(rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1)
+	{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyAssignment_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeLookupFilterOperandString__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterOperandString__Group__0__Impl
+	rule__DataInterchangeLookupFilterOperandString__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandString__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0()); }
+	()
+	{ after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandString__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookupFilterOperandString__Group__1__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandString__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueAssignment_1()); }
+	(rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1)
+	{ after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueAssignment_1()); }
 )
 ;
 finally {
@@ -10161,6 +11085,168 @@
 }
 
 
+rule__DataInterchangeFixedColumnMapping__Group__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__0__Impl
+	rule__DataInterchangeFixedColumnMapping__Group__1
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__0__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0()); }
+	()
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__1__Impl
+	rule__DataInterchangeFixedColumnMapping__Group__2
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__1__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1()); }
+	'mapFixedLength'
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__2__Impl
+	rule__DataInterchangeFixedColumnMapping__Group__3
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__2__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyAssignment_2()); }
+	(rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2)
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyAssignment_2()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__3__Impl
+	rule__DataInterchangeFixedColumnMapping__Group__4
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__3__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3()); }
+	'length'
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__4__Impl
+	rule__DataInterchangeFixedColumnMapping__Group__5
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__4__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthAssignment_4()); }
+	(rule__DataInterchangeFixedColumnMapping__LengthAssignment_4)
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthAssignment_4()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__5
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__Group__5__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__Group__5__Impl
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+(
+	{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5()); }
+	(rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5)
+	{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5()); }
+)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
 rule__LFQN__Group__0
 	@init {
 		int stackSize = keepStackSize();
@@ -23573,21 +24659,21 @@
 }
 
 
-rule__DataInterchangeLookup__UnorderedGroup_10
+rule__DataInterchangeFileFixed__UnorderedGroup_3
 	@init {
 		int stackSize = keepStackSize();
-		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
 	}
 :
-	rule__DataInterchangeLookup__UnorderedGroup_10__0
+	rule__DataInterchangeFileFixed__UnorderedGroup_3__0
 	?
 ;
 finally {
-	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__UnorderedGroup_10__Impl
+rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl
 	@init {
 		int stackSize = keepStackSize();
 		boolean selected = false;
@@ -23595,47 +24681,32 @@
 :
 		(
 		( 
-			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0)}?=>(
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0)}?=>(
 				{
-					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0);
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0);
 				}
 				{
 					selected = true;
 				}
 				(
-					{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0()); }
-					(rule__DataInterchangeLookup__AllowNoResultAssignment_10_0)
-					{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0()); }
+					{ before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0()); }
+					(rule__DataInterchangeFileFixed__Group_3_0__0)
+					{ after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0()); }
 				)
 			)
 		)|
 		( 
-			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1)}?=>(
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1)}?=>(
 				{
-					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1);
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1);
 				}
 				{
 					selected = true;
 				}
 				(
-					{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1()); }
-					(rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1)
-					{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1()); }
-				)
-			)
-		)|
-		( 
-			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2)}?=>(
-				{
-					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2);
-				}
-				{
-					selected = true;
-				}
-				(
-					{ before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_10_2()); }
-					(rule__DataInterchangeLookup__MarkerPathAssignment_10_2)
-					{ after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_10_2()); }
+					{ before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_1()); }
+					(rule__DataInterchangeFileFixed__Group_3_1__0)
+					{ after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_1()); }
 				)
 			)
 		)
@@ -23643,40 +24714,194 @@
 ;
 finally {
 	if (selected)
-		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__UnorderedGroup_10__0
+rule__DataInterchangeFileFixed__UnorderedGroup_3__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeLookup__UnorderedGroup_10__Impl
-	rule__DataInterchangeLookup__UnorderedGroup_10__1?
+	rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl
+	rule__DataInterchangeFileFixed__UnorderedGroup_3__1?
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__UnorderedGroup_10__1
+rule__DataInterchangeFileFixed__UnorderedGroup_3__1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeLookup__UnorderedGroup_10__Impl
-	rule__DataInterchangeLookup__UnorderedGroup_10__2?
+	rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__UnorderedGroup_10__2
+
+rule__DataInterchangeLookup__UnorderedGroup_9
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+	}
+:
+	rule__DataInterchangeLookup__UnorderedGroup_9__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__UnorderedGroup_9__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0()); }
+					(rule__DataInterchangeLookup__AllowNoResultAssignment_9_0)
+					{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_9_1()); }
+					(rule__DataInterchangeLookup__MarkerPathAssignment_9_1)
+					{ after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_9_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__UnorderedGroup_9__0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
-	rule__DataInterchangeLookup__UnorderedGroup_10__Impl
+	rule__DataInterchangeLookup__UnorderedGroup_9__Impl
+	rule__DataInterchangeLookup__UnorderedGroup_9__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__UnorderedGroup_9__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeLookup__UnorderedGroup_9__Impl
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+
+rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5
+	@init {
+		int stackSize = keepStackSize();
+		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0
+	?
+;
+finally {
+	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl
+	@init {
+		int stackSize = keepStackSize();
+		boolean selected = false;
+	}
+:
+		(
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0()); }
+					(rule__DataInterchangeFixedColumnMapping__Alternatives_5_0)
+					{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0()); }
+				)
+			)
+		)|
+		( 
+			{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1)}?=>(
+				{
+					getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1);
+				}
+				{
+					selected = true;
+				}
+				(
+					{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_1()); }
+					(rule__DataInterchangeFixedColumnMapping__Alternatives_5_1)
+					{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_1()); }
+				)
+			)
+		)
+		)
+;
+finally {
+	if (selected)
+		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl
+	rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1?
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl
 ;
 finally {
 	restoreStackSize(stackSize);
@@ -24206,6 +25431,51 @@
 	restoreStackSize(stackSize);
 }
 
+rule__DataInterchangeFileFixed__FileURLAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__DataInterchangeBean__EntityAssignment_2
 	@init {
 		int stackSize = keepStackSize();
@@ -24225,211 +25495,230 @@
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__NodeNameAssignment_3_1
+rule__DataInterchangeBean__RefDataSourceAssignment_3_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0()); }
-		RULE_STRING
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__ElementMapAssignment_4_1
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0()); }
-		RULE_STRING
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeBean__MarkLatestImportAssignment_5_0
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); }
+			{ before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1()); }
+		)
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__NodeNameAssignment_4_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__ElementMapAssignment_5_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeBean__MarkLatestImportAssignment_6_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); }
 			'latestImport'
-			{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); }
+			{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); }
 		)
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__LatestPropertyAssignment_5_1
+rule__DataInterchangeBean__LatestPropertyAssignment_6_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1()); }
+			{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); }
 			RULE_ID
-			{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1()); }
+			{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); }
 		)
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__MarkLatestExportAssignment_6_0
+rule__DataInterchangeBean__MarkLatestExportAssignment_7_0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); }
+			{ before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); }
 			'latestExport'
-			{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); }
+			{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); }
 		)
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1
+rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); }
+			{ before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1()); }
 			RULE_ID
-			{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); }
+			{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1()); }
 		)
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__ExpressionAssignment_7_2
+rule__DataInterchangeBean__ExpressionAssignment_8_0_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0()); }
 		ruleDataInterchangeExpression
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__LookupAssignment_8_2
+rule__DataInterchangeBean__LookupAssignment_8_1_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0()); }
 		ruleDataInterchangeLookup
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__FormatAssignment_9_2
+rule__DataInterchangeBean__FormatAssignment_8_2_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0()); }
 		ruleDataInterchangeFormat
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__ExportExposesAssignment_10_2
+rule__DataInterchangeBean__ExportExposesAssignment_8_3_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0()); }
 		ruleDataInterchangeExpose
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__MappingsAssignment_11_2
+rule__DataInterchangeBean__MappingsAssignment_8_4_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0()); }
 		ruleDataInterchangeMapping
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__LookupKeysAssignment_12_2
+rule__DataInterchangeBean__LookupKeysAssignment_8_5_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0()); }
 		ruleDataInterchangeKey
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeBean__ExportFilterAssignment_13_2
+rule__DataInterchangeBean__ExportFilterAssignment_8_6_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0()); }
+		{ before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0()); }
 		ruleDataInterchangeExportFilter
-		{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0()); }
+		{ after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0()); }
 	)
 ;
 finally {
@@ -24493,136 +25782,132 @@
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__ElementMapAssignment_5_1
+rule__DataInterchangeLookup__ElementMapAssignment_6
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); }
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0()); }
 		RULE_STRING
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); }
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__QueryPropertyAssignment_7
+rule__DataInterchangeLookup__DataMapAssignment_8
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0()); }
-		(
-			{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1()); }
-			RULE_ID
-			{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1()); }
-		)
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__CachedAssignment_8_0
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); }
-		(
-			{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); }
-			'cacheSize'
-			{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); }
-		)
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__CacheSizeAssignment_8_1
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0()); }
-		RULE_INT
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__DataMapAssignment_9_1
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0()); }
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0()); }
 		RULE_STRING
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0()); }
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__AllowNoResultAssignment_10_0
+rule__DataInterchangeLookup__AllowNoResultAssignment_9_0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); }
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); }
+			{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); }
 			'allowNoResult'
-			{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); }
+			{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); }
 		)
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); }
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1
+rule__DataInterchangeLookup__MarkerPathAssignment_9_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); }
-		(
-			{ before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); }
-			'allowNonuniqueResult'
-			{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); }
-		)
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); }
-	)
-;
-finally {
-	restoreStackSize(stackSize);
-}
-
-rule__DataInterchangeLookup__MarkerPathAssignment_10_2
-	@init {
-		int stackSize = keepStackSize();
-	}
-:
-	(
-		{ before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0()); }
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0()); }
 		ruleDataInterchangeMarkerPath
-		{ after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0()); }
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__QueryPropertyAssignment_11
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1()); }
+		)
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__CachedAssignment_12_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); }
+			'cacheSize'
+			{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__CacheSizeAssignment_12_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookup__ConditionAssignment_13_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0()); }
+		ruleDataInterchangeLookupFilterCondition
+		{ after(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0()); }
 	)
 ;
 finally {
@@ -24851,9 +26136,9 @@
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0()); }
-		ruleDataInterchangeFilterCondition
-		{ after(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0()); }
+		ruleDataInterchangeExportFilterCondition
+		{ after(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0()); }
 	)
 ;
 finally {
@@ -24875,79 +26160,192 @@
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__RefPropertyAssignment_0
+rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
 		(
-			{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
+			{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
 			RULE_ID
-			{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
+			{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
 		)
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__OperatorAssignment_1
+rule__DataInterchangeExportFilterCondition__OperatorAssignment_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0()); }
-		ruleConditionAndOperator1
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); }
+		ruleOperator
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__ValueAssignment_2
+rule__DataInterchangeExportFilterCondition__ValueAssignment_2
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); }
 		RULE_STRING
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); }
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__Operator2Assignment_3_0
+rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0()); }
-		ruleConditionAndOperator2
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); }
+		ruleJunction
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); }
 	)
 ;
 finally {
 	restoreStackSize(stackSize);
 }
 
-rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1
+rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1
 	@init {
 		int stackSize = keepStackSize();
 	}
 :
 	(
-		{ before(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0()); }
-		ruleDataInterchangeFilterCondition
-		{ after(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0()); }
+		{ before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0()); }
+		ruleDataInterchangeExportFilterCondition
+		{ after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); }
+		)
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); }
+		ruleOperator
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__OperandAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0()); }
+		ruleDataInterchangeLookupFilterOperand
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); }
+		ruleJunction
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0()); }
+		ruleDataInterchangeLookupFilterCondition
+		{ after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1()); }
+		)
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0()); }
+		RULE_STRING
+		{ after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0()); }
 	)
 ;
 finally {
@@ -25135,6 +26533,192 @@
 	restoreStackSize(stackSize);
 }
 
+rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+			RULE_ID
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__LengthAssignment_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0()); }
+		RULE_INT
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); }
+			'trim'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); }
+			'leftTrim'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); }
+			'rightTrim'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); }
+			'lowerCase'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); }
+			'upperCase'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); }
+			'capitalizeFirstWord'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); }
+			'uncapitalizeFirstWord'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
+rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4
+	@init {
+		int stackSize = keepStackSize();
+	}
+:
+	(
+		{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); }
+		(
+			{ before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); }
+			'capitalize'
+			{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); }
+		)
+		{ after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); }
+	)
+;
+finally {
+	restoreStackSize(stackSize);
+}
+
 rule__XImportDeclaration__StaticAssignment_2_0_0
 	@init {
 		int stackSize = keepStackSize();
diff --git a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.tokens b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.tokens
index eee0df7..2293b58 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.tokens
+++ b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSL.tokens
@@ -1,20 +1,20 @@
 '!'=40
 '!='=22
 '!=='=24
-'#'=126
+'#'=132
 '%'=39
 '%='=20
 '&&'=15
-'&'=147
-'('=122
-')'=123
+'&'=153
+'('=128
+')'=129
 '*'=36
 '**'=37
 '*='=18
 '+'=34
 '++'=41
 '+='=16
-','=124
+','=130
 '-'=35
 '--'=42
 '-='=17
@@ -24,9 +24,9 @@
 '..<'=29
 '/'=38
 '/='=19
-':'=132
-'::'=162
-';'=120
+':'=138
+'::'=175
+';'=126
 '<'=27
 '<='=68
 '<>'=32
@@ -36,14 +36,15 @@
 '=>'=31
 '>'=26
 '>='=25
-'?'=146
-'?.'=163
+'?'=152
+'?.'=176
 '?:'=33
-'@'=121
+'@'=127
 'CSV'=84
 'Date'=60
 'EDI'=88
 'ExecuteContext'=64
+'Fixed'=90
 'Milliseconds'=61
 'Nanoseconds'=62
 'NowDate'=57
@@ -51,73 +52,80 @@
 'StartDate'=58
 'UniversallyUniqueIdentifier'=59
 'XML'=81
-'['=127
-']'=125
-'allowNoResult'=158
-'allowNonuniqueResult'=159
+'['=133
+']'=131
+'allowNoResult'=163
 'and'=71
-'as'=115
-'assign'=114
-'cacheSize'=157
-'case'=134
-'catch'=145
-'coding'=107
-'copy'=108
-'createOn'=92
-'default'=133
-'deleteFileAfterImport'=151
+'as'=119
+'assign'=117
+'cacheSize'=164
+'capitalize'=173
+'capitalizeFirstWord'=171
+'case'=140
+'catch'=151
+'coding'=110
+'copy'=111
+'createOn'=94
+'default'=139
+'deleteFileAfterImport'=157
 'delimiter'=85
-'describedBy'=148
-'do'=136
+'describedBy'=154
+'do'=142
 'elementSize'=80
-'else'=130
+'else'=136
 'encoding'=82
-'entity'=90
-'exportFilter'=99
-'expose'=96
-'expression'=93
+'entity'=91
+'exportFilter'=101
+'expose'=98
+'expression'=95
 'extends'=45
 'extension'=48
 'false'=50
 'file'=78
-'finally'=143
-'for'=101
-'format'=95
-'from'=109
+'finally'=149
+'for'=103
+'format'=97
+'from'=112
 'group'=76
-'hide'=113
-'if'=129
+'hide'=116
+'if'=135
 'import'=47
-'indent'=153
-'instanceof'=128
+'in'=104
+'indent'=159
+'instanceof'=134
 'interchange'=77
 'isnotnull'=70
 'isnull'=69
 'jpg'=52
-'key'=100
-'keys'=98
-'latestExport'=156
-'latestImport'=155
+'key'=102
+'keys'=100
+'latestExport'=162
+'latestImport'=161
+'leftTrim'=167
+'length'=125
 'locale'=83
-'lookup'=94
-'map'=116
-'mapBlob'=118
-'mapByAttribute'=152
-'mapTo'=104
-'mapping'=97
+'lookup'=96
+'lowerCase'=169
+'map'=120
+'mapBlob'=122
+'mapByAttribute'=158
+'mapFixedLength'=124
+'mapFrom'=105
+'mapTo'=106
+'mapping'=99
 'mappingModel'=89
-'markedBy'=160
-'markerEntity'=106
-'markerPath'=105
+'markedBy'=165
+'markerEntity'=109
+'markerPath'=108
 'merge'=66
-'mimeType'=119
+'mimeType'=123
 'mpeg'=54
-'new'=137
-'nodeName'=91
-'ns'=161
-'null'=138
+'new'=143
+'nodeName'=93
+'ns'=174
+'null'=144
 'octet-stream'=55
-'on'=102
+'on'=115
 'or'=72
 'package'=73
 'path'=79
@@ -125,31 +133,36 @@
 'persist'=65
 'plain'=51
 'png'=53
-'property'=110
+'property'=113
 'quoteCharacter'=86
-'ref'=111
+'ref'=114
+'referencedBy'=92
 'remove'=67
-'report'=150
-'return'=141
+'report'=156
+'return'=147
+'rightTrim'=168
 'skipLines'=87
 'static'=46
 'super'=49
-'switch'=131
-'synchronized'=144
-'throw'=140
-'to'=117
-'true'=166
-'try'=142
-'typeof'=139
+'switch'=137
+'synchronized'=150
+'throw'=146
+'to'=121
+'trim'=166
+'true'=179
+'try'=148
+'typeof'=145
+'uncapitalizeFirstWord'=172
+'upperCase'=170
 'val'=44
-'validate'=154
-'var'=165
-'vectorName'=149
-'where'=112
-'while'=135
-'with'=103
+'validate'=160
+'var'=178
+'vectorName'=155
+'where'=107
+'while'=141
+'with'=118
 '{'=74
-'|'=164
+'|'=177
 '||'=14
 '}'=75
 RULE_ANY_OTHER=12
@@ -231,7 +244,20 @@
 T__164=164
 T__165=165
 T__166=166
+T__167=167
+T__168=168
+T__169=169
 T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
 T__17=17
 T__18=18
 T__19=19
diff --git a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLLexer.java b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLLexer.java
index 511367b..ab892fe 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLLexer.java
+++ b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLLexer.java
@@ -60,6 +60,8 @@
     public static final int T__127=127;
     public static final int T__166=166;
     public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
     public static final int T__162=162;
     public static final int T__161=161;
     public static final int T__164=164;
@@ -118,6 +120,16 @@
     public static final int T__96=96;
     public static final int T__97=97;
     public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
     public static final int RULE_DECIMAL=8;
     public static final int T__26=26;
     public static final int T__27=27;
@@ -127,6 +139,7 @@
     public static final int T__23=23;
     public static final int T__24=24;
     public static final int T__25=25;
+    public static final int T__169=169;
     public static final int T__20=20;
     public static final int T__21=21;
     public static final int T__122=122;
@@ -1800,10 +1813,10 @@
         try {
             int _type = T__90;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:88:7: ( 'entity' )
-            // InternalDataDSL.g:88:9: 'entity'
+            // InternalDataDSL.g:88:7: ( 'Fixed' )
+            // InternalDataDSL.g:88:9: 'Fixed'
             {
-            match("entity"); 
+            match("Fixed"); 
 
 
             }
@@ -1821,10 +1834,10 @@
         try {
             int _type = T__91;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:89:7: ( 'nodeName' )
-            // InternalDataDSL.g:89:9: 'nodeName'
+            // InternalDataDSL.g:89:7: ( 'entity' )
+            // InternalDataDSL.g:89:9: 'entity'
             {
-            match("nodeName"); 
+            match("entity"); 
 
 
             }
@@ -1842,10 +1855,10 @@
         try {
             int _type = T__92;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:90:7: ( 'createOn' )
-            // InternalDataDSL.g:90:9: 'createOn'
+            // InternalDataDSL.g:90:7: ( 'referencedBy' )
+            // InternalDataDSL.g:90:9: 'referencedBy'
             {
-            match("createOn"); 
+            match("referencedBy"); 
 
 
             }
@@ -1863,10 +1876,10 @@
         try {
             int _type = T__93;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:91:7: ( 'expression' )
-            // InternalDataDSL.g:91:9: 'expression'
+            // InternalDataDSL.g:91:7: ( 'nodeName' )
+            // InternalDataDSL.g:91:9: 'nodeName'
             {
-            match("expression"); 
+            match("nodeName"); 
 
 
             }
@@ -1884,10 +1897,10 @@
         try {
             int _type = T__94;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:92:7: ( 'lookup' )
-            // InternalDataDSL.g:92:9: 'lookup'
+            // InternalDataDSL.g:92:7: ( 'createOn' )
+            // InternalDataDSL.g:92:9: 'createOn'
             {
-            match("lookup"); 
+            match("createOn"); 
 
 
             }
@@ -1905,10 +1918,10 @@
         try {
             int _type = T__95;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:93:7: ( 'format' )
-            // InternalDataDSL.g:93:9: 'format'
+            // InternalDataDSL.g:93:7: ( 'expression' )
+            // InternalDataDSL.g:93:9: 'expression'
             {
-            match("format"); 
+            match("expression"); 
 
 
             }
@@ -1926,10 +1939,10 @@
         try {
             int _type = T__96;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:94:7: ( 'expose' )
-            // InternalDataDSL.g:94:9: 'expose'
+            // InternalDataDSL.g:94:7: ( 'lookup' )
+            // InternalDataDSL.g:94:9: 'lookup'
             {
-            match("expose"); 
+            match("lookup"); 
 
 
             }
@@ -1947,10 +1960,10 @@
         try {
             int _type = T__97;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:95:7: ( 'mapping' )
-            // InternalDataDSL.g:95:9: 'mapping'
+            // InternalDataDSL.g:95:7: ( 'format' )
+            // InternalDataDSL.g:95:9: 'format'
             {
-            match("mapping"); 
+            match("format"); 
 
 
             }
@@ -1968,10 +1981,10 @@
         try {
             int _type = T__98;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:96:7: ( 'keys' )
-            // InternalDataDSL.g:96:9: 'keys'
+            // InternalDataDSL.g:96:7: ( 'expose' )
+            // InternalDataDSL.g:96:9: 'expose'
             {
-            match("keys"); 
+            match("expose"); 
 
 
             }
@@ -1989,10 +2002,10 @@
         try {
             int _type = T__99;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:97:7: ( 'exportFilter' )
-            // InternalDataDSL.g:97:9: 'exportFilter'
+            // InternalDataDSL.g:97:7: ( 'mapping' )
+            // InternalDataDSL.g:97:9: 'mapping'
             {
-            match("exportFilter"); 
+            match("mapping"); 
 
 
             }
@@ -2010,10 +2023,10 @@
         try {
             int _type = T__100;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:98:8: ( 'key' )
-            // InternalDataDSL.g:98:10: 'key'
+            // InternalDataDSL.g:98:8: ( 'keys' )
+            // InternalDataDSL.g:98:10: 'keys'
             {
-            match("key"); 
+            match("keys"); 
 
 
             }
@@ -2031,10 +2044,10 @@
         try {
             int _type = T__101;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:99:8: ( 'for' )
-            // InternalDataDSL.g:99:10: 'for'
+            // InternalDataDSL.g:99:8: ( 'exportFilter' )
+            // InternalDataDSL.g:99:10: 'exportFilter'
             {
-            match("for"); 
+            match("exportFilter"); 
 
 
             }
@@ -2052,10 +2065,10 @@
         try {
             int _type = T__102;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:100:8: ( 'on' )
-            // InternalDataDSL.g:100:10: 'on'
+            // InternalDataDSL.g:100:8: ( 'key' )
+            // InternalDataDSL.g:100:10: 'key'
             {
-            match("on"); 
+            match("key"); 
 
 
             }
@@ -2073,10 +2086,10 @@
         try {
             int _type = T__103;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:101:8: ( 'with' )
-            // InternalDataDSL.g:101:10: 'with'
+            // InternalDataDSL.g:101:8: ( 'for' )
+            // InternalDataDSL.g:101:10: 'for'
             {
-            match("with"); 
+            match("for"); 
 
 
             }
@@ -2094,10 +2107,10 @@
         try {
             int _type = T__104;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:102:8: ( 'mapTo' )
-            // InternalDataDSL.g:102:10: 'mapTo'
+            // InternalDataDSL.g:102:8: ( 'in' )
+            // InternalDataDSL.g:102:10: 'in'
             {
-            match("mapTo"); 
+            match("in"); 
 
 
             }
@@ -2115,10 +2128,10 @@
         try {
             int _type = T__105;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:103:8: ( 'markerPath' )
-            // InternalDataDSL.g:103:10: 'markerPath'
+            // InternalDataDSL.g:103:8: ( 'mapFrom' )
+            // InternalDataDSL.g:103:10: 'mapFrom'
             {
-            match("markerPath"); 
+            match("mapFrom"); 
 
 
             }
@@ -2136,10 +2149,10 @@
         try {
             int _type = T__106;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:104:8: ( 'markerEntity' )
-            // InternalDataDSL.g:104:10: 'markerEntity'
+            // InternalDataDSL.g:104:8: ( 'mapTo' )
+            // InternalDataDSL.g:104:10: 'mapTo'
             {
-            match("markerEntity"); 
+            match("mapTo"); 
 
 
             }
@@ -2157,10 +2170,10 @@
         try {
             int _type = T__107;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:105:8: ( 'coding' )
-            // InternalDataDSL.g:105:10: 'coding'
+            // InternalDataDSL.g:105:8: ( 'where' )
+            // InternalDataDSL.g:105:10: 'where'
             {
-            match("coding"); 
+            match("where"); 
 
 
             }
@@ -2178,10 +2191,10 @@
         try {
             int _type = T__108;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:106:8: ( 'copy' )
-            // InternalDataDSL.g:106:10: 'copy'
+            // InternalDataDSL.g:106:8: ( 'markerPath' )
+            // InternalDataDSL.g:106:10: 'markerPath'
             {
-            match("copy"); 
+            match("markerPath"); 
 
 
             }
@@ -2199,10 +2212,10 @@
         try {
             int _type = T__109;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:107:8: ( 'from' )
-            // InternalDataDSL.g:107:10: 'from'
+            // InternalDataDSL.g:107:8: ( 'markerEntity' )
+            // InternalDataDSL.g:107:10: 'markerEntity'
             {
-            match("from"); 
+            match("markerEntity"); 
 
 
             }
@@ -2220,10 +2233,10 @@
         try {
             int _type = T__110;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:108:8: ( 'property' )
-            // InternalDataDSL.g:108:10: 'property'
+            // InternalDataDSL.g:108:8: ( 'coding' )
+            // InternalDataDSL.g:108:10: 'coding'
             {
-            match("property"); 
+            match("coding"); 
 
 
             }
@@ -2241,10 +2254,10 @@
         try {
             int _type = T__111;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:109:8: ( 'ref' )
-            // InternalDataDSL.g:109:10: 'ref'
+            // InternalDataDSL.g:109:8: ( 'copy' )
+            // InternalDataDSL.g:109:10: 'copy'
             {
-            match("ref"); 
+            match("copy"); 
 
 
             }
@@ -2262,10 +2275,10 @@
         try {
             int _type = T__112;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:110:8: ( 'where' )
-            // InternalDataDSL.g:110:10: 'where'
+            // InternalDataDSL.g:110:8: ( 'from' )
+            // InternalDataDSL.g:110:10: 'from'
             {
-            match("where"); 
+            match("from"); 
 
 
             }
@@ -2283,10 +2296,10 @@
         try {
             int _type = T__113;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:111:8: ( 'hide' )
-            // InternalDataDSL.g:111:10: 'hide'
+            // InternalDataDSL.g:111:8: ( 'property' )
+            // InternalDataDSL.g:111:10: 'property'
             {
-            match("hide"); 
+            match("property"); 
 
 
             }
@@ -2304,10 +2317,10 @@
         try {
             int _type = T__114;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:112:8: ( 'assign' )
-            // InternalDataDSL.g:112:10: 'assign'
+            // InternalDataDSL.g:112:8: ( 'ref' )
+            // InternalDataDSL.g:112:10: 'ref'
             {
-            match("assign"); 
+            match("ref"); 
 
 
             }
@@ -2325,10 +2338,10 @@
         try {
             int _type = T__115;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:113:8: ( 'as' )
-            // InternalDataDSL.g:113:10: 'as'
+            // InternalDataDSL.g:113:8: ( 'on' )
+            // InternalDataDSL.g:113:10: 'on'
             {
-            match("as"); 
+            match("on"); 
 
 
             }
@@ -2346,10 +2359,10 @@
         try {
             int _type = T__116;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:114:8: ( 'map' )
-            // InternalDataDSL.g:114:10: 'map'
+            // InternalDataDSL.g:114:8: ( 'hide' )
+            // InternalDataDSL.g:114:10: 'hide'
             {
-            match("map"); 
+            match("hide"); 
 
 
             }
@@ -2367,10 +2380,10 @@
         try {
             int _type = T__117;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:115:8: ( 'to' )
-            // InternalDataDSL.g:115:10: 'to'
+            // InternalDataDSL.g:115:8: ( 'assign' )
+            // InternalDataDSL.g:115:10: 'assign'
             {
-            match("to"); 
+            match("assign"); 
 
 
             }
@@ -2388,10 +2401,10 @@
         try {
             int _type = T__118;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:116:8: ( 'mapBlob' )
-            // InternalDataDSL.g:116:10: 'mapBlob'
+            // InternalDataDSL.g:116:8: ( 'with' )
+            // InternalDataDSL.g:116:10: 'with'
             {
-            match("mapBlob"); 
+            match("with"); 
 
 
             }
@@ -2409,10 +2422,10 @@
         try {
             int _type = T__119;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:117:8: ( 'mimeType' )
-            // InternalDataDSL.g:117:10: 'mimeType'
+            // InternalDataDSL.g:117:8: ( 'as' )
+            // InternalDataDSL.g:117:10: 'as'
             {
-            match("mimeType"); 
+            match("as"); 
 
 
             }
@@ -2430,10 +2443,11 @@
         try {
             int _type = T__120;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:118:8: ( ';' )
-            // InternalDataDSL.g:118:10: ';'
+            // InternalDataDSL.g:118:8: ( 'map' )
+            // InternalDataDSL.g:118:10: 'map'
             {
-            match(';'); 
+            match("map"); 
+
 
             }
 
@@ -2450,10 +2464,11 @@
         try {
             int _type = T__121;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:119:8: ( '@' )
-            // InternalDataDSL.g:119:10: '@'
+            // InternalDataDSL.g:119:8: ( 'to' )
+            // InternalDataDSL.g:119:10: 'to'
             {
-            match('@'); 
+            match("to"); 
+
 
             }
 
@@ -2470,10 +2485,11 @@
         try {
             int _type = T__122;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:120:8: ( '(' )
-            // InternalDataDSL.g:120:10: '('
+            // InternalDataDSL.g:120:8: ( 'mapBlob' )
+            // InternalDataDSL.g:120:10: 'mapBlob'
             {
-            match('('); 
+            match("mapBlob"); 
+
 
             }
 
@@ -2490,10 +2506,11 @@
         try {
             int _type = T__123;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:121:8: ( ')' )
-            // InternalDataDSL.g:121:10: ')'
+            // InternalDataDSL.g:121:8: ( 'mimeType' )
+            // InternalDataDSL.g:121:10: 'mimeType'
             {
-            match(')'); 
+            match("mimeType"); 
+
 
             }
 
@@ -2510,10 +2527,11 @@
         try {
             int _type = T__124;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:122:8: ( ',' )
-            // InternalDataDSL.g:122:10: ','
+            // InternalDataDSL.g:122:8: ( 'mapFixedLength' )
+            // InternalDataDSL.g:122:10: 'mapFixedLength'
             {
-            match(','); 
+            match("mapFixedLength"); 
+
 
             }
 
@@ -2530,10 +2548,11 @@
         try {
             int _type = T__125;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:123:8: ( ']' )
-            // InternalDataDSL.g:123:10: ']'
+            // InternalDataDSL.g:123:8: ( 'length' )
+            // InternalDataDSL.g:123:10: 'length'
             {
-            match(']'); 
+            match("length"); 
+
 
             }
 
@@ -2550,10 +2569,10 @@
         try {
             int _type = T__126;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:124:8: ( '#' )
-            // InternalDataDSL.g:124:10: '#'
+            // InternalDataDSL.g:124:8: ( ';' )
+            // InternalDataDSL.g:124:10: ';'
             {
-            match('#'); 
+            match(';'); 
 
             }
 
@@ -2570,10 +2589,10 @@
         try {
             int _type = T__127;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:125:8: ( '[' )
-            // InternalDataDSL.g:125:10: '['
+            // InternalDataDSL.g:125:8: ( '@' )
+            // InternalDataDSL.g:125:10: '@'
             {
-            match('['); 
+            match('@'); 
 
             }
 
@@ -2590,11 +2609,10 @@
         try {
             int _type = T__128;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:126:8: ( 'instanceof' )
-            // InternalDataDSL.g:126:10: 'instanceof'
+            // InternalDataDSL.g:126:8: ( '(' )
+            // InternalDataDSL.g:126:10: '('
             {
-            match("instanceof"); 
-
+            match('('); 
 
             }
 
@@ -2611,11 +2629,10 @@
         try {
             int _type = T__129;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:127:8: ( 'if' )
-            // InternalDataDSL.g:127:10: 'if'
+            // InternalDataDSL.g:127:8: ( ')' )
+            // InternalDataDSL.g:127:10: ')'
             {
-            match("if"); 
-
+            match(')'); 
 
             }
 
@@ -2632,11 +2649,10 @@
         try {
             int _type = T__130;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:128:8: ( 'else' )
-            // InternalDataDSL.g:128:10: 'else'
+            // InternalDataDSL.g:128:8: ( ',' )
+            // InternalDataDSL.g:128:10: ','
             {
-            match("else"); 
-
+            match(','); 
 
             }
 
@@ -2653,11 +2669,10 @@
         try {
             int _type = T__131;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:129:8: ( 'switch' )
-            // InternalDataDSL.g:129:10: 'switch'
+            // InternalDataDSL.g:129:8: ( ']' )
+            // InternalDataDSL.g:129:10: ']'
             {
-            match("switch"); 
-
+            match(']'); 
 
             }
 
@@ -2674,10 +2689,10 @@
         try {
             int _type = T__132;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:130:8: ( ':' )
-            // InternalDataDSL.g:130:10: ':'
+            // InternalDataDSL.g:130:8: ( '#' )
+            // InternalDataDSL.g:130:10: '#'
             {
-            match(':'); 
+            match('#'); 
 
             }
 
@@ -2694,11 +2709,10 @@
         try {
             int _type = T__133;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:131:8: ( 'default' )
-            // InternalDataDSL.g:131:10: 'default'
+            // InternalDataDSL.g:131:8: ( '[' )
+            // InternalDataDSL.g:131:10: '['
             {
-            match("default"); 
-
+            match('['); 
 
             }
 
@@ -2715,10 +2729,10 @@
         try {
             int _type = T__134;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:132:8: ( 'case' )
-            // InternalDataDSL.g:132:10: 'case'
+            // InternalDataDSL.g:132:8: ( 'instanceof' )
+            // InternalDataDSL.g:132:10: 'instanceof'
             {
-            match("case"); 
+            match("instanceof"); 
 
 
             }
@@ -2736,10 +2750,10 @@
         try {
             int _type = T__135;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:133:8: ( 'while' )
-            // InternalDataDSL.g:133:10: 'while'
+            // InternalDataDSL.g:133:8: ( 'if' )
+            // InternalDataDSL.g:133:10: 'if'
             {
-            match("while"); 
+            match("if"); 
 
 
             }
@@ -2757,10 +2771,10 @@
         try {
             int _type = T__136;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:134:8: ( 'do' )
-            // InternalDataDSL.g:134:10: 'do'
+            // InternalDataDSL.g:134:8: ( 'else' )
+            // InternalDataDSL.g:134:10: 'else'
             {
-            match("do"); 
+            match("else"); 
 
 
             }
@@ -2778,10 +2792,10 @@
         try {
             int _type = T__137;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:135:8: ( 'new' )
-            // InternalDataDSL.g:135:10: 'new'
+            // InternalDataDSL.g:135:8: ( 'switch' )
+            // InternalDataDSL.g:135:10: 'switch'
             {
-            match("new"); 
+            match("switch"); 
 
 
             }
@@ -2799,11 +2813,10 @@
         try {
             int _type = T__138;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:136:8: ( 'null' )
-            // InternalDataDSL.g:136:10: 'null'
+            // InternalDataDSL.g:136:8: ( ':' )
+            // InternalDataDSL.g:136:10: ':'
             {
-            match("null"); 
-
+            match(':'); 
 
             }
 
@@ -2820,10 +2833,10 @@
         try {
             int _type = T__139;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:137:8: ( 'typeof' )
-            // InternalDataDSL.g:137:10: 'typeof'
+            // InternalDataDSL.g:137:8: ( 'default' )
+            // InternalDataDSL.g:137:10: 'default'
             {
-            match("typeof"); 
+            match("default"); 
 
 
             }
@@ -2841,10 +2854,10 @@
         try {
             int _type = T__140;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:138:8: ( 'throw' )
-            // InternalDataDSL.g:138:10: 'throw'
+            // InternalDataDSL.g:138:8: ( 'case' )
+            // InternalDataDSL.g:138:10: 'case'
             {
-            match("throw"); 
+            match("case"); 
 
 
             }
@@ -2862,10 +2875,10 @@
         try {
             int _type = T__141;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:139:8: ( 'return' )
-            // InternalDataDSL.g:139:10: 'return'
+            // InternalDataDSL.g:139:8: ( 'while' )
+            // InternalDataDSL.g:139:10: 'while'
             {
-            match("return"); 
+            match("while"); 
 
 
             }
@@ -2883,10 +2896,10 @@
         try {
             int _type = T__142;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:140:8: ( 'try' )
-            // InternalDataDSL.g:140:10: 'try'
+            // InternalDataDSL.g:140:8: ( 'do' )
+            // InternalDataDSL.g:140:10: 'do'
             {
-            match("try"); 
+            match("do"); 
 
 
             }
@@ -2904,10 +2917,10 @@
         try {
             int _type = T__143;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:141:8: ( 'finally' )
-            // InternalDataDSL.g:141:10: 'finally'
+            // InternalDataDSL.g:141:8: ( 'new' )
+            // InternalDataDSL.g:141:10: 'new'
             {
-            match("finally"); 
+            match("new"); 
 
 
             }
@@ -2925,10 +2938,10 @@
         try {
             int _type = T__144;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:142:8: ( 'synchronized' )
-            // InternalDataDSL.g:142:10: 'synchronized'
+            // InternalDataDSL.g:142:8: ( 'null' )
+            // InternalDataDSL.g:142:10: 'null'
             {
-            match("synchronized"); 
+            match("null"); 
 
 
             }
@@ -2946,10 +2959,10 @@
         try {
             int _type = T__145;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:143:8: ( 'catch' )
-            // InternalDataDSL.g:143:10: 'catch'
+            // InternalDataDSL.g:143:8: ( 'typeof' )
+            // InternalDataDSL.g:143:10: 'typeof'
             {
-            match("catch"); 
+            match("typeof"); 
 
 
             }
@@ -2967,10 +2980,11 @@
         try {
             int _type = T__146;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:144:8: ( '?' )
-            // InternalDataDSL.g:144:10: '?'
+            // InternalDataDSL.g:144:8: ( 'throw' )
+            // InternalDataDSL.g:144:10: 'throw'
             {
-            match('?'); 
+            match("throw"); 
+
 
             }
 
@@ -2987,10 +3001,11 @@
         try {
             int _type = T__147;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:145:8: ( '&' )
-            // InternalDataDSL.g:145:10: '&'
+            // InternalDataDSL.g:145:8: ( 'return' )
+            // InternalDataDSL.g:145:10: 'return'
             {
-            match('&'); 
+            match("return"); 
+
 
             }
 
@@ -3007,10 +3022,10 @@
         try {
             int _type = T__148;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:146:8: ( 'describedBy' )
-            // InternalDataDSL.g:146:10: 'describedBy'
+            // InternalDataDSL.g:146:8: ( 'try' )
+            // InternalDataDSL.g:146:10: 'try'
             {
-            match("describedBy"); 
+            match("try"); 
 
 
             }
@@ -3028,10 +3043,10 @@
         try {
             int _type = T__149;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:147:8: ( 'vectorName' )
-            // InternalDataDSL.g:147:10: 'vectorName'
+            // InternalDataDSL.g:147:8: ( 'finally' )
+            // InternalDataDSL.g:147:10: 'finally'
             {
-            match("vectorName"); 
+            match("finally"); 
 
 
             }
@@ -3049,10 +3064,10 @@
         try {
             int _type = T__150;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:148:8: ( 'report' )
-            // InternalDataDSL.g:148:10: 'report'
+            // InternalDataDSL.g:148:8: ( 'synchronized' )
+            // InternalDataDSL.g:148:10: 'synchronized'
             {
-            match("report"); 
+            match("synchronized"); 
 
 
             }
@@ -3070,10 +3085,10 @@
         try {
             int _type = T__151;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:149:8: ( 'deleteFileAfterImport' )
-            // InternalDataDSL.g:149:10: 'deleteFileAfterImport'
+            // InternalDataDSL.g:149:8: ( 'catch' )
+            // InternalDataDSL.g:149:10: 'catch'
             {
-            match("deleteFileAfterImport"); 
+            match("catch"); 
 
 
             }
@@ -3091,11 +3106,10 @@
         try {
             int _type = T__152;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:150:8: ( 'mapByAttribute' )
-            // InternalDataDSL.g:150:10: 'mapByAttribute'
+            // InternalDataDSL.g:150:8: ( '?' )
+            // InternalDataDSL.g:150:10: '?'
             {
-            match("mapByAttribute"); 
-
+            match('?'); 
 
             }
 
@@ -3112,11 +3126,10 @@
         try {
             int _type = T__153;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:151:8: ( 'indent' )
-            // InternalDataDSL.g:151:10: 'indent'
+            // InternalDataDSL.g:151:8: ( '&' )
+            // InternalDataDSL.g:151:10: '&'
             {
-            match("indent"); 
-
+            match('&'); 
 
             }
 
@@ -3133,10 +3146,10 @@
         try {
             int _type = T__154;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:152:8: ( 'validate' )
-            // InternalDataDSL.g:152:10: 'validate'
+            // InternalDataDSL.g:152:8: ( 'describedBy' )
+            // InternalDataDSL.g:152:10: 'describedBy'
             {
-            match("validate"); 
+            match("describedBy"); 
 
 
             }
@@ -3154,10 +3167,10 @@
         try {
             int _type = T__155;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:153:8: ( 'latestImport' )
-            // InternalDataDSL.g:153:10: 'latestImport'
+            // InternalDataDSL.g:153:8: ( 'vectorName' )
+            // InternalDataDSL.g:153:10: 'vectorName'
             {
-            match("latestImport"); 
+            match("vectorName"); 
 
 
             }
@@ -3175,10 +3188,10 @@
         try {
             int _type = T__156;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:154:8: ( 'latestExport' )
-            // InternalDataDSL.g:154:10: 'latestExport'
+            // InternalDataDSL.g:154:8: ( 'report' )
+            // InternalDataDSL.g:154:10: 'report'
             {
-            match("latestExport"); 
+            match("report"); 
 
 
             }
@@ -3196,10 +3209,10 @@
         try {
             int _type = T__157;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:155:8: ( 'cacheSize' )
-            // InternalDataDSL.g:155:10: 'cacheSize'
+            // InternalDataDSL.g:155:8: ( 'deleteFileAfterImport' )
+            // InternalDataDSL.g:155:10: 'deleteFileAfterImport'
             {
-            match("cacheSize"); 
+            match("deleteFileAfterImport"); 
 
 
             }
@@ -3217,10 +3230,10 @@
         try {
             int _type = T__158;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:156:8: ( 'allowNoResult' )
-            // InternalDataDSL.g:156:10: 'allowNoResult'
+            // InternalDataDSL.g:156:8: ( 'mapByAttribute' )
+            // InternalDataDSL.g:156:10: 'mapByAttribute'
             {
-            match("allowNoResult"); 
+            match("mapByAttribute"); 
 
 
             }
@@ -3238,10 +3251,10 @@
         try {
             int _type = T__159;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:157:8: ( 'allowNonuniqueResult' )
-            // InternalDataDSL.g:157:10: 'allowNonuniqueResult'
+            // InternalDataDSL.g:157:8: ( 'indent' )
+            // InternalDataDSL.g:157:10: 'indent'
             {
-            match("allowNonuniqueResult"); 
+            match("indent"); 
 
 
             }
@@ -3259,10 +3272,10 @@
         try {
             int _type = T__160;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:158:8: ( 'markedBy' )
-            // InternalDataDSL.g:158:10: 'markedBy'
+            // InternalDataDSL.g:158:8: ( 'validate' )
+            // InternalDataDSL.g:158:10: 'validate'
             {
-            match("markedBy"); 
+            match("validate"); 
 
 
             }
@@ -3280,10 +3293,10 @@
         try {
             int _type = T__161;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:159:8: ( 'ns' )
-            // InternalDataDSL.g:159:10: 'ns'
+            // InternalDataDSL.g:159:8: ( 'latestImport' )
+            // InternalDataDSL.g:159:10: 'latestImport'
             {
-            match("ns"); 
+            match("latestImport"); 
 
 
             }
@@ -3301,10 +3314,10 @@
         try {
             int _type = T__162;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:160:8: ( '::' )
-            // InternalDataDSL.g:160:10: '::'
+            // InternalDataDSL.g:160:8: ( 'latestExport' )
+            // InternalDataDSL.g:160:10: 'latestExport'
             {
-            match("::"); 
+            match("latestExport"); 
 
 
             }
@@ -3322,10 +3335,10 @@
         try {
             int _type = T__163;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:161:8: ( '?.' )
-            // InternalDataDSL.g:161:10: '?.'
+            // InternalDataDSL.g:161:8: ( 'allowNoResult' )
+            // InternalDataDSL.g:161:10: 'allowNoResult'
             {
-            match("?."); 
+            match("allowNoResult"); 
 
 
             }
@@ -3343,10 +3356,11 @@
         try {
             int _type = T__164;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:162:8: ( '|' )
-            // InternalDataDSL.g:162:10: '|'
+            // InternalDataDSL.g:162:8: ( 'cacheSize' )
+            // InternalDataDSL.g:162:10: 'cacheSize'
             {
-            match('|'); 
+            match("cacheSize"); 
+
 
             }
 
@@ -3363,10 +3377,10 @@
         try {
             int _type = T__165;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:163:8: ( 'var' )
-            // InternalDataDSL.g:163:10: 'var'
+            // InternalDataDSL.g:163:8: ( 'markedBy' )
+            // InternalDataDSL.g:163:10: 'markedBy'
             {
-            match("var"); 
+            match("markedBy"); 
 
 
             }
@@ -3384,10 +3398,10 @@
         try {
             int _type = T__166;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:164:8: ( 'true' )
-            // InternalDataDSL.g:164:10: 'true'
+            // InternalDataDSL.g:164:8: ( 'trim' )
+            // InternalDataDSL.g:164:10: 'trim'
             {
-            match("true"); 
+            match("trim"); 
 
 
             }
@@ -3400,15 +3414,287 @@
     }
     // $ANTLR end "T__166"
 
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:165:8: ( 'leftTrim' )
+            // InternalDataDSL.g:165:10: 'leftTrim'
+            {
+            match("leftTrim"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:166:8: ( 'rightTrim' )
+            // InternalDataDSL.g:166:10: 'rightTrim'
+            {
+            match("rightTrim"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:167:8: ( 'lowerCase' )
+            // InternalDataDSL.g:167:10: 'lowerCase'
+            {
+            match("lowerCase"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:168:8: ( 'upperCase' )
+            // InternalDataDSL.g:168:10: 'upperCase'
+            {
+            match("upperCase"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:169:8: ( 'capitalizeFirstWord' )
+            // InternalDataDSL.g:169:10: 'capitalizeFirstWord'
+            {
+            match("capitalizeFirstWord"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:170:8: ( 'uncapitalizeFirstWord' )
+            // InternalDataDSL.g:170:10: 'uncapitalizeFirstWord'
+            {
+            match("uncapitalizeFirstWord"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:171:8: ( 'capitalize' )
+            // InternalDataDSL.g:171:10: 'capitalize'
+            {
+            match("capitalize"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:172:8: ( 'ns' )
+            // InternalDataDSL.g:172:10: 'ns'
+            {
+            match("ns"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:173:8: ( '::' )
+            // InternalDataDSL.g:173:10: '::'
+            {
+            match("::"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:174:8: ( '?.' )
+            // InternalDataDSL.g:174:10: '?.'
+            {
+            match("?."); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:175:8: ( '|' )
+            // InternalDataDSL.g:175:10: '|'
+            {
+            match('|'); 
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:176:8: ( 'var' )
+            // InternalDataDSL.g:176:10: 'var'
+            {
+            match("var"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:177:8: ( 'true' )
+            // InternalDataDSL.g:177:10: 'true'
+            {
+            match("true"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
     // $ANTLR start "RULE_HEX"
     public final void mRULE_HEX() throws RecognitionException {
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27596:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // InternalDataDSL.g:27596:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalDataDSL.g:29180:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalDataDSL.g:29180:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // InternalDataDSL.g:27596:12: ( '0x' | '0X' )
+            // InternalDataDSL.g:29180:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -3436,7 +3722,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalDataDSL.g:27596:13: '0x'
+                    // InternalDataDSL.g:29180:13: '0x'
                     {
                     match("0x"); 
 
@@ -3444,7 +3730,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:27596:18: '0X'
+                    // InternalDataDSL.g:29180:18: '0X'
                     {
                     match("0X"); 
 
@@ -3454,7 +3740,7 @@
 
             }
 
-            // InternalDataDSL.g:27596:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalDataDSL.g:29180:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -3492,7 +3778,7 @@
                 cnt2++;
             } while (true);
 
-            // InternalDataDSL.g:27596:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalDataDSL.g:29180:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -3501,10 +3787,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalDataDSL.g:27596:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalDataDSL.g:29180:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // InternalDataDSL.g:27596:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalDataDSL.g:29180:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -3522,7 +3808,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // InternalDataDSL.g:27596:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalDataDSL.g:29180:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -3546,7 +3832,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:27596:84: ( 'l' | 'L' )
+                            // InternalDataDSL.g:29180:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -3585,11 +3871,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27598:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // InternalDataDSL.g:27598:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalDataDSL.g:29182:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalDataDSL.g:29182:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // InternalDataDSL.g:27598:21: ( '0' .. '9' | '_' )*
+            // InternalDataDSL.g:29182:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -3638,11 +3924,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27600:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // InternalDataDSL.g:27600:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalDataDSL.g:29184:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalDataDSL.g:29184:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // InternalDataDSL.g:27600:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalDataDSL.g:29184:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -3651,7 +3937,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalDataDSL.g:27600:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalDataDSL.g:29184:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -3662,7 +3948,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // InternalDataDSL.g:27600:36: ( '+' | '-' )?
+                    // InternalDataDSL.g:29184:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -3695,7 +3981,7 @@
 
             }
 
-            // InternalDataDSL.g:27600:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalDataDSL.g:29184:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -3707,7 +3993,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalDataDSL.g:27600:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalDataDSL.g:29184:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -3731,7 +4017,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:27600:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalDataDSL.g:29184:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
                     {
                     if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
                         input.consume();
@@ -3764,10 +4050,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27602:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // InternalDataDSL.g:27602:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalDataDSL.g:29186:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalDataDSL.g:29186:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // InternalDataDSL.g:27602:11: ( '^' )?
+            // InternalDataDSL.g:29186:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -3776,7 +4062,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalDataDSL.g:27602:11: '^'
+                    // InternalDataDSL.g:29186:11: '^'
                     {
                     match('^'); 
 
@@ -3794,7 +4080,7 @@
                 recover(mse);
                 throw mse;}
 
-            // InternalDataDSL.g:27602:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalDataDSL.g:29186:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -3843,10 +4129,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27604:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // InternalDataDSL.g:27604:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalDataDSL.g:29188:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalDataDSL.g:29188:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // InternalDataDSL.g:27604:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalDataDSL.g:29188:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -3864,10 +4150,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalDataDSL.g:27604:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalDataDSL.g:29188:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // InternalDataDSL.g:27604:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalDataDSL.g:29188:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -3883,7 +4169,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // InternalDataDSL.g:27604:21: '\\\\' .
+                    	    // InternalDataDSL.g:29188:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3891,7 +4177,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalDataDSL.g:27604:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalDataDSL.g:29188:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3911,7 +4197,7 @@
                         }
                     } while (true);
 
-                    // InternalDataDSL.g:27604:44: ( '\"' )?
+                    // InternalDataDSL.g:29188:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -3920,7 +4206,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // InternalDataDSL.g:27604:44: '\"'
+                            // InternalDataDSL.g:29188:44: '\"'
                             {
                             match('\"'); 
 
@@ -3933,10 +4219,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:27604:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalDataDSL.g:29188:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // InternalDataDSL.g:27604:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalDataDSL.g:29188:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -3952,7 +4238,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // InternalDataDSL.g:27604:55: '\\\\' .
+                    	    // InternalDataDSL.g:29188:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3960,7 +4246,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalDataDSL.g:27604:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalDataDSL.g:29188:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3980,7 +4266,7 @@
                         }
                     } while (true);
 
-                    // InternalDataDSL.g:27604:79: ( '\\'' )?
+                    // InternalDataDSL.g:29188:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -3989,7 +4275,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // InternalDataDSL.g:27604:79: '\\''
+                            // InternalDataDSL.g:29188:79: '\\''
                             {
                             match('\''); 
 
@@ -4020,12 +4306,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27606:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalDataDSL.g:27606:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalDataDSL.g:29190:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalDataDSL.g:29190:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // InternalDataDSL.g:27606:24: ( options {greedy=false; } : . )*
+            // InternalDataDSL.g:29190:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -4050,7 +4336,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalDataDSL.g:27606:52: .
+            	    // InternalDataDSL.g:29190:52: .
             	    {
             	    matchAny(); 
 
@@ -4080,12 +4366,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27608:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalDataDSL.g:27608:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalDataDSL.g:29192:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalDataDSL.g:29192:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // InternalDataDSL.g:27608:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalDataDSL.g:29192:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -4098,7 +4384,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // InternalDataDSL.g:27608:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalDataDSL.g:29192:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -4118,7 +4404,7 @@
                 }
             } while (true);
 
-            // InternalDataDSL.g:27608:40: ( ( '\\r' )? '\\n' )?
+            // InternalDataDSL.g:29192:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -4127,9 +4413,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalDataDSL.g:27608:41: ( '\\r' )? '\\n'
+                    // InternalDataDSL.g:29192:41: ( '\\r' )? '\\n'
                     {
-                    // InternalDataDSL.g:27608:41: ( '\\r' )?
+                    // InternalDataDSL.g:29192:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -4138,7 +4424,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // InternalDataDSL.g:27608:41: '\\r'
+                            // InternalDataDSL.g:29192:41: '\\r'
                             {
                             match('\r'); 
 
@@ -4170,10 +4456,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27610:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalDataDSL.g:27610:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalDataDSL.g:29194:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalDataDSL.g:29194:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalDataDSL.g:27610:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalDataDSL.g:29194:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -4227,8 +4513,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:27612:16: ( . )
-            // InternalDataDSL.g:27612:18: .
+            // InternalDataDSL.g:29196:16: ( . )
+            // InternalDataDSL.g:29196:18: .
             {
             matchAny(); 
 
@@ -4243,8 +4529,8 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // InternalDataDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=163;
+        // InternalDataDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=176;
         alt21 = dfa21.predict(input);
         switch (alt21) {
             case 1 :
@@ -5326,63 +5612,154 @@
                 }
                 break;
             case 155 :
-                // InternalDataDSL.g:1:1001: RULE_HEX
+                // InternalDataDSL.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // InternalDataDSL.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // InternalDataDSL.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // InternalDataDSL.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // InternalDataDSL.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // InternalDataDSL.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // InternalDataDSL.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // InternalDataDSL.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // InternalDataDSL.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // InternalDataDSL.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // InternalDataDSL.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // InternalDataDSL.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // InternalDataDSL.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // InternalDataDSL.g:1:1092: RULE_HEX
                 {
                 mRULE_HEX(); 
 
                 }
                 break;
-            case 156 :
-                // InternalDataDSL.g:1:1010: RULE_INT
+            case 169 :
+                // InternalDataDSL.g:1:1101: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
-            case 157 :
-                // InternalDataDSL.g:1:1019: RULE_DECIMAL
+            case 170 :
+                // InternalDataDSL.g:1:1110: RULE_DECIMAL
                 {
                 mRULE_DECIMAL(); 
 
                 }
                 break;
-            case 158 :
-                // InternalDataDSL.g:1:1032: RULE_ID
+            case 171 :
+                // InternalDataDSL.g:1:1123: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
-            case 159 :
-                // InternalDataDSL.g:1:1040: RULE_STRING
+            case 172 :
+                // InternalDataDSL.g:1:1131: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
-            case 160 :
-                // InternalDataDSL.g:1:1052: RULE_ML_COMMENT
+            case 173 :
+                // InternalDataDSL.g:1:1143: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
-            case 161 :
-                // InternalDataDSL.g:1:1068: RULE_SL_COMMENT
+            case 174 :
+                // InternalDataDSL.g:1:1159: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
-            case 162 :
-                // InternalDataDSL.g:1:1084: RULE_WS
+            case 175 :
+                // InternalDataDSL.g:1:1175: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
-            case 163 :
-                // InternalDataDSL.g:1:1092: RULE_ANY_OTHER
+            case 176 :
+                // InternalDataDSL.g:1:1183: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -5396,64 +5773,65 @@
 
     protected DFA21 dfa21 = new DFA21(this);
     static final String DFA21_eotS =
-        "\1\uffff\1\101\1\103\1\105\1\110\1\114\1\117\1\123\1\125\1\127\1\131\1\134\1\136\1\141\22\144\2\uffff\14\144\10\uffff\1\u00b2\2\u00b5\1\76\5\uffff\1\u00ba\26\uffff\1\u00bc\6\uffff\1\u00be\4\uffff\2\144\1\uffff\13\144\1\u00d2\20\144\1\u00e6\1\u00e7\13\144\1\u00f7\1\144\2\uffff\6\144\1\u0102\4\144\1\u0107\7\144\1\u0113\3\144\13\uffff\1\u00b5\12\uffff\1\u0119\1\u011a\21\144\1\uffff\3\144\1\u0132\2\144\1\u0135\1\u0136\4\144\1\u013b\2\144\1\u0141\3\144\2\uffff\10\144\1\u014d\1\144\1\u014f\2\144\1\u0152\1\144\1\uffff\2\144\1\u0156\3\144\1\u015a\3\144\1\uffff\2\144\1\u0161\1\144\1\uffff\6\144\1\u016a\4\144\1\uffff\2\144\1\u0171\2\144\2\uffff\5\144\1\u017a\16\144\1\u0189\2\144\1\uffff\1\u018c\1\144\2\uffff\2\144\1\u0190\1\144\1\uffff\1\u0192\4\144\1\uffff\7\144\1\u019f\3\144\1\uffff\1\144\1\uffff\2\144\1\uffff\3\144\1\uffff\3\144\1\uffff\6\144\1\uffff\1\u01b2\2\144\1\u01b5\1\u01b6\2\144\1\u01b9\1\uffff\1\u01ba\2\144\1\u01bd\2\144\1\uffff\1\u01c0\7\144\1\uffff\3\144\1\u01cc\11\144\1\u01d6\1\uffff\2\144\1\uffff\1\u01d9\2\144\1\uffff\1\144\1\uffff\1\u01dd\1\144\1\u01df\11\144\1\uffff\10\144\1\u01f2\11\144\1\uffff\2\144\2\uffff\1\u01fe\1\144\2\uffff\1\u0200\1\u0201\1\uffff\1\144\1\u0203\1\uffff\5\144\1\u0209\3\144\1\u020d\1\u020e\1\uffff\1\144\1\u0210\1\144\1\u0212\1\u0213\3\144\1\u0217\1\uffff\1\144\1\u0219\1\uffff\3\144\1\uffff\1\144\1\uffff\5\144\1\uffff\5\144\1\u0229\1\144\1\u022b\1\u022c\1\u022d\1\u022e\1\144\1\uffff\1\u0230\1\u0231\10\144\1\u023b\1\uffff\1\144\2\uffff\1\u023d\1\uffff\2\144\1\u0240\2\144\1\uffff\3\144\2\uffff\1\144\1\uffff\1\144\2\uffff\3\144\1\uffff\1\u024b\1\uffff\1\u024c\1\u024d\1\144\1\u0250\1\u0251\5\144\1\u0257\4\144\1\uffff\1\144\4\uffff\1\144\2\uffff\4\144\1\u0263\4\144\1\uffff\1\144\1\uffff\1\u0269\1\144\1\uffff\4\144\1\u026f\5\144\3\uffff\1\u0275\1\144\2\uffff\3\144\1\u027a\1\u027b\1\uffff\13\144\1\uffff\2\144\1\u0289\1\u028a\1\144\1\uffff\1\144\1\u028d\3\144\1\uffff\1\u0291\1\144\1\u0293\2\144\1\uffff\4\144\2\uffff\1\144\1\u029b\7\144\1\u02a3\3\144\2\uffff\1\u02a7\1\u02a8\1\uffff\1\u02a9\2\144\1\uffff\1\144\1\uffff\1\144\1\u02ae\2\144\1\u02b1\2\144\1\uffff\7\144\1\uffff\3\144\3\uffff\1\144\1\u02bf\1\144\1\u02c1\1\uffff\2\144\1\uffff\1\144\1\u02c5\10\144\1\u02ce\1\144\1\u02d0\1\uffff\1\u02d1\1\uffff\1\u02d2\1\144\1\u02d4\1\uffff\1\144\1\u02d6\3\144\1\u02da\1\u02db\1\144\1\uffff\1\144\3\uffff\1\144\1\uffff\1\144\1\uffff\1\144\1\u02e1\1\144\2\uffff\2\144\1\u02e5\1\144\1\u02e7\1\uffff\2\144\1\u02ea\1\uffff\1\144\1\uffff\2\144\1\uffff\15\144\1\u02fb\2\144\1\uffff\1\u02fe\1\144\1\uffff\4\144\1\u0304\1\uffff";
+        "\1\uffff\1\103\1\105\1\107\1\112\1\116\1\121\1\125\1\127\1\131\1\133\1\136\1\140\1\143\22\146\2\uffff\15\146\10\uffff\1\u00b7\1\146\2\u00bc\1\100\5\uffff\1\u00c1\26\uffff\1\u00c3\6\uffff\1\u00c5\4\uffff\2\146\1\uffff\12\146\1\u00d9\1\u00da\20\146\1\u00ee\1\u00ef\14\146\1\u0100\1\146\2\uffff\7\146\1\u010e\5\146\1\u0114\7\146\1\u0121\3\146\12\uffff\2\146\1\uffff\1\u00bc\12\uffff\1\u012a\1\u012b\21\146\2\uffff\3\146\1\u0143\2\146\1\u0146\1\u0147\4\146\1\u014c\2\146\1\u0153\3\146\2\uffff\10\146\1\u015f\1\146\1\u0162\3\146\1\u0166\1\146\1\uffff\2\146\1\u016a\6\146\1\u0171\3\146\1\uffff\3\146\1\u0179\1\146\1\uffff\7\146\1\u0183\4\146\1\uffff\2\146\1\u018a\5\146\2\uffff\5\146\1\u0196\16\146\1\u01a5\2\146\1\uffff\1\u01a8\1\146\2\uffff\2\146\1\u01ac\1\146\1\uffff\1\u01ae\5\146\1\uffff\7\146\1\u01bd\3\146\1\uffff\2\146\1\uffff\3\146\1\uffff\3\146\1\uffff\6\146\1\uffff\7\146\1\uffff\1\u01d6\2\146\1\u01d9\1\u01da\3\146\1\u01de\1\uffff\2\146\1\u01e1\1\u01e2\2\146\1\uffff\1\u01e5\1\u01e6\11\146\1\uffff\3\146\1\u01f4\11\146\1\u01fe\1\uffff\2\146\1\uffff\1\u0201\2\146\1\uffff\1\146\1\uffff\1\u0205\3\146\1\u0209\11\146\1\uffff\12\146\1\u021e\13\146\1\u022a\1\146\1\uffff\2\146\2\uffff\1\u022e\2\146\1\uffff\1\u0231\1\u0232\2\uffff\1\146\1\u0234\2\uffff\7\146\1\u023c\3\146\1\u0240\1\u0241\1\uffff\1\146\1\u0243\1\146\1\u0245\1\u0246\3\146\1\u024a\1\uffff\1\146\1\u024c\1\uffff\3\146\1\uffff\3\146\1\uffff\5\146\1\uffff\5\146\1\u025e\1\146\1\u0260\1\146\1\u0262\1\u0263\1\146\1\u0265\1\146\1\uffff\1\u0267\1\u0268\1\146\1\u026a\7\146\1\uffff\2\146\1\u0275\1\uffff\2\146\2\uffff\1\u0278\1\uffff\4\146\1\u027d\2\146\1\uffff\3\146\2\uffff\1\146\1\uffff\1\146\2\uffff\3\146\1\uffff\1\u0288\1\uffff\1\u0289\1\u028a\1\146\1\u028d\1\u028e\1\146\1\u0290\5\146\1\u0296\4\146\1\uffff\1\146\1\uffff\1\146\2\uffff\1\146\1\uffff\1\146\2\uffff\1\146\1\uffff\5\146\1\u02a5\4\146\1\uffff\2\146\1\uffff\2\146\1\u02ae\1\146\1\uffff\4\146\1\u02b4\5\146\3\uffff\1\u02ba\1\146\2\uffff\1\146\1\uffff\3\146\1\u02c0\1\u02c1\1\uffff\11\146\1\u02cb\4\146\1\uffff\2\146\1\u02d2\1\u02d3\4\146\1\uffff\1\146\1\u02d9\3\146\1\uffff\1\u02dd\1\146\1\u02df\2\146\1\uffff\5\146\2\uffff\1\146\1\u02e8\4\146\1\u02ed\1\146\1\u02ef\1\uffff\2\146\1\u02f2\3\146\2\uffff\1\u02f6\1\146\1\u02f8\1\146\1\u02fa\1\uffff\1\u02fb\2\146\1\uffff\1\146\1\uffff\1\146\1\u0300\3\146\1\u0304\2\146\1\uffff\4\146\1\uffff\1\146\1\uffff\2\146\1\uffff\3\146\1\uffff\1\u0312\1\uffff\1\146\2\uffff\1\146\1\u0315\1\146\1\u0317\1\uffff\3\146\1\uffff\1\146\1\u031c\10\146\1\u0325\2\146\1\uffff\1\146\1\u0329\1\uffff\1\u032a\1\uffff\1\u032b\2\146\1\u032e\1\uffff\1\146\1\u0330\1\146\1\u0332\1\146\1\u0334\1\u0335\1\146\1\uffff\3\146\3\uffff\2\146\1\uffff\1\146\1\uffff\1\146\1\uffff\1\u033e\2\uffff\4\146\1\u0343\1\u0344\1\146\1\u0346\1\uffff\1\146\1\u0348\2\146\2\uffff\1\146\1\uffff\1\146\1\uffff\20\146\1\u035d\3\146\1\uffff\2\146\1\u0363\1\u0364\1\146\2\uffff\4\146\1\u036a\1\uffff";
     static final String DFA21_eofS =
-        "\u0305\uffff";
+        "\u036b\uffff";
     static final String DFA21_minS =
-        "\1\0\1\75\1\174\1\46\1\53\1\55\2\52\4\75\2\56\1\141\1\154\1\153\1\146\2\141\1\160\1\141\1\143\1\141\1\164\1\156\1\141\1\151\1\141\1\104\1\145\1\154\2\uffff\1\162\1\115\1\141\1\123\1\145\1\165\1\145\1\141\1\145\1\150\1\151\1\150\10\uffff\1\72\2\60\1\44\5\uffff\1\75\26\uffff\1\75\6\uffff\1\74\4\uffff\1\154\1\143\1\uffff\1\160\1\145\1\143\1\141\1\160\2\151\1\156\1\160\1\156\1\144\1\44\2\154\1\162\1\157\1\141\1\147\1\146\1\162\1\143\1\157\1\147\1\145\1\162\1\160\1\155\1\164\2\44\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\145\1\111\1\146\1\144\1\44\1\154\2\uffff\1\157\1\114\1\143\1\164\1\126\1\146\1\44\1\157\1\144\1\167\1\154\1\44\1\145\1\144\1\143\1\171\1\164\1\145\1\144\1\44\1\160\1\162\1\165\13\uffff\1\60\12\uffff\2\44\1\164\1\145\1\157\1\155\1\145\1\157\1\151\1\164\1\145\1\160\1\164\1\143\2\157\1\145\1\164\1\145\1\uffff\1\163\1\145\1\141\1\44\1\155\1\151\2\44\1\163\1\153\1\150\1\160\1\44\2\147\1\44\1\153\2\145\2\uffff\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\143\1\44\1\157\1\44\1\165\1\157\1\44\1\151\1\uffff\1\157\1\165\1\44\1\141\1\153\1\145\1\44\1\145\1\141\1\143\1\uffff\1\164\1\145\1\44\1\154\1\uffff\1\141\1\151\1\171\1\145\1\143\1\150\1\44\1\150\1\162\1\154\1\145\1\uffff\1\145\1\157\1\44\1\145\1\144\2\uffff\1\157\1\156\1\145\1\162\1\145\1\44\1\144\1\164\1\151\1\162\1\114\1\143\1\150\1\162\1\154\1\164\1\162\1\141\1\156\1\145\1\44\1\154\1\141\1\uffff\1\44\1\156\2\uffff\1\151\1\141\1\44\1\145\1\uffff\1\44\1\145\1\151\1\157\1\154\1\uffff\1\145\1\124\1\164\1\141\1\163\1\164\1\145\1\44\1\151\1\157\1\165\1\uffff\1\166\1\uffff\2\162\1\uffff\1\147\1\167\1\160\1\uffff\1\154\1\165\1\163\1\uffff\1\155\1\164\1\165\1\162\1\145\1\116\1\uffff\1\44\1\164\1\156\2\44\1\150\1\145\1\44\1\uffff\1\44\2\145\1\44\1\157\1\167\1\uffff\1\44\1\141\1\162\1\144\1\163\1\145\1\164\1\156\1\uffff\1\151\1\171\1\143\1\44\1\151\1\150\1\162\1\164\1\154\1\156\1\143\1\156\1\164\1\44\1\uffff\1\154\1\164\1\uffff\1\44\1\163\1\147\1\uffff\1\162\1\uffff\1\44\1\156\1\44\1\157\1\101\1\144\1\171\1\55\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\164\1\145\1\156\1\164\1\156\1\116\1\44\1\145\1\160\1\164\1\151\1\145\1\154\1\151\1\103\1\141\1\uffff\1\145\1\147\2\uffff\1\44\1\123\2\uffff\2\44\1\uffff\1\146\1\44\1\uffff\1\164\1\116\1\163\1\151\1\163\1\44\1\106\1\164\1\156\2\44\1\uffff\1\156\1\44\1\157\2\44\1\165\1\150\1\143\1\44\1\uffff\1\171\1\44\1\uffff\1\164\1\145\1\164\1\uffff\1\147\1\uffff\1\142\1\164\1\105\1\102\1\160\1\uffff\1\145\1\143\1\141\1\163\1\145\1\44\1\145\4\44\1\157\1\uffff\2\44\1\105\1\164\1\106\1\164\1\142\1\150\1\155\1\117\1\44\1\uffff\1\151\2\uffff\1\44\1\uffff\1\145\1\141\1\44\1\157\1\151\1\uffff\1\151\1\123\1\147\2\uffff\1\145\1\uffff\1\156\2\uffff\1\154\1\141\1\145\1\uffff\1\44\1\uffff\2\44\1\171\2\44\1\164\1\141\1\156\1\171\1\145\1\44\1\157\1\164\1\141\1\143\1\uffff\1\103\4\uffff\1\122\2\uffff\1\155\1\170\1\145\1\151\1\44\1\145\1\141\1\145\1\156\1\uffff\1\172\1\uffff\1\44\1\155\1\uffff\1\156\1\157\1\154\1\151\1\44\1\163\1\151\1\154\1\156\1\157\3\uffff\1\44\1\157\2\uffff\1\162\2\164\2\44\1\uffff\1\156\1\145\1\154\2\157\1\145\1\165\2\160\1\162\1\154\1\uffff\1\144\1\162\2\44\1\145\1\uffff\1\145\1\44\1\156\1\164\1\172\1\uffff\1\44\1\172\1\44\1\147\1\146\1\uffff\1\144\1\151\1\150\1\151\2\uffff\1\144\1\44\1\154\2\156\1\163\1\156\2\157\1\44\1\145\1\102\1\141\2\uffff\2\44\1\uffff\1\44\2\145\1\uffff\1\145\1\uffff\1\145\1\44\1\145\1\142\1\44\1\164\1\163\1\uffff\1\171\1\144\1\164\1\165\1\151\2\162\1\uffff\1\101\1\171\1\143\3\uffff\1\162\1\44\1\144\1\44\1\uffff\1\154\1\165\1\uffff\1\171\1\44\1\125\1\163\1\145\1\154\1\161\2\164\1\146\1\44\1\164\1\44\1\uffff\1\44\1\uffff\1\44\1\164\1\44\1\uffff\1\156\1\44\1\170\1\164\1\165\2\44\1\164\1\uffff\1\145\3\uffff\1\145\1\uffff\1\151\1\uffff\1\164\1\44\1\145\2\uffff\1\145\1\162\1\44\1\161\1\44\1\uffff\1\122\1\162\1\44\1\uffff\1\165\1\uffff\1\145\1\111\1\uffff\1\145\1\163\1\155\1\111\1\165\1\160\1\144\1\154\1\157\1\145\1\164\1\162\1\156\1\44\2\164\1\uffff\1\44\1\151\1\uffff\1\146\1\151\1\145\1\162\1\44\1\uffff";
+        "\1\0\1\75\1\174\1\46\1\53\1\55\2\52\4\75\2\56\1\141\1\154\1\153\1\146\2\141\1\160\1\141\1\143\1\141\1\164\1\156\1\141\1\151\1\141\1\104\1\145\1\154\2\uffff\1\162\1\115\1\141\1\123\1\145\1\165\1\151\1\145\1\141\1\145\1\150\1\151\1\150\10\uffff\1\72\1\156\2\60\1\44\5\uffff\1\75\26\uffff\1\75\6\uffff\1\74\4\uffff\1\154\1\143\1\uffff\1\160\1\145\1\143\1\141\1\160\2\151\1\156\1\160\1\156\2\44\2\154\1\162\1\157\1\141\1\147\1\146\1\162\1\143\1\157\1\147\1\145\1\162\1\160\1\155\1\164\2\44\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\145\1\111\1\146\1\147\1\144\1\44\1\154\2\uffff\1\157\1\114\1\143\1\146\1\164\1\126\1\146\1\44\1\157\1\170\1\144\1\167\1\154\1\44\1\145\1\144\1\143\1\171\1\145\1\164\1\144\1\44\1\160\1\162\1\151\12\uffff\1\160\1\143\1\uffff\1\60\12\uffff\2\44\1\164\1\145\1\157\1\155\1\145\1\157\1\151\1\164\1\145\1\160\1\164\1\143\2\157\1\145\1\164\1\145\2\uffff\1\163\1\145\1\141\1\44\1\155\1\151\2\44\1\163\1\153\1\150\1\160\1\44\2\147\1\44\1\153\2\145\2\uffff\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\143\1\44\1\157\1\44\1\165\1\157\1\150\1\44\1\151\1\uffff\1\157\1\165\1\44\1\141\1\153\1\145\1\147\1\164\1\145\1\44\1\145\1\141\1\143\1\uffff\1\164\2\145\1\44\1\154\1\uffff\1\141\1\151\1\171\1\145\1\143\1\150\1\151\1\44\1\162\1\154\1\150\1\145\1\uffff\1\145\1\157\1\44\1\155\2\145\1\141\1\144\2\uffff\1\157\1\156\1\145\1\162\1\145\1\44\1\144\1\164\1\151\1\162\1\114\1\143\1\150\1\162\1\154\1\164\1\162\1\141\1\156\1\145\1\44\1\154\1\141\1\uffff\1\44\1\156\2\uffff\1\151\1\141\1\44\1\145\1\uffff\1\44\1\145\2\151\1\157\1\154\1\uffff\1\145\1\124\1\164\1\141\1\163\1\164\1\145\1\44\1\151\1\157\1\165\1\uffff\1\166\1\162\1\uffff\2\162\1\164\1\uffff\1\147\1\167\1\160\1\uffff\1\154\1\165\1\162\1\164\1\124\1\163\1\uffff\1\155\1\164\1\165\1\162\1\145\1\144\1\116\1\uffff\1\44\1\164\1\156\2\44\1\150\1\145\1\164\1\44\1\uffff\2\145\2\44\1\157\1\167\1\uffff\2\44\1\162\1\160\1\141\1\162\1\144\1\163\1\145\1\164\1\156\1\uffff\1\151\1\171\1\143\1\44\1\151\1\150\1\162\1\164\1\154\1\156\1\143\1\156\1\164\1\44\1\uffff\1\154\1\164\1\uffff\1\44\1\163\1\147\1\uffff\1\162\1\uffff\1\44\1\156\1\157\1\170\1\44\1\157\1\101\1\144\1\171\1\55\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\164\2\145\1\156\1\164\1\124\1\156\1\116\1\44\1\145\1\160\1\103\1\150\1\162\1\164\1\151\1\145\1\154\1\151\1\103\1\44\1\141\1\uffff\1\145\1\147\2\uffff\1\44\1\123\1\141\1\uffff\2\44\2\uffff\1\146\1\44\2\uffff\1\103\1\151\1\164\1\116\1\163\1\151\1\163\1\44\1\106\1\164\1\156\2\44\1\uffff\1\156\1\44\1\157\2\44\1\165\1\150\1\143\1\44\1\uffff\1\171\1\44\1\uffff\1\164\1\145\1\164\1\uffff\1\147\1\155\1\145\1\uffff\1\142\1\164\1\105\1\102\1\160\1\uffff\1\145\1\143\1\141\1\163\1\145\1\44\1\145\1\44\1\156\2\44\1\162\1\44\1\157\1\uffff\2\44\1\141\1\44\1\151\1\105\1\164\1\106\1\164\1\142\1\150\1\uffff\1\155\1\117\1\44\1\uffff\1\151\1\154\2\uffff\1\44\1\uffff\1\141\1\164\1\145\1\141\1\44\1\157\1\151\1\uffff\1\151\1\123\1\147\2\uffff\1\145\1\uffff\1\156\2\uffff\1\154\1\141\1\145\1\uffff\1\44\1\uffff\2\44\1\171\2\44\1\144\1\44\1\164\1\141\1\156\1\171\1\145\1\44\1\157\1\164\1\141\1\143\1\uffff\1\103\1\uffff\1\143\2\uffff\1\151\1\uffff\1\122\2\uffff\1\163\1\uffff\2\155\1\170\1\145\1\151\1\44\1\145\1\141\1\145\1\156\1\uffff\1\172\1\151\1\uffff\1\163\1\141\1\44\1\155\1\uffff\1\156\1\157\1\154\1\151\1\44\1\163\1\151\1\154\1\156\1\157\3\uffff\1\44\1\157\2\uffff\1\114\1\uffff\1\162\2\164\2\44\1\uffff\1\156\1\145\1\154\2\157\1\145\1\155\2\145\1\44\2\160\1\162\1\154\1\uffff\1\144\1\162\2\44\1\145\1\172\1\145\1\154\1\uffff\1\145\1\44\1\156\1\164\1\172\1\uffff\1\44\1\172\1\44\1\147\1\146\1\uffff\1\144\1\145\1\151\1\150\1\151\2\uffff\1\144\1\44\1\154\2\156\1\144\1\44\1\163\1\44\1\uffff\2\157\1\44\1\145\1\102\1\141\2\uffff\1\44\1\145\1\44\1\151\1\44\1\uffff\1\44\2\145\1\uffff\1\145\1\uffff\1\145\1\44\1\145\1\156\1\142\1\44\1\164\1\163\1\uffff\1\171\1\144\1\164\1\102\1\uffff\1\165\1\uffff\2\162\1\uffff\1\101\1\171\1\143\1\uffff\1\44\1\uffff\1\172\2\uffff\1\162\1\44\1\144\1\44\1\uffff\1\154\1\147\1\165\1\uffff\1\171\1\44\1\125\1\163\1\145\1\171\1\154\2\164\1\146\1\44\1\164\1\151\1\uffff\1\145\1\44\1\uffff\1\44\1\uffff\1\44\2\164\1\44\1\uffff\1\156\1\44\1\170\1\44\1\164\2\44\1\164\1\uffff\1\145\1\162\1\106\3\uffff\1\150\1\145\1\uffff\1\151\1\uffff\1\164\1\uffff\1\44\2\uffff\1\145\1\162\1\163\1\151\2\44\1\161\1\44\1\uffff\1\162\1\44\1\164\1\162\2\uffff\1\165\1\uffff\1\111\1\uffff\1\127\1\163\1\145\1\155\1\157\1\164\1\111\1\160\1\162\1\127\1\144\1\157\1\144\1\157\1\145\1\162\1\44\1\162\1\156\1\164\1\uffff\1\144\1\164\2\44\1\151\2\uffff\1\146\1\151\1\145\1\162\1\44\1\uffff";
     static final String DFA21_maxS =
-        "\1\uffff\1\76\1\174\1\46\1\75\1\76\5\75\1\76\1\56\1\72\1\145\1\170\1\171\1\163\2\162\2\160\1\162\1\157\1\164\1\156\1\141\1\151\1\141\1\170\1\145\1\163\2\uffff\1\162\1\115\1\157\1\123\1\157\2\165\1\162\1\145\2\151\1\171\10\uffff\1\72\1\170\1\154\1\172\5\uffff\1\75\26\uffff\1\75\6\uffff\1\74\4\uffff\1\162\1\143\1\uffff\1\164\1\163\1\164\1\141\1\160\2\151\1\156\1\160\1\156\1\164\1\172\1\154\1\156\1\162\1\157\1\141\1\147\1\146\1\162\1\164\1\157\1\147\1\145\2\162\1\155\1\164\2\172\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\145\1\111\1\164\1\144\1\172\1\154\2\uffff\1\157\1\114\1\157\1\164\1\126\1\163\1\172\1\157\1\144\1\167\1\154\1\172\1\145\1\160\1\164\1\171\1\164\1\151\1\144\1\172\1\160\1\162\1\171\13\uffff\1\154\12\uffff\2\172\1\164\1\145\1\162\1\155\1\145\1\157\1\151\1\164\1\145\1\160\1\164\1\143\1\157\1\165\1\145\1\164\1\145\1\uffff\1\163\1\145\1\141\1\172\1\155\1\151\2\172\1\163\1\153\1\150\1\160\1\172\2\147\1\172\1\153\2\145\2\uffff\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\143\1\172\1\157\1\172\1\165\1\157\1\172\1\151\1\uffff\1\157\1\165\1\172\1\141\1\153\1\145\1\172\1\151\1\141\1\143\1\uffff\1\164\1\145\1\172\1\154\1\uffff\1\141\1\151\1\171\1\145\1\143\1\150\1\172\1\150\1\162\1\154\1\145\1\uffff\1\145\1\157\1\172\1\145\1\144\2\uffff\1\157\1\156\1\145\1\163\1\145\1\172\1\144\1\164\1\151\1\162\1\114\1\143\1\150\1\162\1\154\1\164\1\162\1\141\1\156\1\145\1\172\1\154\1\141\1\uffff\1\172\1\156\2\uffff\1\151\1\141\1\172\1\145\1\uffff\1\172\1\145\1\151\1\157\1\171\1\uffff\1\145\1\124\1\164\1\141\1\163\1\164\1\145\1\172\1\151\1\157\1\165\1\uffff\1\166\1\uffff\2\162\1\uffff\1\147\1\167\1\160\1\uffff\1\154\1\165\1\163\1\uffff\1\155\1\164\1\165\1\162\1\145\1\116\1\uffff\1\172\1\164\1\156\2\172\1\150\1\145\1\172\1\uffff\1\172\2\145\1\172\1\157\1\167\1\uffff\1\172\1\141\1\162\2\163\1\145\1\164\1\156\1\uffff\1\151\1\171\1\143\1\172\1\151\1\150\1\162\1\164\1\154\1\156\1\143\1\156\1\164\1\172\1\uffff\1\154\1\164\1\uffff\1\172\1\163\1\147\1\uffff\1\162\1\uffff\1\172\1\156\1\172\1\157\1\101\1\162\1\171\1\55\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\164\1\145\1\156\1\164\1\156\1\116\1\172\1\145\1\160\1\164\1\151\1\145\1\154\1\151\1\103\1\141\1\uffff\1\145\1\147\2\uffff\1\172\1\123\2\uffff\2\172\1\uffff\1\146\1\172\1\uffff\1\164\1\116\1\163\1\151\1\163\1\172\1\106\1\164\1\156\2\172\1\uffff\1\156\1\172\1\157\2\172\1\165\1\150\1\143\1\172\1\uffff\1\171\1\172\1\uffff\1\164\1\145\1\164\1\uffff\1\147\1\uffff\1\142\1\164\1\120\1\102\1\160\1\uffff\1\145\1\143\1\141\1\163\1\145\1\172\1\145\4\172\1\157\1\uffff\2\172\1\111\1\164\1\106\1\164\1\142\1\150\1\155\1\117\1\172\1\uffff\1\151\2\uffff\1\172\1\uffff\1\145\1\141\1\172\1\157\1\151\1\uffff\1\151\1\123\1\147\2\uffff\1\145\1\uffff\1\156\2\uffff\1\154\1\141\1\145\1\uffff\1\172\1\uffff\2\172\1\171\2\172\1\164\1\141\1\156\1\171\1\145\1\172\1\157\1\164\1\141\1\143\1\uffff\1\103\4\uffff\1\156\2\uffff\1\155\1\170\1\145\1\151\1\172\1\145\1\141\1\145\1\156\1\uffff\1\172\1\uffff\1\172\1\155\1\uffff\1\156\1\157\1\154\1\151\1\172\1\163\1\151\1\154\1\156\1\157\3\uffff\1\172\1\157\2\uffff\1\162\2\164\2\172\1\uffff\1\156\1\145\1\154\2\157\1\145\1\165\2\160\1\162\1\154\1\uffff\1\144\1\162\2\172\1\145\1\uffff\1\145\1\172\1\156\1\164\1\172\1\uffff\3\172\1\147\1\146\1\uffff\1\144\1\151\1\150\1\151\2\uffff\1\144\1\172\1\154\2\156\1\163\1\156\2\157\1\172\1\145\1\102\1\141\2\uffff\2\172\1\uffff\1\172\2\145\1\uffff\1\145\1\uffff\1\145\1\172\1\145\1\142\1\172\1\164\1\163\1\uffff\1\171\1\144\1\164\1\165\1\151\2\162\1\uffff\1\101\1\171\1\143\3\uffff\1\162\1\172\1\144\1\172\1\uffff\1\154\1\165\1\uffff\1\171\1\172\1\125\1\163\1\145\1\154\1\161\2\164\1\146\1\172\1\164\1\172\1\uffff\1\172\1\uffff\1\172\1\164\1\172\1\uffff\1\156\1\172\1\170\1\164\1\165\2\172\1\164\1\uffff\1\145\3\uffff\1\145\1\uffff\1\151\1\uffff\1\164\1\172\1\145\2\uffff\1\145\1\162\1\172\1\161\1\172\1\uffff\1\122\1\162\1\172\1\uffff\1\165\1\uffff\1\145\1\111\1\uffff\1\145\1\163\1\155\1\111\1\165\1\160\1\144\1\154\1\157\1\145\1\164\1\162\1\156\1\172\2\164\1\uffff\1\172\1\151\1\uffff\1\146\1\151\1\145\1\162\1\172\1\uffff";
+        "\1\uffff\1\76\1\174\1\46\1\75\1\76\5\75\1\76\1\56\1\72\1\145\1\170\1\171\1\163\2\162\2\160\1\162\1\157\1\164\1\156\1\141\1\151\1\141\1\170\1\151\1\163\2\uffff\1\162\1\115\1\157\1\123\1\157\1\165\1\151\1\165\1\162\1\145\2\151\1\171\10\uffff\1\72\1\160\1\170\1\154\1\172\5\uffff\1\75\26\uffff\1\75\6\uffff\1\74\4\uffff\1\162\1\143\1\uffff\1\164\1\163\1\164\1\141\1\160\2\151\1\156\1\160\1\156\2\172\1\154\1\156\1\162\1\157\1\141\1\147\1\146\1\162\1\164\1\157\1\147\1\145\2\162\1\155\1\164\2\172\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\145\1\111\1\164\1\147\1\144\1\172\1\154\2\uffff\1\157\1\114\1\167\1\156\1\164\1\126\1\163\1\172\1\157\1\170\1\144\1\167\1\154\1\172\1\145\1\160\1\164\1\171\1\151\1\164\1\144\1\172\1\160\1\162\1\171\12\uffff\1\160\1\143\1\uffff\1\154\12\uffff\2\172\1\164\1\145\1\162\1\155\1\145\1\157\1\151\1\164\1\145\1\160\1\164\1\143\1\157\1\165\1\145\1\164\1\145\2\uffff\1\163\1\145\1\141\1\172\1\155\1\151\2\172\1\163\1\153\1\150\1\160\1\172\2\147\1\172\1\153\2\145\2\uffff\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\143\1\172\1\157\1\172\1\165\1\157\1\150\1\172\1\151\1\uffff\1\157\1\165\1\172\1\141\1\153\1\145\1\147\1\164\1\145\1\172\1\151\1\141\1\143\1\uffff\1\164\2\145\1\172\1\154\1\uffff\1\141\1\151\1\171\1\145\1\143\1\150\1\151\1\172\1\162\1\154\1\150\1\145\1\uffff\1\145\1\157\1\172\1\155\2\145\1\141\1\144\2\uffff\1\157\1\156\1\145\1\163\1\145\1\172\1\144\1\164\1\151\1\162\1\114\1\143\1\150\1\162\1\154\1\164\1\162\1\141\1\156\1\145\1\172\1\154\1\141\1\uffff\1\172\1\156\2\uffff\1\151\1\141\1\172\1\145\1\uffff\1\172\1\145\1\151\1\162\1\157\1\171\1\uffff\1\145\1\124\1\164\1\141\1\163\1\164\1\145\1\172\1\151\1\157\1\165\1\uffff\1\166\1\162\1\uffff\2\162\1\164\1\uffff\1\147\1\167\1\160\1\uffff\1\154\1\165\1\162\1\164\1\124\1\163\1\uffff\1\155\1\164\1\165\1\162\1\145\1\144\1\116\1\uffff\1\172\1\164\1\156\2\172\1\150\1\145\1\164\1\172\1\uffff\2\145\2\172\1\157\1\167\1\uffff\2\172\1\162\1\160\1\141\1\162\2\163\1\145\1\164\1\156\1\uffff\1\151\1\171\1\143\1\172\1\151\1\150\1\162\1\164\1\154\1\156\1\143\1\156\1\164\1\172\1\uffff\1\154\1\164\1\uffff\1\172\1\163\1\147\1\uffff\1\162\1\uffff\1\172\1\156\1\157\1\170\1\172\1\157\1\101\1\162\1\171\1\55\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\164\2\145\1\156\1\164\1\124\1\156\1\116\1\172\1\145\1\160\1\103\1\150\1\162\1\164\1\151\1\145\1\154\1\151\1\103\1\172\1\141\1\uffff\1\145\1\147\2\uffff\1\172\1\123\1\141\1\uffff\2\172\2\uffff\1\146\1\172\2\uffff\1\103\1\151\1\164\1\116\1\163\1\151\1\163\1\172\1\106\1\164\1\156\2\172\1\uffff\1\156\1\172\1\157\2\172\1\165\1\150\1\143\1\172\1\uffff\1\171\1\172\1\uffff\1\164\1\145\1\164\1\uffff\1\147\1\155\1\145\1\uffff\1\142\1\164\1\120\1\102\1\160\1\uffff\1\145\1\143\1\141\1\163\1\145\1\172\1\145\1\172\1\156\2\172\1\162\1\172\1\157\1\uffff\2\172\1\141\1\172\1\151\1\111\1\164\1\106\1\164\1\142\1\150\1\uffff\1\155\1\117\1\172\1\uffff\1\151\1\154\2\uffff\1\172\1\uffff\1\141\1\164\1\145\1\141\1\172\1\157\1\151\1\uffff\1\151\1\123\1\147\2\uffff\1\145\1\uffff\1\156\2\uffff\1\154\1\141\1\145\1\uffff\1\172\1\uffff\2\172\1\171\2\172\1\144\1\172\1\164\1\141\1\156\1\171\1\145\1\172\1\157\1\164\1\141\1\143\1\uffff\1\103\1\uffff\1\143\2\uffff\1\151\1\uffff\1\122\2\uffff\1\163\1\uffff\2\155\1\170\1\145\1\151\1\172\1\145\1\141\1\145\1\156\1\uffff\1\172\1\151\1\uffff\1\163\1\141\1\172\1\155\1\uffff\1\156\1\157\1\154\1\151\1\172\1\163\1\151\1\154\1\156\1\157\3\uffff\1\172\1\157\2\uffff\1\114\1\uffff\1\162\2\164\2\172\1\uffff\1\156\1\145\1\154\2\157\1\145\1\155\2\145\1\172\2\160\1\162\1\154\1\uffff\1\144\1\162\2\172\1\145\1\172\1\145\1\154\1\uffff\1\145\1\172\1\156\1\164\1\172\1\uffff\3\172\1\147\1\146\1\uffff\1\144\1\145\1\151\1\150\1\151\2\uffff\1\144\1\172\1\154\2\156\1\144\1\172\1\163\1\172\1\uffff\2\157\1\172\1\145\1\102\1\141\2\uffff\1\172\1\145\1\172\1\151\1\172\1\uffff\1\172\2\145\1\uffff\1\145\1\uffff\1\145\1\172\1\145\1\156\1\142\1\172\1\164\1\163\1\uffff\1\171\1\144\1\164\1\102\1\uffff\1\165\1\uffff\2\162\1\uffff\1\101\1\171\1\143\1\uffff\1\172\1\uffff\1\172\2\uffff\1\162\1\172\1\144\1\172\1\uffff\1\154\1\147\1\165\1\uffff\1\171\1\172\1\125\1\163\1\145\1\171\1\154\2\164\1\146\1\172\1\164\1\151\1\uffff\1\145\1\172\1\uffff\1\172\1\uffff\1\172\2\164\1\172\1\uffff\1\156\1\172\1\170\1\172\1\164\2\172\1\164\1\uffff\1\145\1\162\1\106\3\uffff\1\150\1\145\1\uffff\1\151\1\uffff\1\164\1\uffff\1\172\2\uffff\1\145\1\162\1\163\1\151\2\172\1\161\1\172\1\uffff\1\162\1\172\1\164\1\162\2\uffff\1\165\1\uffff\1\111\1\uffff\1\127\1\163\1\145\1\155\1\157\1\164\1\111\1\160\1\162\1\127\1\144\1\157\1\144\1\157\1\145\1\162\1\172\1\162\1\156\1\164\1\uffff\1\144\1\164\2\172\1\151\2\uffff\1\146\1\151\1\145\1\162\1\172\1\uffff";
     static final String DFA21_acceptS =
-        "\40\uffff\1\76\1\77\14\uffff\1\154\1\155\1\156\1\157\1\160\1\161\1\162\1\163\4\uffff\1\u009e\2\u009f\1\u00a2\1\u00a3\1\uffff\1\23\1\1\1\2\1\u0098\1\3\1\u0087\1\4\1\35\1\26\1\5\1\20\1\36\1\27\1\6\1\31\1\30\1\7\1\u00a0\1\u00a1\1\32\1\10\1\33\1\uffff\1\34\1\15\1\16\1\24\1\70\1\17\1\uffff\1\37\1\25\1\u0097\1\u0086\2\uffff\1\u009e\53\uffff\1\76\1\77\27\uffff\1\154\1\155\1\156\1\157\1\160\1\161\1\162\1\163\1\u0096\1\170\1\u009b\1\uffff\1\u009c\1\u009d\1\u009f\1\u00a2\1\13\1\11\1\14\1\12\1\21\1\22\23\uffff\1\165\23\uffff\1\74\1\132\17\uffff\1\147\12\uffff\1\174\4\uffff\1\u0095\13\uffff\1\151\5\uffff\1\40\1\u0099\27\uffff\1\131\2\uffff\1\51\1\54\4\uffff\1\50\5\uffff\1\150\13\uffff\1\114\1\uffff\1\143\2\uffff\1\73\3\uffff\1\105\3\uffff\1\110\6\uffff\1\175\10\uffff\1\130\6\uffff\1\u0082\10\uffff\1\166\16\uffff\1\102\2\uffff\1\141\3\uffff\1\103\1\uffff\1\52\14\uffff\1\60\22\uffff\1\176\2\uffff\1\140\1\172\2\uffff\1\126\1\133\2\uffff\1\145\2\uffff\1\u009a\13\uffff\1\45\11\uffff\1\46\2\uffff\1\47\3\uffff\1\66\1\uffff\1\134\5\uffff\1\53\14\uffff\1\100\13\uffff\1\u0085\1\uffff\1\144\1\173\1\uffff\1\u0080\5\uffff\1\124\3\uffff\1\116\1\42\1\uffff\1\167\1\uffff\1\43\1\71\3\uffff\1\u008d\1\uffff\1\123\17\uffff\1\63\1\uffff\1\67\1\u0081\1\u008a\1\146\1\uffff\1\107\1\122\11\uffff\1\137\1\uffff\1\177\2\uffff\1\41\12\uffff\1\u0083\1\65\1\75\2\uffff\1\125\1\152\5\uffff\1\55\13\uffff\1\171\5\uffff\1\u008e\5\uffff\1\106\5\uffff\1\142\4\uffff\1\u0094\1\153\15\uffff\1\117\1\120\2\uffff\1\44\3\uffff\1\113\1\uffff\1\72\7\uffff\1\56\7\uffff\1\111\3\uffff\1\u0091\1\u0089\1\121\4\uffff\1\164\2\uffff\1\135\15\uffff\1\104\1\uffff\1\101\3\uffff\1\62\10\uffff\1\u0088\1\uffff\1\127\1\u0084\1\115\1\uffff\1\136\1\uffff\1\61\3\uffff\1\u008f\1\u0090\5\uffff\1\u0092\3\uffff\1\u008c\1\uffff\1\64\2\uffff\1\112\20\uffff\1\u0093\2\uffff\1\u008b\5\uffff\1\57";
+        "\40\uffff\1\76\1\77\15\uffff\1\162\1\163\1\164\1\165\1\166\1\167\1\170\1\171\5\uffff\1\u00ab\2\u00ac\1\u00af\1\u00b0\1\uffff\1\23\1\1\1\2\1\u00a5\1\3\1\u008d\1\4\1\35\1\26\1\5\1\20\1\36\1\27\1\6\1\31\1\30\1\7\1\u00ad\1\u00ae\1\32\1\10\1\33\1\uffff\1\34\1\15\1\16\1\24\1\70\1\17\1\uffff\1\37\1\25\1\u00a4\1\u008c\2\uffff\1\u00ab\54\uffff\1\76\1\77\31\uffff\1\162\1\163\1\164\1\165\1\166\1\167\1\170\1\171\1\u00a3\1\176\2\uffff\1\u00a8\1\uffff\1\u00a9\1\u00aa\1\u00ac\1\u00af\1\13\1\11\1\14\1\12\1\21\1\22\23\uffff\1\134\1\173\23\uffff\1\74\1\147\20\uffff\1\153\15\uffff\1\u0082\5\uffff\1\u00a2\14\uffff\1\155\10\uffff\1\40\1\u00a6\27\uffff\1\133\2\uffff\1\51\1\54\4\uffff\1\50\6\uffff\1\154\13\uffff\1\114\2\uffff\1\146\3\uffff\1\73\3\uffff\1\105\6\uffff\1\110\7\uffff\1\u0083\11\uffff\1\132\6\uffff\1\u0088\13\uffff\1\174\16\uffff\1\102\2\uffff\1\144\3\uffff\1\103\1\uffff\1\52\16\uffff\1\60\30\uffff\1\u0084\2\uffff\1\143\1\u0080\3\uffff\1\130\2\uffff\1\152\1\150\2\uffff\1\u009a\1\u00a7\15\uffff\1\45\11\uffff\1\46\2\uffff\1\47\3\uffff\1\66\3\uffff\1\136\5\uffff\1\53\16\uffff\1\100\13\uffff\1\116\3\uffff\1\u008b\2\uffff\1\137\1\u0081\1\uffff\1\u0086\7\uffff\1\126\3\uffff\1\117\1\42\1\uffff\1\175\1\uffff\1\43\1\71\3\uffff\1\u0093\1\uffff\1\125\21\uffff\1\63\1\uffff\1\67\1\uffff\1\u0087\1\u0090\1\uffff\1\151\1\uffff\1\107\1\124\1\uffff\1\161\12\uffff\1\142\2\uffff\1\u0085\4\uffff\1\41\12\uffff\1\u0089\1\65\1\75\2\uffff\1\127\1\135\1\uffff\1\156\5\uffff\1\55\16\uffff\1\177\10\uffff\1\u0094\5\uffff\1\106\5\uffff\1\145\5\uffff\1\u0099\1\157\11\uffff\1\u009b\6\uffff\1\121\1\122\5\uffff\1\44\3\uffff\1\113\1\uffff\1\72\10\uffff\1\56\4\uffff\1\u009c\1\uffff\1\u009d\2\uffff\1\111\3\uffff\1\u0098\1\uffff\1\u009e\1\uffff\1\u008f\1\123\4\uffff\1\172\3\uffff\1\140\15\uffff\1\u00a1\2\uffff\1\104\1\uffff\1\101\4\uffff\1\62\10\uffff\1\u008e\3\uffff\1\131\1\u008a\1\115\2\uffff\1\141\1\uffff\1\61\1\uffff\1\120\1\uffff\1\u0095\1\u0096\10\uffff\1\u0097\4\uffff\1\160\1\u0092\1\uffff\1\64\1\uffff\1\112\24\uffff\1\u009f\5\uffff\1\u0091\1\u00a0\5\uffff\1\57";
     static final String DFA21_specialS =
-        "\1\0\u0304\uffff}>";
+        "\1\0\u036a\uffff}>";
     static final String[] DFA21_transitionS = {
-            "\11\76\2\75\2\76\1\75\22\76\1\75\1\11\1\73\1\64\1\72\1\10\1\3\1\74\1\60\1\61\1\6\1\4\1\62\1\5\1\14\1\7\1\67\11\70\1\66\1\56\1\13\1\1\1\12\1\15\1\57\2\72\1\45\1\32\1\35\7\72\1\33\1\27\3\72\1\34\1\30\1\72\1\31\2\72\1\43\2\72\1\65\1\76\1\63\1\71\1\72\1\76\1\37\1\72\1\51\1\46\1\17\1\22\1\42\1\54\1\21\1\24\1\52\1\44\1\25\1\50\1\26\1\23\1\47\1\36\1\20\1\55\1\72\1\16\1\53\3\72\1\40\1\2\1\41\uff82\76",
-            "\1\77\1\100",
-            "\1\102",
+            "\11\100\2\77\2\100\1\77\22\100\1\77\1\11\1\75\1\65\1\74\1\10\1\3\1\76\1\61\1\62\1\6\1\4\1\63\1\5\1\14\1\7\1\71\11\72\1\67\1\57\1\13\1\1\1\12\1\15\1\60\2\74\1\45\1\32\1\35\1\50\6\74\1\33\1\27\3\74\1\34\1\30\1\74\1\31\2\74\1\43\2\74\1\66\1\100\1\64\1\73\1\74\1\100\1\37\1\74\1\52\1\46\1\17\1\22\1\42\1\55\1\21\1\24\1\53\1\44\1\25\1\51\1\26\1\23\1\47\1\36\1\20\1\56\1\70\1\16\1\54\3\74\1\40\1\2\1\41\uff82\100",
+            "\1\101\1\102",
             "\1\104",
-            "\1\107\21\uffff\1\106",
-            "\1\113\17\uffff\1\111\1\112",
-            "\1\116\22\uffff\1\115",
-            "\1\121\4\uffff\1\122\15\uffff\1\120",
-            "\1\124",
+            "\1\106",
+            "\1\111\21\uffff\1\110",
+            "\1\115\17\uffff\1\113\1\114",
+            "\1\120\22\uffff\1\117",
+            "\1\123\4\uffff\1\124\15\uffff\1\122",
             "\1\126",
             "\1\130",
-            "\1\133\1\132",
-            "\1\135",
-            "\1\140\13\uffff\1\137",
-            "\1\142\3\uffff\1\143",
-            "\1\146\1\uffff\1\147\11\uffff\1\145",
-            "\1\152\10\uffff\1\150\1\151\1\uffff\1\153\1\uffff\1\154",
-            "\1\160\6\uffff\1\155\1\157\4\uffff\1\156",
-            "\1\161\7\uffff\1\162\5\uffff\1\163\2\uffff\1\164",
-            "\1\171\2\uffff\1\167\1\170\6\uffff\1\165\1\uffff\1\166\3\uffff\1\172",
-            "\1\173",
-            "\1\176\3\uffff\1\175\3\uffff\1\177\6\uffff\1\174",
-            "\1\u0080\12\uffff\1\u0082\3\uffff\1\u0081",
-            "\1\u0084\15\uffff\1\u0083",
-            "\1\u0085",
-            "\1\u0086",
+            "\1\132",
+            "\1\135\1\134",
+            "\1\137",
+            "\1\142\13\uffff\1\141",
+            "\1\144\3\uffff\1\145",
+            "\1\150\1\uffff\1\151\11\uffff\1\147",
+            "\1\154\10\uffff\1\152\1\153\1\uffff\1\155\1\uffff\1\156",
+            "\1\162\6\uffff\1\157\1\161\4\uffff\1\160",
+            "\1\163\7\uffff\1\164\5\uffff\1\165\2\uffff\1\166",
+            "\1\173\2\uffff\1\171\1\172\6\uffff\1\167\1\uffff\1\170\3\uffff\1\174",
+            "\1\175",
+            "\1\u0080\3\uffff\1\177\3\uffff\1\u0081\6\uffff\1\176",
+            "\1\u0082\12\uffff\1\u0084\3\uffff\1\u0083",
+            "\1\u0086\15\uffff\1\u0085",
             "\1\u0087",
             "\1\u0088",
             "\1\u0089",
-            "\1\u008b\63\uffff\1\u008a",
-            "\1\u008c",
-            "\1\u008f\1\uffff\1\u008d\4\uffff\1\u008e",
+            "\1\u008a",
+            "\1\u008b",
+            "\1\u008d\63\uffff\1\u008c",
+            "\1\u008e\3\uffff\1\u008f",
+            "\1\u0092\1\uffff\1\u0090\4\uffff\1\u0091",
             "",
             "",
-            "\1\u0092",
-            "\1\u0093",
-            "\1\u0095\15\uffff\1\u0094",
+            "\1\u0095",
             "\1\u0096",
-            "\1\u0097\11\uffff\1\u0098",
-            "\1\u0099",
-            "\1\u009b\11\uffff\1\u009a\3\uffff\1\u009d\1\uffff\1\u009c",
-            "\1\u00a0\15\uffff\1\u009f\2\uffff\1\u009e",
-            "\1\u00a1",
-            "\1\u00a3\1\u00a2",
-            "\1\u00a4",
-            "\1\u00a7\6\uffff\1\u00a5\2\uffff\1\u00a8\6\uffff\1\u00a6",
+            "\1\u0099\3\uffff\1\u0098\11\uffff\1\u0097",
+            "\1\u009a",
+            "\1\u009b\11\uffff\1\u009c",
+            "\1\u009d",
+            "\1\u009e",
+            "\1\u00a0\11\uffff\1\u009f\3\uffff\1\u00a2\1\uffff\1\u00a1",
+            "\1\u00a5\15\uffff\1\u00a4\2\uffff\1\u00a3",
+            "\1\u00a6",
+            "\1\u00a7\1\u00a8",
+            "\1\u00a9",
+            "\1\u00ac\6\uffff\1\u00aa\2\uffff\1\u00ad\6\uffff\1\u00ab",
             "",
             "",
             "",
@@ -5462,16 +5840,17 @@
             "",
             "",
             "",
-            "\1\u00b1",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3\6\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "\1\144\34\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u00b6",
+            "\1\u00b9\1\uffff\1\u00b8",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\13\uffff\1\u00ba\6\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\13\uffff\1\u00ba",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\22\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd",
+            "\1\146\34\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
             "",
             "",
             "",
             "",
-            "\1\u00b9",
+            "\1\u00c0",
             "",
             "",
             "",
@@ -5494,209 +5873,195 @@
             "",
             "",
             "",
-            "\1\u00bb",
+            "\1\u00c2",
             "",
             "",
             "",
             "",
             "",
             "",
-            "\1\u00bd",
+            "\1\u00c4",
             "",
             "",
             "",
             "",
-            "\1\u00bf\5\uffff\1\u00c0",
-            "\1\u00c1",
-            "",
-            "\1\u00c3\3\uffff\1\u00c2",
-            "\1\u00c4\15\uffff\1\u00c5",
-            "\1\u00c6\20\uffff\1\u00c7",
+            "\1\u00c6\5\uffff\1\u00c7",
             "\1\u00c8",
-            "\1\u00c9",
-            "\1\u00ca",
-            "\1\u00cb",
-            "\1\u00cc",
-            "\1\u00cd",
-            "\1\u00ce",
-            "\1\u00d1\16\uffff\1\u00d0\1\u00cf",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "",
+            "\1\u00ca\3\uffff\1\u00c9",
+            "\1\u00cb\15\uffff\1\u00cc",
+            "\1\u00cd\20\uffff\1\u00ce",
+            "\1\u00cf",
+            "\1\u00d0",
+            "\1\u00d1",
+            "\1\u00d2",
             "\1\u00d3",
-            "\1\u00d4\1\uffff\1\u00d5",
-            "\1\u00d6",
-            "\1\u00d7",
-            "\1\u00d8",
-            "\1\u00d9",
-            "\1\u00da",
+            "\1\u00d4",
+            "\1\u00d5",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\3\146\1\u00d8\16\146\1\u00d7\1\u00d6\6\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u00db",
-            "\1\u00dc\20\uffff\1\u00dd",
+            "\1\u00dc\1\uffff\1\u00dd",
             "\1\u00de",
             "\1\u00df",
             "\1\u00e0",
             "\1\u00e1",
-            "\1\u00e2\1\uffff\1\u00e3",
-            "\1\u00e4",
-            "\1\u00e5",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u00e2",
+            "\1\u00e3",
+            "\1\u00e4\20\uffff\1\u00e5",
+            "\1\u00e6",
+            "\1\u00e7",
             "\1\u00e8",
             "\1\u00e9",
-            "\1\u00ea",
-            "\1\u00eb",
+            "\1\u00ea\1\uffff\1\u00eb",
             "\1\u00ec",
             "\1\u00ed",
-            "\1\u00ee",
-            "\1\u00ef",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u00f0",
-            "\1\u00f2\6\uffff\1\u00f1\2\uffff\1\u00f4\3\uffff\1\u00f3",
+            "\1\u00f1",
+            "\1\u00f2",
+            "\1\u00f3",
+            "\1\u00f4",
             "\1\u00f5",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\22\144\1\u00f6\7\144",
+            "\1\u00f6",
+            "\1\u00f7",
             "\1\u00f8",
-            "",
-            "",
-            "\1\u00f9",
-            "\1\u00fa",
-            "\1\u00fb\13\uffff\1\u00fc",
+            "\1\u00fa\6\uffff\1\u00f9\2\uffff\1\u00fc\3\uffff\1\u00fb",
             "\1\u00fd",
             "\1\u00fe",
-            "\1\u0100\5\uffff\1\u00ff\6\uffff\1\u0101",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\22\146\1\u00ff\7\146",
+            "\1\u0101",
+            "",
+            "",
+            "\1\u0102",
             "\1\u0103",
-            "\1\u0104",
-            "\1\u0105",
-            "\1\u0106",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0108",
-            "\1\u0109\13\uffff\1\u010a",
-            "\1\u010d\17\uffff\1\u010b\1\u010c",
-            "\1\u010e",
+            "\1\u0104\13\uffff\1\u0105\7\uffff\1\u0106",
+            "\1\u0108\7\uffff\1\u0107",
+            "\1\u0109",
+            "\1\u010a",
+            "\1\u010c\5\uffff\1\u010b\6\uffff\1\u010d",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u010f",
-            "\1\u0110\3\uffff\1\u0111",
+            "\1\u0110",
+            "\1\u0111",
             "\1\u0112",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0114",
+            "\1\u0113",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0115",
-            "\1\u0117\3\uffff\1\u0116",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\10\144\1\u0118\21\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u011b",
+            "\1\u0116\13\uffff\1\u0117",
+            "\1\u011a\14\uffff\1\u011b\2\uffff\1\u0118\1\u0119",
             "\1\u011c",
-            "\1\u011e\2\uffff\1\u011d",
+            "\1\u011d\3\uffff\1\u011e",
             "\1\u011f",
             "\1\u0120",
-            "\1\u0121",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0122",
             "\1\u0123",
-            "\1\u0124",
-            "\1\u0125",
-            "\1\u0126",
+            "\1\u0125\13\uffff\1\u0126\3\uffff\1\u0124",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u0127",
             "\1\u0128",
-            "\1\u012a\5\uffff\1\u0129",
-            "\1\u012b",
+            "",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\22\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\10\146\1\u0129\21\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u012c",
             "\1\u012d",
-            "",
-            "\1\u012e",
-            "\1\u012f",
+            "\1\u012f\2\uffff\1\u012e",
             "\1\u0130",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\14\144\1\u0131\15\144",
+            "\1\u0131",
+            "\1\u0132",
             "\1\u0133",
             "\1\u0134",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0135",
+            "\1\u0136",
             "\1\u0137",
             "\1\u0138",
             "\1\u0139",
-            "\1\u013a",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u013b\5\uffff\1\u013a",
             "\1\u013c",
             "\1\u013d",
-            "\1\144\13\uffff\12\144\7\uffff\1\144\1\u0140\21\144\1\u013f\6\144\4\uffff\1\144\1\uffff\17\144\1\u013e\12\144",
-            "\1\u0142",
-            "\1\u0143",
+            "\1\u013e",
+            "",
+            "",
+            "\1\u013f",
+            "\1\u0140",
+            "\1\u0141",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\14\146\1\u0142\15\146",
             "\1\u0144",
-            "",
-            "",
             "\1\u0145",
-            "\1\u0146",
-            "\1\u0147",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0148",
             "\1\u0149",
             "\1\u014a",
             "\1\u014b",
-            "\1\u014c",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u014d",
             "\1\u014e",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0150",
-            "\1\u0151",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0153",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\1\146\1\u0152\3\146\1\u0150\15\146\1\u0151\6\146\4\uffff\1\146\1\uffff\17\146\1\u014f\12\146",
             "\1\u0154",
             "\1\u0155",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0156",
+            "",
+            "",
             "\1\u0157",
             "\1\u0158",
             "\1\u0159",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u015c\3\uffff\1\u015b",
+            "\1\u015a",
+            "\1\u015b",
+            "\1\u015c",
             "\1\u015d",
             "\1\u015e",
-            "",
-            "\1\u015f",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0160",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0162",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\4\146\1\u0161\25\146",
             "\1\u0163",
             "\1\u0164",
             "\1\u0165",
-            "\1\u0166",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0167",
+            "",
             "\1\u0168",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\22\144\1\u0169\7\144",
+            "\1\u0169",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u016b",
             "\1\u016c",
             "\1\u016d",
             "\1\u016e",
-            "",
             "\1\u016f",
             "\1\u0170",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0172",
-            "\1\u0173",
-            "",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0173\3\uffff\1\u0172",
             "\1\u0174",
             "\1\u0175",
+            "",
             "\1\u0176",
-            "\1\u0178\1\u0177",
-            "\1\u0179",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0177",
+            "\1\u0178",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u017a",
+            "",
             "\1\u017b",
             "\1\u017c",
             "\1\u017d",
@@ -5704,32 +6069,29 @@
             "\1\u017f",
             "\1\u0180",
             "\1\u0181",
-            "\1\u0182",
-            "\1\u0183",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\22\146\1\u0182\7\146",
             "\1\u0184",
             "\1\u0185",
             "\1\u0186",
             "\1\u0187",
+            "",
             "\1\u0188",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u018a",
+            "\1\u0189",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u018b",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u018c",
             "\1\u018d",
-            "",
-            "",
             "\1\u018e",
             "\1\u018f",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "",
+            "",
+            "\1\u0190",
             "\1\u0191",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0193",
-            "\1\u0194",
+            "\1\u0192",
+            "\1\u0194\1\u0193",
             "\1\u0195",
-            "\1\u0196\14\uffff\1\u0197",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0197",
             "\1\u0198",
             "\1\u0199",
             "\1\u019a",
@@ -5737,52 +6099,51 @@
             "\1\u019c",
             "\1\u019d",
             "\1\u019e",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u019f",
             "\1\u01a0",
             "\1\u01a1",
             "\1\u01a2",
-            "",
             "\1\u01a3",
-            "",
             "\1\u01a4",
-            "\1\u01a5",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01a6",
             "\1\u01a7",
-            "\1\u01a8",
             "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01a9",
+            "",
+            "",
             "\1\u01aa",
             "\1\u01ab",
-            "",
-            "\1\u01ac",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01ad",
-            "\1\u01ae",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01af",
             "\1\u01b0",
-            "\1\u01b1",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01b2\10\uffff\1\u01b1",
             "\1\u01b3",
-            "\1\u01b4",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01b4\14\uffff\1\u01b5",
+            "",
+            "\1\u01b6",
             "\1\u01b7",
             "\1\u01b8",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01b9",
+            "\1\u01ba",
             "\1\u01bb",
             "\1\u01bc",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01be",
             "\1\u01bf",
+            "\1\u01c0",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "\1\u01c1",
             "\1\u01c2",
-            "\1\u01c3\16\uffff\1\u01c4",
+            "",
+            "\1\u01c3",
+            "\1\u01c4",
             "\1\u01c5",
+            "",
             "\1\u01c6",
             "\1\u01c7",
             "\1\u01c8",
@@ -5790,9 +6151,10 @@
             "\1\u01c9",
             "\1\u01ca",
             "\1\u01cb",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01cc",
             "\1\u01cd",
             "\1\u01ce",
+            "",
             "\1\u01cf",
             "\1\u01d0",
             "\1\u01d1",
@@ -5800,41 +6162,40 @@
             "\1\u01d3",
             "\1\u01d4",
             "\1\u01d5",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01d7",
             "\1\u01d8",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u01da",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01db",
-            "",
             "\1\u01dc",
+            "\1\u01dd",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u01de",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01df",
             "\1\u01e0",
-            "\1\u01e1",
-            "\1\u01e3\15\uffff\1\u01e2",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u01e3",
             "\1\u01e4",
-            "\1\u01e5",
-            "\1\u01e6",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01e7",
             "\1\u01e8",
             "\1\u01e9",
-            "",
             "\1\u01ea",
-            "\1\u01eb",
-            "\1\u01ec",
+            "\1\u01eb\16\uffff\1\u01ec",
             "\1\u01ed",
             "\1\u01ee",
             "\1\u01ef",
             "\1\u01f0",
+            "",
             "\1\u01f1",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u01f2",
             "\1\u01f3",
-            "\1\u01f4",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u01f5",
             "\1\u01f6",
             "\1\u01f7",
@@ -5842,344 +6203,462 @@
             "\1\u01f9",
             "\1\u01fa",
             "\1\u01fb",
-            "",
             "\1\u01fc",
             "\1\u01fd",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "\1\u01ff",
+            "\1\u0200",
             "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0202",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0203",
             "",
             "\1\u0204",
-            "\1\u0205",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0206",
             "\1\u0207",
             "\1\u0208",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u020a",
             "\1\u020b",
-            "\1\u020c",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u020d\15\uffff\1\u020c",
+            "\1\u020e",
             "\1\u020f",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0210",
             "\1\u0211",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0212",
+            "\1\u0213",
+            "",
             "\1\u0214",
             "\1\u0215",
             "\1\u0216",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u0217",
             "\1\u0218",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u0219",
             "\1\u021a",
             "\1\u021b",
             "\1\u021c",
-            "",
             "\1\u021d",
-            "",
-            "\1\u021e",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u021f",
-            "\1\u0221\12\uffff\1\u0220",
+            "\1\u0220",
+            "\1\u0221",
             "\1\u0222",
             "\1\u0223",
-            "",
             "\1\u0224",
             "\1\u0225",
             "\1\u0226",
             "\1\u0227",
             "\1\u0228",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u022a",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u022f",
+            "\1\u0229",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u022b",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0233\3\uffff\1\u0232",
-            "\1\u0234",
+            "\1\u022c",
+            "\1\u022d",
+            "",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u022f",
+            "\1\u0230",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "",
+            "\1\u0233",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "",
             "\1\u0235",
             "\1\u0236",
             "\1\u0237",
             "\1\u0238",
             "\1\u0239",
             "\1\u023a",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
-            "\1\u023c",
-            "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u023b",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u023d",
             "\1\u023e",
             "\1\u023f",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u0241",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
             "\1\u0242",
-            "",
-            "\1\u0243",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0244",
-            "\1\u0245",
-            "",
-            "",
-            "\1\u0246",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0247",
-            "",
-            "",
             "\1\u0248",
             "\1\u0249",
-            "\1\u024a",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u024b",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u024d",
             "\1\u024e",
-            "\1\144\13\uffff\12\144\7\uffff\14\144\1\u024f\15\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u024f",
+            "",
+            "\1\u0250",
+            "\1\u0251",
             "\1\u0252",
+            "",
             "\1\u0253",
             "\1\u0254",
-            "\1\u0255",
-            "\1\u0256",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0256\12\uffff\1\u0255",
+            "\1\u0257",
             "\1\u0258",
+            "",
             "\1\u0259",
             "\1\u025a",
             "\1\u025b",
-            "",
             "\1\u025c",
-            "",
-            "",
-            "",
-            "",
-            "\1\u025d\33\uffff\1\u025e",
-            "",
-            "",
+            "\1\u025d",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u025f",
-            "\1\u0260",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0261",
-            "\1\u0262",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0264",
-            "\1\u0265",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0266",
-            "\1\u0267",
             "",
-            "\1\u0268",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u026a",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0269",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u026b",
-            "\1\u026c",
-            "\1\u026d",
+            "\1\u026d\3\uffff\1\u026c",
             "\1\u026e",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u026f",
             "\1\u0270",
             "\1\u0271",
             "\1\u0272",
+            "",
             "\1\u0273",
             "\1\u0274",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
-            "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "\1\u0276",
-            "",
-            "",
             "\1\u0277",
-            "\1\u0278",
-            "\1\u0279",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\u0279",
+            "\1\u027a",
+            "\1\u027b",
             "\1\u027c",
-            "\1\u027d",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u027e",
             "\1\u027f",
+            "",
             "\1\u0280",
             "\1\u0281",
             "\1\u0282",
+            "",
+            "",
             "\1\u0283",
+            "",
             "\1\u0284",
+            "",
+            "",
             "\1\u0285",
             "\1\u0286",
-            "",
             "\1\u0287",
-            "\1\u0288",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u028b",
-            "",
-            "\1\u028c",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u028e",
+            "\1\146\13\uffff\12\146\7\uffff\14\146\1\u028c\15\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u028f",
-            "\1\u0290",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0291",
             "\1\u0292",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u0293",
             "\1\u0294",
             "\1\u0295",
-            "",
-            "\1\u0296",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0297",
             "\1\u0298",
             "\1\u0299",
-            "",
-            "",
             "\1\u029a",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "",
+            "\1\u029b",
+            "",
             "\1\u029c",
+            "",
+            "",
             "\1\u029d",
+            "",
             "\1\u029e",
+            "",
+            "",
             "\1\u029f",
+            "",
             "\1\u02a0",
             "\1\u02a1",
             "\1\u02a2",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02a3",
             "\1\u02a4",
-            "\1\u02a5",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02a6",
+            "\1\u02a7",
+            "\1\u02a8",
+            "\1\u02a9",
             "",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "\1\u02aa",
             "\1\u02ab",
             "",
             "\1\u02ac",
-            "",
             "\1\u02ad",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02af",
+            "",
             "\1\u02b0",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02b1",
             "\1\u02b2",
             "\1\u02b3",
-            "",
-            "\1\u02b4",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02b5",
             "\1\u02b6",
             "\1\u02b7",
             "\1\u02b8",
             "\1\u02b9",
-            "\1\u02ba",
             "",
+            "",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02bb",
+            "",
+            "",
             "\1\u02bc",
+            "",
             "\1\u02bd",
-            "",
-            "",
-            "",
             "\1\u02be",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u02c0",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02bf",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "",
             "\1\u02c2",
             "\1\u02c3",
-            "",
             "\1\u02c4",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02c5",
             "\1\u02c6",
             "\1\u02c7",
             "\1\u02c8",
             "\1\u02c9",
             "\1\u02ca",
-            "\1\u02cb",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02cc",
             "\1\u02cd",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02ce",
             "\1\u02cf",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u02d3",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u02d0",
+            "\1\u02d1",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u02d4",
             "\1\u02d5",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02d6",
             "\1\u02d7",
+            "",
             "\1\u02d8",
-            "\1\u02d9",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u02da",
+            "\1\u02db",
             "\1\u02dc",
             "",
-            "\1\u02dd",
-            "",
-            "",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02de",
-            "",
-            "\1\u02df",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02e0",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02e1",
+            "",
             "\1\u02e2",
-            "",
-            "",
             "\1\u02e3",
             "\1\u02e4",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\u02e5",
             "\1\u02e6",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
             "",
-            "\1\u02e8",
+            "",
+            "\1\u02e7",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02e9",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "",
+            "\1\u02ea",
             "\1\u02eb",
-            "",
             "\1\u02ec",
-            "\1\u02ed",
-            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02ee",
-            "\1\u02ef",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
             "\1\u02f0",
             "\1\u02f1",
-            "\1\u02f2",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02f3",
             "\1\u02f4",
             "\1\u02f5",
-            "\1\u02f6",
+            "",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02f7",
-            "\1\u02f8",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02f9",
-            "\1\u02fa",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u02fc",
             "\1\u02fd",
             "",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
-            "\1\u02ff",
+            "\1\u02fe",
             "",
-            "\1\u0300",
+            "\1\u02ff",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             "\1\u0301",
             "\1\u0302",
             "\1\u0303",
-            "\1\144\13\uffff\12\144\7\uffff\32\144\4\uffff\1\144\1\uffff\32\144",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0305",
+            "\1\u0306",
+            "",
+            "\1\u0307",
+            "\1\u0308",
+            "\1\u0309",
+            "\1\u030a",
+            "",
+            "\1\u030b",
+            "",
+            "\1\u030c",
+            "\1\u030d",
+            "",
+            "\1\u030e",
+            "\1\u030f",
+            "\1\u0310",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\5\146\1\u0311\24\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\u0313",
+            "",
+            "",
+            "\1\u0314",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0316",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\u0318",
+            "\1\u0319",
+            "\1\u031a",
+            "",
+            "\1\u031b",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u031d",
+            "\1\u031e",
+            "\1\u031f",
+            "\1\u0320",
+            "\1\u0321",
+            "\1\u0322",
+            "\1\u0323",
+            "\1\u0324",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0326",
+            "\1\u0327",
+            "",
+            "\1\u0328",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u032c",
+            "\1\u032d",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\u032f",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0331",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0333",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0336",
+            "",
+            "\1\u0337",
+            "\1\u0338",
+            "\1\u0339",
+            "",
+            "",
+            "",
+            "\1\u033a",
+            "\1\u033b",
+            "",
+            "\1\u033c",
+            "",
+            "\1\u033d",
+            "",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "",
+            "\1\u033f",
+            "\1\u0340",
+            "\1\u0341",
+            "\1\u0342",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0345",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "",
+            "\1\u0347",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0349",
+            "\1\u034a",
+            "",
+            "",
+            "\1\u034b",
+            "",
+            "\1\u034c",
+            "",
+            "\1\u034d",
+            "\1\u034e",
+            "\1\u034f",
+            "\1\u0350",
+            "\1\u0351",
+            "\1\u0352",
+            "\1\u0353",
+            "\1\u0354",
+            "\1\u0355",
+            "\1\u0356",
+            "\1\u0357",
+            "\1\u0358",
+            "\1\u0359",
+            "\1\u035a",
+            "\1\u035b",
+            "\1\u035c",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u035e",
+            "\1\u035f",
+            "\1\u0360",
+            "",
+            "\1\u0361",
+            "\1\u0362",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
+            "\1\u0365",
+            "",
+            "",
+            "\1\u0366",
+            "\1\u0367",
+            "\1\u0368",
+            "\1\u0369",
+            "\1\146\13\uffff\12\146\7\uffff\32\146\4\uffff\1\146\1\uffff\32\146",
             ""
     };
 
@@ -6213,7 +6692,7 @@
             this.transition = DFA21_transition;
         }
         public String getDescription() {
-            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             IntStream input = _input;
@@ -6301,51 +6780,55 @@
 
                         else if ( (LA21_0=='q') ) {s = 39;}
 
-                        else if ( (LA21_0=='n') ) {s = 40;}
+                        else if ( (LA21_0=='F') ) {s = 40;}
 
-                        else if ( (LA21_0=='c') ) {s = 41;}
+                        else if ( (LA21_0=='n') ) {s = 41;}
 
-                        else if ( (LA21_0=='k') ) {s = 42;}
+                        else if ( (LA21_0=='c') ) {s = 42;}
 
-                        else if ( (LA21_0=='w') ) {s = 43;}
+                        else if ( (LA21_0=='k') ) {s = 43;}
 
-                        else if ( (LA21_0=='h') ) {s = 44;}
+                        else if ( (LA21_0=='w') ) {s = 44;}
 
-                        else if ( (LA21_0=='t') ) {s = 45;}
+                        else if ( (LA21_0=='h') ) {s = 45;}
 
-                        else if ( (LA21_0==';') ) {s = 46;}
+                        else if ( (LA21_0=='t') ) {s = 46;}
 
-                        else if ( (LA21_0=='@') ) {s = 47;}
+                        else if ( (LA21_0==';') ) {s = 47;}
 
-                        else if ( (LA21_0=='(') ) {s = 48;}
+                        else if ( (LA21_0=='@') ) {s = 48;}
 
-                        else if ( (LA21_0==')') ) {s = 49;}
+                        else if ( (LA21_0=='(') ) {s = 49;}
 
-                        else if ( (LA21_0==',') ) {s = 50;}
+                        else if ( (LA21_0==')') ) {s = 50;}
 
-                        else if ( (LA21_0==']') ) {s = 51;}
+                        else if ( (LA21_0==',') ) {s = 51;}
 
-                        else if ( (LA21_0=='#') ) {s = 52;}
+                        else if ( (LA21_0==']') ) {s = 52;}
 
-                        else if ( (LA21_0=='[') ) {s = 53;}
+                        else if ( (LA21_0=='#') ) {s = 53;}
 
-                        else if ( (LA21_0==':') ) {s = 54;}
+                        else if ( (LA21_0=='[') ) {s = 54;}
 
-                        else if ( (LA21_0=='0') ) {s = 55;}
+                        else if ( (LA21_0==':') ) {s = 55;}
 
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 56;}
+                        else if ( (LA21_0=='u') ) {s = 56;}
 
-                        else if ( (LA21_0=='^') ) {s = 57;}
+                        else if ( (LA21_0=='0') ) {s = 57;}
 
-                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='B')||(LA21_0>='F' && LA21_0<='L')||(LA21_0>='O' && LA21_0<='Q')||LA21_0=='T'||(LA21_0>='V' && LA21_0<='W')||(LA21_0>='Y' && LA21_0<='Z')||LA21_0=='_'||LA21_0=='b'||LA21_0=='u'||(LA21_0>='x' && LA21_0<='z')) ) {s = 58;}
+                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 58;}
 
-                        else if ( (LA21_0=='\"') ) {s = 59;}
+                        else if ( (LA21_0=='^') ) {s = 59;}
 
-                        else if ( (LA21_0=='\'') ) {s = 60;}
+                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='B')||(LA21_0>='G' && LA21_0<='L')||(LA21_0>='O' && LA21_0<='Q')||LA21_0=='T'||(LA21_0>='V' && LA21_0<='W')||(LA21_0>='Y' && LA21_0<='Z')||LA21_0=='_'||LA21_0=='b'||(LA21_0>='x' && LA21_0<='z')) ) {s = 60;}
 
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 61;}
+                        else if ( (LA21_0=='\"') ) {s = 61;}
 
-                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 62;}
+                        else if ( (LA21_0=='\'') ) {s = 62;}
+
+                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 63;}
+
+                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 64;}
 
                         if ( s>=0 ) return s;
                         break;
diff --git a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLParser.java b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLParser.java
index 41aad7a..c4ff452 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLParser.java
+++ b/org.eclipse.osbp.xtext.datainterchange.ide/src-gen/org/eclipse/osbp/xtext/datainterchange/ide/contentassist/antlr/internal/InternalDataDSLParser.java
@@ -40,7 +40,7 @@
 @SuppressWarnings("all")
 public class InternalDataDSLParser extends AbstractInternalContentAssistParser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'plain'", "'jpg'", "'png'", "'mpeg'", "'octet-stream'", "'pdf'", "'NowDate'", "'StartDate'", "'UniversallyUniqueIdentifier'", "'Date'", "'Milliseconds'", "'Nanoseconds'", "'Random'", "'ExecuteContext'", "'persist'", "'merge'", "'remove'", "'<='", "'isnull'", "'isnotnull'", "'and'", "'or'", "'package'", "'{'", "'}'", "'group'", "'interchange'", "'file'", "'path'", "'elementSize'", "'XML'", "'encoding'", "'locale'", "'CSV'", "'delimiter'", "'quoteCharacter'", "'skipLines'", "'EDI'", "'mappingModel'", "'entity'", "'nodeName'", "'createOn'", "'expression'", "'lookup'", "'format'", "'expose'", "'mapping'", "'keys'", "'exportFilter'", "'key'", "'for'", "'on'", "'with'", "'mapTo'", "'markerPath'", "'markerEntity'", "'coding'", "'copy'", "'from'", "'property'", "'ref'", "'where'", "'hide'", "'assign'", "'as'", "'map'", "'to'", "'mapBlob'", "'mimeType'", "';'", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'describedBy'", "'vectorName'", "'report'", "'deleteFileAfterImport'", "'mapByAttribute'", "'indent'", "'validate'", "'latestImport'", "'latestExport'", "'cacheSize'", "'allowNoResult'", "'allowNonuniqueResult'", "'markedBy'", "'ns'", "'::'", "'?.'", "'|'", "'var'", "'true'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_ID", "RULE_HEX", "RULE_INT", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'='", "'||'", "'&&'", "'+='", "'-='", "'*='", "'/='", "'%='", "'=='", "'!='", "'==='", "'!=='", "'>='", "'>'", "'<'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'*'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'.'", "'val'", "'extends'", "'static'", "'import'", "'extension'", "'super'", "'false'", "'plain'", "'jpg'", "'png'", "'mpeg'", "'octet-stream'", "'pdf'", "'NowDate'", "'StartDate'", "'UniversallyUniqueIdentifier'", "'Date'", "'Milliseconds'", "'Nanoseconds'", "'Random'", "'ExecuteContext'", "'persist'", "'merge'", "'remove'", "'<='", "'isnull'", "'isnotnull'", "'and'", "'or'", "'package'", "'{'", "'}'", "'group'", "'interchange'", "'file'", "'path'", "'elementSize'", "'XML'", "'encoding'", "'locale'", "'CSV'", "'delimiter'", "'quoteCharacter'", "'skipLines'", "'EDI'", "'mappingModel'", "'Fixed'", "'entity'", "'referencedBy'", "'nodeName'", "'createOn'", "'expression'", "'lookup'", "'format'", "'expose'", "'mapping'", "'keys'", "'exportFilter'", "'key'", "'for'", "'in'", "'mapFrom'", "'mapTo'", "'where'", "'markerPath'", "'markerEntity'", "'coding'", "'copy'", "'from'", "'property'", "'ref'", "'on'", "'hide'", "'assign'", "'with'", "'as'", "'map'", "'to'", "'mapBlob'", "'mimeType'", "'mapFixedLength'", "'length'", "';'", "'@'", "'('", "')'", "','", "']'", "'#'", "'['", "'instanceof'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'while'", "'do'", "'new'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'describedBy'", "'vectorName'", "'report'", "'deleteFileAfterImport'", "'mapByAttribute'", "'indent'", "'validate'", "'latestImport'", "'latestExport'", "'allowNoResult'", "'cacheSize'", "'markedBy'", "'trim'", "'leftTrim'", "'rightTrim'", "'lowerCase'", "'upperCase'", "'capitalizeFirstWord'", "'uncapitalizeFirstWord'", "'capitalize'", "'ns'", "'::'", "'?.'", "'|'", "'var'", "'true'"
     };
     public static final int T__144=144;
     public static final int T__143=143;
@@ -90,6 +90,8 @@
     public static final int T__127=127;
     public static final int T__166=166;
     public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
     public static final int T__162=162;
     public static final int T__161=161;
     public static final int T__164=164;
@@ -148,6 +150,16 @@
     public static final int T__96=96;
     public static final int T__97=97;
     public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
     public static final int RULE_DECIMAL=8;
     public static final int T__26=26;
     public static final int T__27=27;
@@ -157,6 +169,7 @@
     public static final int T__23=23;
     public static final int T__24=24;
     public static final int T__25=25;
+    public static final int T__169=169;
     public static final int T__20=20;
     public static final int T__21=21;
     public static final int T__122=122;
@@ -922,12 +935,97 @@
     // $ANTLR end "ruleDataInterchangeFileEDI"
 
 
+    // $ANTLR start "entryRuleDataInterchangeFileFixed"
+    // InternalDataDSL.g:269:1: entryRuleDataInterchangeFileFixed : ruleDataInterchangeFileFixed EOF ;
+    public final void entryRuleDataInterchangeFileFixed() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:270:1: ( ruleDataInterchangeFileFixed EOF )
+            // InternalDataDSL.g:271:1: ruleDataInterchangeFileFixed EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeFileFixed();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeFileFixed"
+
+
+    // $ANTLR start "ruleDataInterchangeFileFixed"
+    // InternalDataDSL.g:278:1: ruleDataInterchangeFileFixed : ( ( rule__DataInterchangeFileFixed__Group__0 ) ) ;
+    public final void ruleDataInterchangeFileFixed() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:282:2: ( ( ( rule__DataInterchangeFileFixed__Group__0 ) ) )
+            // InternalDataDSL.g:283:2: ( ( rule__DataInterchangeFileFixed__Group__0 ) )
+            {
+            // InternalDataDSL.g:283:2: ( ( rule__DataInterchangeFileFixed__Group__0 ) )
+            // InternalDataDSL.g:284:3: ( rule__DataInterchangeFileFixed__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup()); 
+            }
+            // InternalDataDSL.g:285:3: ( rule__DataInterchangeFileFixed__Group__0 )
+            // InternalDataDSL.g:285:4: rule__DataInterchangeFileFixed__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeFileFixed"
+
+
     // $ANTLR start "entryRuleDataInterchangeBean"
-    // InternalDataDSL.g:269:1: entryRuleDataInterchangeBean : ruleDataInterchangeBean EOF ;
+    // InternalDataDSL.g:294:1: entryRuleDataInterchangeBean : ruleDataInterchangeBean EOF ;
     public final void entryRuleDataInterchangeBean() throws RecognitionException {
         try {
-            // InternalDataDSL.g:270:1: ( ruleDataInterchangeBean EOF )
-            // InternalDataDSL.g:271:1: ruleDataInterchangeBean EOF
+            // InternalDataDSL.g:295:1: ( ruleDataInterchangeBean EOF )
+            // InternalDataDSL.g:296:1: ruleDataInterchangeBean EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanRule()); 
@@ -957,23 +1055,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeBean"
-    // InternalDataDSL.g:278:1: ruleDataInterchangeBean : ( ( rule__DataInterchangeBean__Group__0 ) ) ;
+    // InternalDataDSL.g:303:1: ruleDataInterchangeBean : ( ( rule__DataInterchangeBean__Group__0 ) ) ;
     public final void ruleDataInterchangeBean() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:282:2: ( ( ( rule__DataInterchangeBean__Group__0 ) ) )
-            // InternalDataDSL.g:283:2: ( ( rule__DataInterchangeBean__Group__0 ) )
+            // InternalDataDSL.g:307:2: ( ( ( rule__DataInterchangeBean__Group__0 ) ) )
+            // InternalDataDSL.g:308:2: ( ( rule__DataInterchangeBean__Group__0 ) )
             {
-            // InternalDataDSL.g:283:2: ( ( rule__DataInterchangeBean__Group__0 ) )
-            // InternalDataDSL.g:284:3: ( rule__DataInterchangeBean__Group__0 )
+            // InternalDataDSL.g:308:2: ( ( rule__DataInterchangeBean__Group__0 ) )
+            // InternalDataDSL.g:309:3: ( rule__DataInterchangeBean__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup()); 
             }
-            // InternalDataDSL.g:285:3: ( rule__DataInterchangeBean__Group__0 )
-            // InternalDataDSL.g:285:4: rule__DataInterchangeBean__Group__0
+            // InternalDataDSL.g:310:3: ( rule__DataInterchangeBean__Group__0 )
+            // InternalDataDSL.g:310:4: rule__DataInterchangeBean__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__Group__0();
@@ -1008,11 +1106,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeKey"
-    // InternalDataDSL.g:294:1: entryRuleDataInterchangeKey : ruleDataInterchangeKey EOF ;
+    // InternalDataDSL.g:319:1: entryRuleDataInterchangeKey : ruleDataInterchangeKey EOF ;
     public final void entryRuleDataInterchangeKey() throws RecognitionException {
         try {
-            // InternalDataDSL.g:295:1: ( ruleDataInterchangeKey EOF )
-            // InternalDataDSL.g:296:1: ruleDataInterchangeKey EOF
+            // InternalDataDSL.g:320:1: ( ruleDataInterchangeKey EOF )
+            // InternalDataDSL.g:321:1: ruleDataInterchangeKey EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyRule()); 
@@ -1042,23 +1140,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeKey"
-    // InternalDataDSL.g:303:1: ruleDataInterchangeKey : ( ( rule__DataInterchangeKey__Group__0 ) ) ;
+    // InternalDataDSL.g:328:1: ruleDataInterchangeKey : ( ( rule__DataInterchangeKey__Group__0 ) ) ;
     public final void ruleDataInterchangeKey() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:307:2: ( ( ( rule__DataInterchangeKey__Group__0 ) ) )
-            // InternalDataDSL.g:308:2: ( ( rule__DataInterchangeKey__Group__0 ) )
+            // InternalDataDSL.g:332:2: ( ( ( rule__DataInterchangeKey__Group__0 ) ) )
+            // InternalDataDSL.g:333:2: ( ( rule__DataInterchangeKey__Group__0 ) )
             {
-            // InternalDataDSL.g:308:2: ( ( rule__DataInterchangeKey__Group__0 ) )
-            // InternalDataDSL.g:309:3: ( rule__DataInterchangeKey__Group__0 )
+            // InternalDataDSL.g:333:2: ( ( rule__DataInterchangeKey__Group__0 ) )
+            // InternalDataDSL.g:334:3: ( rule__DataInterchangeKey__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getGroup()); 
             }
-            // InternalDataDSL.g:310:3: ( rule__DataInterchangeKey__Group__0 )
-            // InternalDataDSL.g:310:4: rule__DataInterchangeKey__Group__0
+            // InternalDataDSL.g:335:3: ( rule__DataInterchangeKey__Group__0 )
+            // InternalDataDSL.g:335:4: rule__DataInterchangeKey__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeKey__Group__0();
@@ -1093,11 +1191,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeLookup"
-    // InternalDataDSL.g:319:1: entryRuleDataInterchangeLookup : ruleDataInterchangeLookup EOF ;
+    // InternalDataDSL.g:344:1: entryRuleDataInterchangeLookup : ruleDataInterchangeLookup EOF ;
     public final void entryRuleDataInterchangeLookup() throws RecognitionException {
         try {
-            // InternalDataDSL.g:320:1: ( ruleDataInterchangeLookup EOF )
-            // InternalDataDSL.g:321:1: ruleDataInterchangeLookup EOF
+            // InternalDataDSL.g:345:1: ( ruleDataInterchangeLookup EOF )
+            // InternalDataDSL.g:346:1: ruleDataInterchangeLookup EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupRule()); 
@@ -1127,23 +1225,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeLookup"
-    // InternalDataDSL.g:328:1: ruleDataInterchangeLookup : ( ( rule__DataInterchangeLookup__Group__0 ) ) ;
+    // InternalDataDSL.g:353:1: ruleDataInterchangeLookup : ( ( rule__DataInterchangeLookup__Group__0 ) ) ;
     public final void ruleDataInterchangeLookup() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:332:2: ( ( ( rule__DataInterchangeLookup__Group__0 ) ) )
-            // InternalDataDSL.g:333:2: ( ( rule__DataInterchangeLookup__Group__0 ) )
+            // InternalDataDSL.g:357:2: ( ( ( rule__DataInterchangeLookup__Group__0 ) ) )
+            // InternalDataDSL.g:358:2: ( ( rule__DataInterchangeLookup__Group__0 ) )
             {
-            // InternalDataDSL.g:333:2: ( ( rule__DataInterchangeLookup__Group__0 ) )
-            // InternalDataDSL.g:334:3: ( rule__DataInterchangeLookup__Group__0 )
+            // InternalDataDSL.g:358:2: ( ( rule__DataInterchangeLookup__Group__0 ) )
+            // InternalDataDSL.g:359:3: ( rule__DataInterchangeLookup__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getGroup()); 
             }
-            // InternalDataDSL.g:335:3: ( rule__DataInterchangeLookup__Group__0 )
-            // InternalDataDSL.g:335:4: rule__DataInterchangeLookup__Group__0
+            // InternalDataDSL.g:360:3: ( rule__DataInterchangeLookup__Group__0 )
+            // InternalDataDSL.g:360:4: rule__DataInterchangeLookup__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeLookup__Group__0();
@@ -1178,11 +1276,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMarkerPath"
-    // InternalDataDSL.g:344:1: entryRuleDataInterchangeMarkerPath : ruleDataInterchangeMarkerPath EOF ;
+    // InternalDataDSL.g:369:1: entryRuleDataInterchangeMarkerPath : ruleDataInterchangeMarkerPath EOF ;
     public final void entryRuleDataInterchangeMarkerPath() throws RecognitionException {
         try {
-            // InternalDataDSL.g:345:1: ( ruleDataInterchangeMarkerPath EOF )
-            // InternalDataDSL.g:346:1: ruleDataInterchangeMarkerPath EOF
+            // InternalDataDSL.g:370:1: ( ruleDataInterchangeMarkerPath EOF )
+            // InternalDataDSL.g:371:1: ruleDataInterchangeMarkerPath EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathRule()); 
@@ -1212,23 +1310,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeMarkerPath"
-    // InternalDataDSL.g:353:1: ruleDataInterchangeMarkerPath : ( ( rule__DataInterchangeMarkerPath__Group__0 ) ) ;
+    // InternalDataDSL.g:378:1: ruleDataInterchangeMarkerPath : ( ( rule__DataInterchangeMarkerPath__Group__0 ) ) ;
     public final void ruleDataInterchangeMarkerPath() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:357:2: ( ( ( rule__DataInterchangeMarkerPath__Group__0 ) ) )
-            // InternalDataDSL.g:358:2: ( ( rule__DataInterchangeMarkerPath__Group__0 ) )
+            // InternalDataDSL.g:382:2: ( ( ( rule__DataInterchangeMarkerPath__Group__0 ) ) )
+            // InternalDataDSL.g:383:2: ( ( rule__DataInterchangeMarkerPath__Group__0 ) )
             {
-            // InternalDataDSL.g:358:2: ( ( rule__DataInterchangeMarkerPath__Group__0 ) )
-            // InternalDataDSL.g:359:3: ( rule__DataInterchangeMarkerPath__Group__0 )
+            // InternalDataDSL.g:383:2: ( ( rule__DataInterchangeMarkerPath__Group__0 ) )
+            // InternalDataDSL.g:384:3: ( rule__DataInterchangeMarkerPath__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getGroup()); 
             }
-            // InternalDataDSL.g:360:3: ( rule__DataInterchangeMarkerPath__Group__0 )
-            // InternalDataDSL.g:360:4: rule__DataInterchangeMarkerPath__Group__0
+            // InternalDataDSL.g:385:3: ( rule__DataInterchangeMarkerPath__Group__0 )
+            // InternalDataDSL.g:385:4: rule__DataInterchangeMarkerPath__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerPath__Group__0();
@@ -1263,11 +1361,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMarkerEntity"
-    // InternalDataDSL.g:369:1: entryRuleDataInterchangeMarkerEntity : ruleDataInterchangeMarkerEntity EOF ;
+    // InternalDataDSL.g:394:1: entryRuleDataInterchangeMarkerEntity : ruleDataInterchangeMarkerEntity EOF ;
     public final void entryRuleDataInterchangeMarkerEntity() throws RecognitionException {
         try {
-            // InternalDataDSL.g:370:1: ( ruleDataInterchangeMarkerEntity EOF )
-            // InternalDataDSL.g:371:1: ruleDataInterchangeMarkerEntity EOF
+            // InternalDataDSL.g:395:1: ( ruleDataInterchangeMarkerEntity EOF )
+            // InternalDataDSL.g:396:1: ruleDataInterchangeMarkerEntity EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityRule()); 
@@ -1297,23 +1395,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeMarkerEntity"
-    // InternalDataDSL.g:378:1: ruleDataInterchangeMarkerEntity : ( ( rule__DataInterchangeMarkerEntity__Group__0 ) ) ;
+    // InternalDataDSL.g:403:1: ruleDataInterchangeMarkerEntity : ( ( rule__DataInterchangeMarkerEntity__Group__0 ) ) ;
     public final void ruleDataInterchangeMarkerEntity() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:382:2: ( ( ( rule__DataInterchangeMarkerEntity__Group__0 ) ) )
-            // InternalDataDSL.g:383:2: ( ( rule__DataInterchangeMarkerEntity__Group__0 ) )
+            // InternalDataDSL.g:407:2: ( ( ( rule__DataInterchangeMarkerEntity__Group__0 ) ) )
+            // InternalDataDSL.g:408:2: ( ( rule__DataInterchangeMarkerEntity__Group__0 ) )
             {
-            // InternalDataDSL.g:383:2: ( ( rule__DataInterchangeMarkerEntity__Group__0 ) )
-            // InternalDataDSL.g:384:3: ( rule__DataInterchangeMarkerEntity__Group__0 )
+            // InternalDataDSL.g:408:2: ( ( rule__DataInterchangeMarkerEntity__Group__0 ) )
+            // InternalDataDSL.g:409:3: ( rule__DataInterchangeMarkerEntity__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getGroup()); 
             }
-            // InternalDataDSL.g:385:3: ( rule__DataInterchangeMarkerEntity__Group__0 )
-            // InternalDataDSL.g:385:4: rule__DataInterchangeMarkerEntity__Group__0
+            // InternalDataDSL.g:410:3: ( rule__DataInterchangeMarkerEntity__Group__0 )
+            // InternalDataDSL.g:410:4: rule__DataInterchangeMarkerEntity__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__Group__0();
@@ -1348,11 +1446,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeFormat"
-    // InternalDataDSL.g:394:1: entryRuleDataInterchangeFormat : ruleDataInterchangeFormat EOF ;
+    // InternalDataDSL.g:419:1: entryRuleDataInterchangeFormat : ruleDataInterchangeFormat EOF ;
     public final void entryRuleDataInterchangeFormat() throws RecognitionException {
         try {
-            // InternalDataDSL.g:395:1: ( ruleDataInterchangeFormat EOF )
-            // InternalDataDSL.g:396:1: ruleDataInterchangeFormat EOF
+            // InternalDataDSL.g:420:1: ( ruleDataInterchangeFormat EOF )
+            // InternalDataDSL.g:421:1: ruleDataInterchangeFormat EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatRule()); 
@@ -1382,23 +1480,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeFormat"
-    // InternalDataDSL.g:403:1: ruleDataInterchangeFormat : ( ( rule__DataInterchangeFormat__Group__0 ) ) ;
+    // InternalDataDSL.g:428:1: ruleDataInterchangeFormat : ( ( rule__DataInterchangeFormat__Group__0 ) ) ;
     public final void ruleDataInterchangeFormat() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:407:2: ( ( ( rule__DataInterchangeFormat__Group__0 ) ) )
-            // InternalDataDSL.g:408:2: ( ( rule__DataInterchangeFormat__Group__0 ) )
+            // InternalDataDSL.g:432:2: ( ( ( rule__DataInterchangeFormat__Group__0 ) ) )
+            // InternalDataDSL.g:433:2: ( ( rule__DataInterchangeFormat__Group__0 ) )
             {
-            // InternalDataDSL.g:408:2: ( ( rule__DataInterchangeFormat__Group__0 ) )
-            // InternalDataDSL.g:409:3: ( rule__DataInterchangeFormat__Group__0 )
+            // InternalDataDSL.g:433:2: ( ( rule__DataInterchangeFormat__Group__0 ) )
+            // InternalDataDSL.g:434:3: ( rule__DataInterchangeFormat__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getGroup()); 
             }
-            // InternalDataDSL.g:410:3: ( rule__DataInterchangeFormat__Group__0 )
-            // InternalDataDSL.g:410:4: rule__DataInterchangeFormat__Group__0
+            // InternalDataDSL.g:435:3: ( rule__DataInterchangeFormat__Group__0 )
+            // InternalDataDSL.g:435:4: rule__DataInterchangeFormat__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFormat__Group__0();
@@ -1433,11 +1531,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExpression"
-    // InternalDataDSL.g:419:1: entryRuleDataInterchangeExpression : ruleDataInterchangeExpression EOF ;
+    // InternalDataDSL.g:444:1: entryRuleDataInterchangeExpression : ruleDataInterchangeExpression EOF ;
     public final void entryRuleDataInterchangeExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:420:1: ( ruleDataInterchangeExpression EOF )
-            // InternalDataDSL.g:421:1: ruleDataInterchangeExpression EOF
+            // InternalDataDSL.g:445:1: ( ruleDataInterchangeExpression EOF )
+            // InternalDataDSL.g:446:1: ruleDataInterchangeExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExpressionRule()); 
@@ -1467,23 +1565,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeExpression"
-    // InternalDataDSL.g:428:1: ruleDataInterchangeExpression : ( ( rule__DataInterchangeExpression__Alternatives ) ) ;
+    // InternalDataDSL.g:453:1: ruleDataInterchangeExpression : ( ( rule__DataInterchangeExpression__Alternatives ) ) ;
     public final void ruleDataInterchangeExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:432:2: ( ( ( rule__DataInterchangeExpression__Alternatives ) ) )
-            // InternalDataDSL.g:433:2: ( ( rule__DataInterchangeExpression__Alternatives ) )
+            // InternalDataDSL.g:457:2: ( ( ( rule__DataInterchangeExpression__Alternatives ) ) )
+            // InternalDataDSL.g:458:2: ( ( rule__DataInterchangeExpression__Alternatives ) )
             {
-            // InternalDataDSL.g:433:2: ( ( rule__DataInterchangeExpression__Alternatives ) )
-            // InternalDataDSL.g:434:3: ( rule__DataInterchangeExpression__Alternatives )
+            // InternalDataDSL.g:458:2: ( ( rule__DataInterchangeExpression__Alternatives ) )
+            // InternalDataDSL.g:459:3: ( rule__DataInterchangeExpression__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExpressionAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:435:3: ( rule__DataInterchangeExpression__Alternatives )
-            // InternalDataDSL.g:435:4: rule__DataInterchangeExpression__Alternatives
+            // InternalDataDSL.g:460:3: ( rule__DataInterchangeExpression__Alternatives )
+            // InternalDataDSL.g:460:4: rule__DataInterchangeExpression__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpression__Alternatives();
@@ -1518,11 +1616,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeEntityExpression"
-    // InternalDataDSL.g:444:1: entryRuleDataInterchangeEntityExpression : ruleDataInterchangeEntityExpression EOF ;
+    // InternalDataDSL.g:469:1: entryRuleDataInterchangeEntityExpression : ruleDataInterchangeEntityExpression EOF ;
     public final void entryRuleDataInterchangeEntityExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:445:1: ( ruleDataInterchangeEntityExpression EOF )
-            // InternalDataDSL.g:446:1: ruleDataInterchangeEntityExpression EOF
+            // InternalDataDSL.g:470:1: ( ruleDataInterchangeEntityExpression EOF )
+            // InternalDataDSL.g:471:1: ruleDataInterchangeEntityExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionRule()); 
@@ -1552,23 +1650,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeEntityExpression"
-    // InternalDataDSL.g:453:1: ruleDataInterchangeEntityExpression : ( ( rule__DataInterchangeEntityExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:478:1: ruleDataInterchangeEntityExpression : ( ( rule__DataInterchangeEntityExpression__Group__0 ) ) ;
     public final void ruleDataInterchangeEntityExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:457:2: ( ( ( rule__DataInterchangeEntityExpression__Group__0 ) ) )
-            // InternalDataDSL.g:458:2: ( ( rule__DataInterchangeEntityExpression__Group__0 ) )
+            // InternalDataDSL.g:482:2: ( ( ( rule__DataInterchangeEntityExpression__Group__0 ) ) )
+            // InternalDataDSL.g:483:2: ( ( rule__DataInterchangeEntityExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:458:2: ( ( rule__DataInterchangeEntityExpression__Group__0 ) )
-            // InternalDataDSL.g:459:3: ( rule__DataInterchangeEntityExpression__Group__0 )
+            // InternalDataDSL.g:483:2: ( ( rule__DataInterchangeEntityExpression__Group__0 ) )
+            // InternalDataDSL.g:484:3: ( rule__DataInterchangeEntityExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:460:3: ( rule__DataInterchangeEntityExpression__Group__0 )
-            // InternalDataDSL.g:460:4: rule__DataInterchangeEntityExpression__Group__0
+            // InternalDataDSL.g:485:3: ( rule__DataInterchangeEntityExpression__Group__0 )
+            // InternalDataDSL.g:485:4: rule__DataInterchangeEntityExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeEntityExpression__Group__0();
@@ -1603,11 +1701,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExpose"
-    // InternalDataDSL.g:469:1: entryRuleDataInterchangeExpose : ruleDataInterchangeExpose EOF ;
+    // InternalDataDSL.g:494:1: entryRuleDataInterchangeExpose : ruleDataInterchangeExpose EOF ;
     public final void entryRuleDataInterchangeExpose() throws RecognitionException {
         try {
-            // InternalDataDSL.g:470:1: ( ruleDataInterchangeExpose EOF )
-            // InternalDataDSL.g:471:1: ruleDataInterchangeExpose EOF
+            // InternalDataDSL.g:495:1: ( ruleDataInterchangeExpose EOF )
+            // InternalDataDSL.g:496:1: ruleDataInterchangeExpose EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeRule()); 
@@ -1637,23 +1735,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeExpose"
-    // InternalDataDSL.g:478:1: ruleDataInterchangeExpose : ( ( rule__DataInterchangeExpose__Group__0 ) ) ;
+    // InternalDataDSL.g:503:1: ruleDataInterchangeExpose : ( ( rule__DataInterchangeExpose__Group__0 ) ) ;
     public final void ruleDataInterchangeExpose() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:482:2: ( ( ( rule__DataInterchangeExpose__Group__0 ) ) )
-            // InternalDataDSL.g:483:2: ( ( rule__DataInterchangeExpose__Group__0 ) )
+            // InternalDataDSL.g:507:2: ( ( ( rule__DataInterchangeExpose__Group__0 ) ) )
+            // InternalDataDSL.g:508:2: ( ( rule__DataInterchangeExpose__Group__0 ) )
             {
-            // InternalDataDSL.g:483:2: ( ( rule__DataInterchangeExpose__Group__0 ) )
-            // InternalDataDSL.g:484:3: ( rule__DataInterchangeExpose__Group__0 )
+            // InternalDataDSL.g:508:2: ( ( rule__DataInterchangeExpose__Group__0 ) )
+            // InternalDataDSL.g:509:3: ( rule__DataInterchangeExpose__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getGroup()); 
             }
-            // InternalDataDSL.g:485:3: ( rule__DataInterchangeExpose__Group__0 )
-            // InternalDataDSL.g:485:4: rule__DataInterchangeExpose__Group__0
+            // InternalDataDSL.g:510:3: ( rule__DataInterchangeExpose__Group__0 )
+            // InternalDataDSL.g:510:4: rule__DataInterchangeExpose__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__Group__0();
@@ -1688,11 +1786,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExportFilter"
-    // InternalDataDSL.g:494:1: entryRuleDataInterchangeExportFilter : ruleDataInterchangeExportFilter EOF ;
+    // InternalDataDSL.g:519:1: entryRuleDataInterchangeExportFilter : ruleDataInterchangeExportFilter EOF ;
     public final void entryRuleDataInterchangeExportFilter() throws RecognitionException {
         try {
-            // InternalDataDSL.g:495:1: ( ruleDataInterchangeExportFilter EOF )
-            // InternalDataDSL.g:496:1: ruleDataInterchangeExportFilter EOF
+            // InternalDataDSL.g:520:1: ( ruleDataInterchangeExportFilter EOF )
+            // InternalDataDSL.g:521:1: ruleDataInterchangeExportFilter EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterRule()); 
@@ -1722,23 +1820,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeExportFilter"
-    // InternalDataDSL.g:503:1: ruleDataInterchangeExportFilter : ( ( rule__DataInterchangeExportFilter__Group__0 ) ) ;
+    // InternalDataDSL.g:528:1: ruleDataInterchangeExportFilter : ( ( rule__DataInterchangeExportFilter__Group__0 ) ) ;
     public final void ruleDataInterchangeExportFilter() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:507:2: ( ( ( rule__DataInterchangeExportFilter__Group__0 ) ) )
-            // InternalDataDSL.g:508:2: ( ( rule__DataInterchangeExportFilter__Group__0 ) )
+            // InternalDataDSL.g:532:2: ( ( ( rule__DataInterchangeExportFilter__Group__0 ) ) )
+            // InternalDataDSL.g:533:2: ( ( rule__DataInterchangeExportFilter__Group__0 ) )
             {
-            // InternalDataDSL.g:508:2: ( ( rule__DataInterchangeExportFilter__Group__0 ) )
-            // InternalDataDSL.g:509:3: ( rule__DataInterchangeExportFilter__Group__0 )
+            // InternalDataDSL.g:533:2: ( ( rule__DataInterchangeExportFilter__Group__0 ) )
+            // InternalDataDSL.g:534:3: ( rule__DataInterchangeExportFilter__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getGroup()); 
             }
-            // InternalDataDSL.g:510:3: ( rule__DataInterchangeExportFilter__Group__0 )
-            // InternalDataDSL.g:510:4: rule__DataInterchangeExportFilter__Group__0
+            // InternalDataDSL.g:535:3: ( rule__DataInterchangeExportFilter__Group__0 )
+            // InternalDataDSL.g:535:4: rule__DataInterchangeExportFilter__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportFilter__Group__0();
@@ -1772,23 +1870,23 @@
     // $ANTLR end "ruleDataInterchangeExportFilter"
 
 
-    // $ANTLR start "entryRuleDataInterchangeFilterCondition"
-    // InternalDataDSL.g:519:1: entryRuleDataInterchangeFilterCondition : ruleDataInterchangeFilterCondition EOF ;
-    public final void entryRuleDataInterchangeFilterCondition() throws RecognitionException {
+    // $ANTLR start "entryRuleDataInterchangeExportFilterCondition"
+    // InternalDataDSL.g:544:1: entryRuleDataInterchangeExportFilterCondition : ruleDataInterchangeExportFilterCondition EOF ;
+    public final void entryRuleDataInterchangeExportFilterCondition() throws RecognitionException {
         try {
-            // InternalDataDSL.g:520:1: ( ruleDataInterchangeFilterCondition EOF )
-            // InternalDataDSL.g:521:1: ruleDataInterchangeFilterCondition EOF
+            // InternalDataDSL.g:545:1: ( ruleDataInterchangeExportFilterCondition EOF )
+            // InternalDataDSL.g:546:1: ruleDataInterchangeExportFilterCondition EOF
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionRule()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionRule()); 
             }
             pushFollow(FOLLOW_1);
-            ruleDataInterchangeFilterCondition();
+            ruleDataInterchangeExportFilterCondition();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionRule()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionRule()); 
             }
             match(input,EOF,FOLLOW_2); if (state.failed) return ;
 
@@ -1803,30 +1901,30 @@
         }
         return ;
     }
-    // $ANTLR end "entryRuleDataInterchangeFilterCondition"
+    // $ANTLR end "entryRuleDataInterchangeExportFilterCondition"
 
 
-    // $ANTLR start "ruleDataInterchangeFilterCondition"
-    // InternalDataDSL.g:528:1: ruleDataInterchangeFilterCondition : ( ( rule__DataInterchangeFilterCondition__Group__0 ) ) ;
-    public final void ruleDataInterchangeFilterCondition() throws RecognitionException {
+    // $ANTLR start "ruleDataInterchangeExportFilterCondition"
+    // InternalDataDSL.g:553:1: ruleDataInterchangeExportFilterCondition : ( ( rule__DataInterchangeExportFilterCondition__Group__0 ) ) ;
+    public final void ruleDataInterchangeExportFilterCondition() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:532:2: ( ( ( rule__DataInterchangeFilterCondition__Group__0 ) ) )
-            // InternalDataDSL.g:533:2: ( ( rule__DataInterchangeFilterCondition__Group__0 ) )
+            // InternalDataDSL.g:557:2: ( ( ( rule__DataInterchangeExportFilterCondition__Group__0 ) ) )
+            // InternalDataDSL.g:558:2: ( ( rule__DataInterchangeExportFilterCondition__Group__0 ) )
             {
-            // InternalDataDSL.g:533:2: ( ( rule__DataInterchangeFilterCondition__Group__0 ) )
-            // InternalDataDSL.g:534:3: ( rule__DataInterchangeFilterCondition__Group__0 )
+            // InternalDataDSL.g:558:2: ( ( rule__DataInterchangeExportFilterCondition__Group__0 ) )
+            // InternalDataDSL.g:559:3: ( rule__DataInterchangeExportFilterCondition__Group__0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:535:3: ( rule__DataInterchangeFilterCondition__Group__0 )
-            // InternalDataDSL.g:535:4: rule__DataInterchangeFilterCondition__Group__0
+            // InternalDataDSL.g:560:3: ( rule__DataInterchangeExportFilterCondition__Group__0 )
+            // InternalDataDSL.g:560:4: rule__DataInterchangeExportFilterCondition__Group__0
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group__0();
+            rule__DataInterchangeExportFilterCondition__Group__0();
 
             state._fsp--;
             if (state.failed) return ;
@@ -1834,7 +1932,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup()); 
             }
 
             }
@@ -1854,15 +1952,355 @@
         }
         return ;
     }
-    // $ANTLR end "ruleDataInterchangeFilterCondition"
+    // $ANTLR end "ruleDataInterchangeExportFilterCondition"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterCondition"
+    // InternalDataDSL.g:569:1: entryRuleDataInterchangeLookupFilterCondition : ruleDataInterchangeLookupFilterCondition EOF ;
+    public final void entryRuleDataInterchangeLookupFilterCondition() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:570:1: ( ruleDataInterchangeLookupFilterCondition EOF )
+            // InternalDataDSL.g:571:1: ruleDataInterchangeLookupFilterCondition EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeLookupFilterCondition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterCondition"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterCondition"
+    // InternalDataDSL.g:578:1: ruleDataInterchangeLookupFilterCondition : ( ( rule__DataInterchangeLookupFilterCondition__Group__0 ) ) ;
+    public final void ruleDataInterchangeLookupFilterCondition() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:582:2: ( ( ( rule__DataInterchangeLookupFilterCondition__Group__0 ) ) )
+            // InternalDataDSL.g:583:2: ( ( rule__DataInterchangeLookupFilterCondition__Group__0 ) )
+            {
+            // InternalDataDSL.g:583:2: ( ( rule__DataInterchangeLookupFilterCondition__Group__0 ) )
+            // InternalDataDSL.g:584:3: ( rule__DataInterchangeLookupFilterCondition__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup()); 
+            }
+            // InternalDataDSL.g:585:3: ( rule__DataInterchangeLookupFilterCondition__Group__0 )
+            // InternalDataDSL.g:585:4: rule__DataInterchangeLookupFilterCondition__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterCondition"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperand"
+    // InternalDataDSL.g:594:1: entryRuleDataInterchangeLookupFilterOperand : ruleDataInterchangeLookupFilterOperand EOF ;
+    public final void entryRuleDataInterchangeLookupFilterOperand() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:595:1: ( ruleDataInterchangeLookupFilterOperand EOF )
+            // InternalDataDSL.g:596:1: ruleDataInterchangeLookupFilterOperand EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeLookupFilterOperand();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperand"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperand"
+    // InternalDataDSL.g:603:1: ruleDataInterchangeLookupFilterOperand : ( ( rule__DataInterchangeLookupFilterOperand__Alternatives ) ) ;
+    public final void ruleDataInterchangeLookupFilterOperand() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:607:2: ( ( ( rule__DataInterchangeLookupFilterOperand__Alternatives ) ) )
+            // InternalDataDSL.g:608:2: ( ( rule__DataInterchangeLookupFilterOperand__Alternatives ) )
+            {
+            // InternalDataDSL.g:608:2: ( ( rule__DataInterchangeLookupFilterOperand__Alternatives ) )
+            // InternalDataDSL.g:609:3: ( rule__DataInterchangeLookupFilterOperand__Alternatives )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getAlternatives()); 
+            }
+            // InternalDataDSL.g:610:3: ( rule__DataInterchangeLookupFilterOperand__Alternatives )
+            // InternalDataDSL.g:610:4: rule__DataInterchangeLookupFilterOperand__Alternatives
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperand__Alternatives();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getAlternatives()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperand"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperandProperty"
+    // InternalDataDSL.g:619:1: entryRuleDataInterchangeLookupFilterOperandProperty : ruleDataInterchangeLookupFilterOperandProperty EOF ;
+    public final void entryRuleDataInterchangeLookupFilterOperandProperty() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:620:1: ( ruleDataInterchangeLookupFilterOperandProperty EOF )
+            // InternalDataDSL.g:621:1: ruleDataInterchangeLookupFilterOperandProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeLookupFilterOperandProperty();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperandProperty"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperandProperty"
+    // InternalDataDSL.g:628:1: ruleDataInterchangeLookupFilterOperandProperty : ( ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 ) ) ;
+    public final void ruleDataInterchangeLookupFilterOperandProperty() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:632:2: ( ( ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 ) ) )
+            // InternalDataDSL.g:633:2: ( ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 ) )
+            {
+            // InternalDataDSL.g:633:2: ( ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 ) )
+            // InternalDataDSL.g:634:3: ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getGroup()); 
+            }
+            // InternalDataDSL.g:635:3: ( rule__DataInterchangeLookupFilterOperandProperty__Group__0 )
+            // InternalDataDSL.g:635:4: rule__DataInterchangeLookupFilterOperandProperty__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandProperty__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperandProperty"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperandString"
+    // InternalDataDSL.g:644:1: entryRuleDataInterchangeLookupFilterOperandString : ruleDataInterchangeLookupFilterOperandString EOF ;
+    public final void entryRuleDataInterchangeLookupFilterOperandString() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:645:1: ( ruleDataInterchangeLookupFilterOperandString EOF )
+            // InternalDataDSL.g:646:1: ruleDataInterchangeLookupFilterOperandString EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeLookupFilterOperandString();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperandString"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperandString"
+    // InternalDataDSL.g:653:1: ruleDataInterchangeLookupFilterOperandString : ( ( rule__DataInterchangeLookupFilterOperandString__Group__0 ) ) ;
+    public final void ruleDataInterchangeLookupFilterOperandString() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:657:2: ( ( ( rule__DataInterchangeLookupFilterOperandString__Group__0 ) ) )
+            // InternalDataDSL.g:658:2: ( ( rule__DataInterchangeLookupFilterOperandString__Group__0 ) )
+            {
+            // InternalDataDSL.g:658:2: ( ( rule__DataInterchangeLookupFilterOperandString__Group__0 ) )
+            // InternalDataDSL.g:659:3: ( rule__DataInterchangeLookupFilterOperandString__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getGroup()); 
+            }
+            // InternalDataDSL.g:660:3: ( rule__DataInterchangeLookupFilterOperandString__Group__0 )
+            // InternalDataDSL.g:660:4: rule__DataInterchangeLookupFilterOperandString__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandString__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperandString"
 
 
     // $ANTLR start "entryRuleDataInterchangeExportHide"
-    // InternalDataDSL.g:544:1: entryRuleDataInterchangeExportHide : ruleDataInterchangeExportHide EOF ;
+    // InternalDataDSL.g:669:1: entryRuleDataInterchangeExportHide : ruleDataInterchangeExportHide EOF ;
     public final void entryRuleDataInterchangeExportHide() throws RecognitionException {
         try {
-            // InternalDataDSL.g:545:1: ( ruleDataInterchangeExportHide EOF )
-            // InternalDataDSL.g:546:1: ruleDataInterchangeExportHide EOF
+            // InternalDataDSL.g:670:1: ( ruleDataInterchangeExportHide EOF )
+            // InternalDataDSL.g:671:1: ruleDataInterchangeExportHide EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideRule()); 
@@ -1892,23 +2330,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeExportHide"
-    // InternalDataDSL.g:553:1: ruleDataInterchangeExportHide : ( ( rule__DataInterchangeExportHide__Group__0 ) ) ;
+    // InternalDataDSL.g:678:1: ruleDataInterchangeExportHide : ( ( rule__DataInterchangeExportHide__Group__0 ) ) ;
     public final void ruleDataInterchangeExportHide() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:557:2: ( ( ( rule__DataInterchangeExportHide__Group__0 ) ) )
-            // InternalDataDSL.g:558:2: ( ( rule__DataInterchangeExportHide__Group__0 ) )
+            // InternalDataDSL.g:682:2: ( ( ( rule__DataInterchangeExportHide__Group__0 ) ) )
+            // InternalDataDSL.g:683:2: ( ( rule__DataInterchangeExportHide__Group__0 ) )
             {
-            // InternalDataDSL.g:558:2: ( ( rule__DataInterchangeExportHide__Group__0 ) )
-            // InternalDataDSL.g:559:3: ( rule__DataInterchangeExportHide__Group__0 )
+            // InternalDataDSL.g:683:2: ( ( rule__DataInterchangeExportHide__Group__0 ) )
+            // InternalDataDSL.g:684:3: ( rule__DataInterchangeExportHide__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideAccess().getGroup()); 
             }
-            // InternalDataDSL.g:560:3: ( rule__DataInterchangeExportHide__Group__0 )
-            // InternalDataDSL.g:560:4: rule__DataInterchangeExportHide__Group__0
+            // InternalDataDSL.g:685:3: ( rule__DataInterchangeExportHide__Group__0 )
+            // InternalDataDSL.g:685:4: rule__DataInterchangeExportHide__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportHide__Group__0();
@@ -1943,11 +2381,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangePredefinedExpression"
-    // InternalDataDSL.g:569:1: entryRuleDataInterchangePredefinedExpression : ruleDataInterchangePredefinedExpression EOF ;
+    // InternalDataDSL.g:694:1: entryRuleDataInterchangePredefinedExpression : ruleDataInterchangePredefinedExpression EOF ;
     public final void entryRuleDataInterchangePredefinedExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:570:1: ( ruleDataInterchangePredefinedExpression EOF )
-            // InternalDataDSL.g:571:1: ruleDataInterchangePredefinedExpression EOF
+            // InternalDataDSL.g:695:1: ( ruleDataInterchangePredefinedExpression EOF )
+            // InternalDataDSL.g:696:1: ruleDataInterchangePredefinedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionRule()); 
@@ -1977,23 +2415,23 @@
 
 
     // $ANTLR start "ruleDataInterchangePredefinedExpression"
-    // InternalDataDSL.g:578:1: ruleDataInterchangePredefinedExpression : ( ( rule__DataInterchangePredefinedExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:703:1: ruleDataInterchangePredefinedExpression : ( ( rule__DataInterchangePredefinedExpression__Group__0 ) ) ;
     public final void ruleDataInterchangePredefinedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:582:2: ( ( ( rule__DataInterchangePredefinedExpression__Group__0 ) ) )
-            // InternalDataDSL.g:583:2: ( ( rule__DataInterchangePredefinedExpression__Group__0 ) )
+            // InternalDataDSL.g:707:2: ( ( ( rule__DataInterchangePredefinedExpression__Group__0 ) ) )
+            // InternalDataDSL.g:708:2: ( ( rule__DataInterchangePredefinedExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:583:2: ( ( rule__DataInterchangePredefinedExpression__Group__0 ) )
-            // InternalDataDSL.g:584:3: ( rule__DataInterchangePredefinedExpression__Group__0 )
+            // InternalDataDSL.g:708:2: ( ( rule__DataInterchangePredefinedExpression__Group__0 ) )
+            // InternalDataDSL.g:709:3: ( rule__DataInterchangePredefinedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:585:3: ( rule__DataInterchangePredefinedExpression__Group__0 )
-            // InternalDataDSL.g:585:4: rule__DataInterchangePredefinedExpression__Group__0
+            // InternalDataDSL.g:710:3: ( rule__DataInterchangePredefinedExpression__Group__0 )
+            // InternalDataDSL.g:710:4: rule__DataInterchangePredefinedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePredefinedExpression__Group__0();
@@ -2028,11 +2466,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMapping"
-    // InternalDataDSL.g:594:1: entryRuleDataInterchangeMapping : ruleDataInterchangeMapping EOF ;
+    // InternalDataDSL.g:719:1: entryRuleDataInterchangeMapping : ruleDataInterchangeMapping EOF ;
     public final void entryRuleDataInterchangeMapping() throws RecognitionException {
         try {
-            // InternalDataDSL.g:595:1: ( ruleDataInterchangeMapping EOF )
-            // InternalDataDSL.g:596:1: ruleDataInterchangeMapping EOF
+            // InternalDataDSL.g:720:1: ( ruleDataInterchangeMapping EOF )
+            // InternalDataDSL.g:721:1: ruleDataInterchangeMapping EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMappingRule()); 
@@ -2062,23 +2500,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeMapping"
-    // InternalDataDSL.g:603:1: ruleDataInterchangeMapping : ( ( rule__DataInterchangeMapping__Alternatives ) ) ;
+    // InternalDataDSL.g:728:1: ruleDataInterchangeMapping : ( ( rule__DataInterchangeMapping__Alternatives ) ) ;
     public final void ruleDataInterchangeMapping() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:607:2: ( ( ( rule__DataInterchangeMapping__Alternatives ) ) )
-            // InternalDataDSL.g:608:2: ( ( rule__DataInterchangeMapping__Alternatives ) )
+            // InternalDataDSL.g:732:2: ( ( ( rule__DataInterchangeMapping__Alternatives ) ) )
+            // InternalDataDSL.g:733:2: ( ( rule__DataInterchangeMapping__Alternatives ) )
             {
-            // InternalDataDSL.g:608:2: ( ( rule__DataInterchangeMapping__Alternatives ) )
-            // InternalDataDSL.g:609:3: ( rule__DataInterchangeMapping__Alternatives )
+            // InternalDataDSL.g:733:2: ( ( rule__DataInterchangeMapping__Alternatives ) )
+            // InternalDataDSL.g:734:3: ( rule__DataInterchangeMapping__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMappingAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:610:3: ( rule__DataInterchangeMapping__Alternatives )
-            // InternalDataDSL.g:610:4: rule__DataInterchangeMapping__Alternatives
+            // InternalDataDSL.g:735:3: ( rule__DataInterchangeMapping__Alternatives )
+            // InternalDataDSL.g:735:4: rule__DataInterchangeMapping__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMapping__Alternatives();
@@ -2113,11 +2551,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeValueMapping"
-    // InternalDataDSL.g:619:1: entryRuleDataInterchangeValueMapping : ruleDataInterchangeValueMapping EOF ;
+    // InternalDataDSL.g:744:1: entryRuleDataInterchangeValueMapping : ruleDataInterchangeValueMapping EOF ;
     public final void entryRuleDataInterchangeValueMapping() throws RecognitionException {
         try {
-            // InternalDataDSL.g:620:1: ( ruleDataInterchangeValueMapping EOF )
-            // InternalDataDSL.g:621:1: ruleDataInterchangeValueMapping EOF
+            // InternalDataDSL.g:745:1: ( ruleDataInterchangeValueMapping EOF )
+            // InternalDataDSL.g:746:1: ruleDataInterchangeValueMapping EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingRule()); 
@@ -2147,23 +2585,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeValueMapping"
-    // InternalDataDSL.g:628:1: ruleDataInterchangeValueMapping : ( ( rule__DataInterchangeValueMapping__Group__0 ) ) ;
+    // InternalDataDSL.g:753:1: ruleDataInterchangeValueMapping : ( ( rule__DataInterchangeValueMapping__Group__0 ) ) ;
     public final void ruleDataInterchangeValueMapping() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:632:2: ( ( ( rule__DataInterchangeValueMapping__Group__0 ) ) )
-            // InternalDataDSL.g:633:2: ( ( rule__DataInterchangeValueMapping__Group__0 ) )
+            // InternalDataDSL.g:757:2: ( ( ( rule__DataInterchangeValueMapping__Group__0 ) ) )
+            // InternalDataDSL.g:758:2: ( ( rule__DataInterchangeValueMapping__Group__0 ) )
             {
-            // InternalDataDSL.g:633:2: ( ( rule__DataInterchangeValueMapping__Group__0 ) )
-            // InternalDataDSL.g:634:3: ( rule__DataInterchangeValueMapping__Group__0 )
+            // InternalDataDSL.g:758:2: ( ( rule__DataInterchangeValueMapping__Group__0 ) )
+            // InternalDataDSL.g:759:3: ( rule__DataInterchangeValueMapping__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getGroup()); 
             }
-            // InternalDataDSL.g:635:3: ( rule__DataInterchangeValueMapping__Group__0 )
-            // InternalDataDSL.g:635:4: rule__DataInterchangeValueMapping__Group__0
+            // InternalDataDSL.g:760:3: ( rule__DataInterchangeValueMapping__Group__0 )
+            // InternalDataDSL.g:760:4: rule__DataInterchangeValueMapping__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeValueMapping__Group__0();
@@ -2198,11 +2636,11 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeBlobMapping"
-    // InternalDataDSL.g:644:1: entryRuleDataInterchangeBlobMapping : ruleDataInterchangeBlobMapping EOF ;
+    // InternalDataDSL.g:769:1: entryRuleDataInterchangeBlobMapping : ruleDataInterchangeBlobMapping EOF ;
     public final void entryRuleDataInterchangeBlobMapping() throws RecognitionException {
         try {
-            // InternalDataDSL.g:645:1: ( ruleDataInterchangeBlobMapping EOF )
-            // InternalDataDSL.g:646:1: ruleDataInterchangeBlobMapping EOF
+            // InternalDataDSL.g:770:1: ( ruleDataInterchangeBlobMapping EOF )
+            // InternalDataDSL.g:771:1: ruleDataInterchangeBlobMapping EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingRule()); 
@@ -2232,23 +2670,23 @@
 
 
     // $ANTLR start "ruleDataInterchangeBlobMapping"
-    // InternalDataDSL.g:653:1: ruleDataInterchangeBlobMapping : ( ( rule__DataInterchangeBlobMapping__Group__0 ) ) ;
+    // InternalDataDSL.g:778:1: ruleDataInterchangeBlobMapping : ( ( rule__DataInterchangeBlobMapping__Group__0 ) ) ;
     public final void ruleDataInterchangeBlobMapping() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:657:2: ( ( ( rule__DataInterchangeBlobMapping__Group__0 ) ) )
-            // InternalDataDSL.g:658:2: ( ( rule__DataInterchangeBlobMapping__Group__0 ) )
+            // InternalDataDSL.g:782:2: ( ( ( rule__DataInterchangeBlobMapping__Group__0 ) ) )
+            // InternalDataDSL.g:783:2: ( ( rule__DataInterchangeBlobMapping__Group__0 ) )
             {
-            // InternalDataDSL.g:658:2: ( ( rule__DataInterchangeBlobMapping__Group__0 ) )
-            // InternalDataDSL.g:659:3: ( rule__DataInterchangeBlobMapping__Group__0 )
+            // InternalDataDSL.g:783:2: ( ( rule__DataInterchangeBlobMapping__Group__0 ) )
+            // InternalDataDSL.g:784:3: ( rule__DataInterchangeBlobMapping__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup()); 
             }
-            // InternalDataDSL.g:660:3: ( rule__DataInterchangeBlobMapping__Group__0 )
-            // InternalDataDSL.g:660:4: rule__DataInterchangeBlobMapping__Group__0
+            // InternalDataDSL.g:785:3: ( rule__DataInterchangeBlobMapping__Group__0 )
+            // InternalDataDSL.g:785:4: rule__DataInterchangeBlobMapping__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__Group__0();
@@ -2282,12 +2720,97 @@
     // $ANTLR end "ruleDataInterchangeBlobMapping"
 
 
+    // $ANTLR start "entryRuleDataInterchangeFixedColumnMapping"
+    // InternalDataDSL.g:794:1: entryRuleDataInterchangeFixedColumnMapping : ruleDataInterchangeFixedColumnMapping EOF ;
+    public final void entryRuleDataInterchangeFixedColumnMapping() throws RecognitionException {
+        try {
+            // InternalDataDSL.g:795:1: ( ruleDataInterchangeFixedColumnMapping EOF )
+            // InternalDataDSL.g:796:1: ruleDataInterchangeFixedColumnMapping EOF
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            ruleDataInterchangeFixedColumnMapping();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingRule()); 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+        }
+        return ;
+    }
+    // $ANTLR end "entryRuleDataInterchangeFixedColumnMapping"
+
+
+    // $ANTLR start "ruleDataInterchangeFixedColumnMapping"
+    // InternalDataDSL.g:803:1: ruleDataInterchangeFixedColumnMapping : ( ( rule__DataInterchangeFixedColumnMapping__Group__0 ) ) ;
+    public final void ruleDataInterchangeFixedColumnMapping() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:807:2: ( ( ( rule__DataInterchangeFixedColumnMapping__Group__0 ) ) )
+            // InternalDataDSL.g:808:2: ( ( rule__DataInterchangeFixedColumnMapping__Group__0 ) )
+            {
+            // InternalDataDSL.g:808:2: ( ( rule__DataInterchangeFixedColumnMapping__Group__0 ) )
+            // InternalDataDSL.g:809:3: ( rule__DataInterchangeFixedColumnMapping__Group__0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getGroup()); 
+            }
+            // InternalDataDSL.g:810:3: ( rule__DataInterchangeFixedColumnMapping__Group__0 )
+            // InternalDataDSL.g:810:4: rule__DataInterchangeFixedColumnMapping__Group__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getGroup()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "ruleDataInterchangeFixedColumnMapping"
+
+
     // $ANTLR start "entryRuleLFQN"
-    // InternalDataDSL.g:669:1: entryRuleLFQN : ruleLFQN EOF ;
+    // InternalDataDSL.g:819:1: entryRuleLFQN : ruleLFQN EOF ;
     public final void entryRuleLFQN() throws RecognitionException {
         try {
-            // InternalDataDSL.g:670:1: ( ruleLFQN EOF )
-            // InternalDataDSL.g:671:1: ruleLFQN EOF
+            // InternalDataDSL.g:820:1: ( ruleLFQN EOF )
+            // InternalDataDSL.g:821:1: ruleLFQN EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNRule()); 
@@ -2317,23 +2840,23 @@
 
 
     // $ANTLR start "ruleLFQN"
-    // InternalDataDSL.g:678:1: ruleLFQN : ( ( rule__LFQN__Group__0 ) ) ;
+    // InternalDataDSL.g:828:1: ruleLFQN : ( ( rule__LFQN__Group__0 ) ) ;
     public final void ruleLFQN() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:682:2: ( ( ( rule__LFQN__Group__0 ) ) )
-            // InternalDataDSL.g:683:2: ( ( rule__LFQN__Group__0 ) )
+            // InternalDataDSL.g:832:2: ( ( ( rule__LFQN__Group__0 ) ) )
+            // InternalDataDSL.g:833:2: ( ( rule__LFQN__Group__0 ) )
             {
-            // InternalDataDSL.g:683:2: ( ( rule__LFQN__Group__0 ) )
-            // InternalDataDSL.g:684:3: ( rule__LFQN__Group__0 )
+            // InternalDataDSL.g:833:2: ( ( rule__LFQN__Group__0 ) )
+            // InternalDataDSL.g:834:3: ( rule__LFQN__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNAccess().getGroup()); 
             }
-            // InternalDataDSL.g:685:3: ( rule__LFQN__Group__0 )
-            // InternalDataDSL.g:685:4: rule__LFQN__Group__0
+            // InternalDataDSL.g:835:3: ( rule__LFQN__Group__0 )
+            // InternalDataDSL.g:835:4: rule__LFQN__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__LFQN__Group__0();
@@ -2368,11 +2891,11 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLESTRING"
-    // InternalDataDSL.g:694:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
+    // InternalDataDSL.g:844:1: entryRuleTRANSLATABLESTRING : ruleTRANSLATABLESTRING EOF ;
     public final void entryRuleTRANSLATABLESTRING() throws RecognitionException {
         try {
-            // InternalDataDSL.g:695:1: ( ruleTRANSLATABLESTRING EOF )
-            // InternalDataDSL.g:696:1: ruleTRANSLATABLESTRING EOF
+            // InternalDataDSL.g:845:1: ( ruleTRANSLATABLESTRING EOF )
+            // InternalDataDSL.g:846:1: ruleTRANSLATABLESTRING EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLESTRINGRule()); 
@@ -2402,17 +2925,17 @@
 
 
     // $ANTLR start "ruleTRANSLATABLESTRING"
-    // InternalDataDSL.g:703:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
+    // InternalDataDSL.g:853:1: ruleTRANSLATABLESTRING : ( RULE_STRING ) ;
     public final void ruleTRANSLATABLESTRING() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:707:2: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:708:2: ( RULE_STRING )
+            // InternalDataDSL.g:857:2: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:858:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:708:2: ( RULE_STRING )
-            // InternalDataDSL.g:709:3: RULE_STRING
+            // InternalDataDSL.g:858:2: ( RULE_STRING )
+            // InternalDataDSL.g:859:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLESTRINGAccess().getSTRINGTerminalRuleCall()); 
@@ -2443,11 +2966,11 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLEID"
-    // InternalDataDSL.g:719:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
+    // InternalDataDSL.g:869:1: entryRuleTRANSLATABLEID : ruleTRANSLATABLEID EOF ;
     public final void entryRuleTRANSLATABLEID() throws RecognitionException {
         try {
-            // InternalDataDSL.g:720:1: ( ruleTRANSLATABLEID EOF )
-            // InternalDataDSL.g:721:1: ruleTRANSLATABLEID EOF
+            // InternalDataDSL.g:870:1: ( ruleTRANSLATABLEID EOF )
+            // InternalDataDSL.g:871:1: ruleTRANSLATABLEID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLEIDRule()); 
@@ -2477,17 +3000,17 @@
 
 
     // $ANTLR start "ruleTRANSLATABLEID"
-    // InternalDataDSL.g:728:1: ruleTRANSLATABLEID : ( RULE_ID ) ;
+    // InternalDataDSL.g:878:1: ruleTRANSLATABLEID : ( RULE_ID ) ;
     public final void ruleTRANSLATABLEID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:732:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:733:2: ( RULE_ID )
+            // InternalDataDSL.g:882:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:883:2: ( RULE_ID )
             {
-            // InternalDataDSL.g:733:2: ( RULE_ID )
-            // InternalDataDSL.g:734:3: RULE_ID
+            // InternalDataDSL.g:883:2: ( RULE_ID )
+            // InternalDataDSL.g:884:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getTRANSLATABLEIDAccess().getIDTerminalRuleCall()); 
@@ -2518,11 +3041,11 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // InternalDataDSL.g:744:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
+    // InternalDataDSL.g:894:1: entryRuleXImportDeclaration : ruleXImportDeclaration EOF ;
     public final void entryRuleXImportDeclaration() throws RecognitionException {
         try {
-            // InternalDataDSL.g:745:1: ( ruleXImportDeclaration EOF )
-            // InternalDataDSL.g:746:1: ruleXImportDeclaration EOF
+            // InternalDataDSL.g:895:1: ( ruleXImportDeclaration EOF )
+            // InternalDataDSL.g:896:1: ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationRule()); 
@@ -2552,23 +3075,23 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // InternalDataDSL.g:753:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
+    // InternalDataDSL.g:903:1: ruleXImportDeclaration : ( ( rule__XImportDeclaration__Group__0 ) ) ;
     public final void ruleXImportDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:757:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
-            // InternalDataDSL.g:758:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalDataDSL.g:907:2: ( ( ( rule__XImportDeclaration__Group__0 ) ) )
+            // InternalDataDSL.g:908:2: ( ( rule__XImportDeclaration__Group__0 ) )
             {
-            // InternalDataDSL.g:758:2: ( ( rule__XImportDeclaration__Group__0 ) )
-            // InternalDataDSL.g:759:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalDataDSL.g:908:2: ( ( rule__XImportDeclaration__Group__0 ) )
+            // InternalDataDSL.g:909:3: ( rule__XImportDeclaration__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getGroup()); 
             }
-            // InternalDataDSL.g:760:3: ( rule__XImportDeclaration__Group__0 )
-            // InternalDataDSL.g:760:4: rule__XImportDeclaration__Group__0
+            // InternalDataDSL.g:910:3: ( rule__XImportDeclaration__Group__0 )
+            // InternalDataDSL.g:910:4: rule__XImportDeclaration__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group__0();
@@ -2603,11 +3126,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotation"
-    // InternalDataDSL.g:769:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
+    // InternalDataDSL.g:919:1: entryRuleXAnnotation : ruleXAnnotation EOF ;
     public final void entryRuleXAnnotation() throws RecognitionException {
         try {
-            // InternalDataDSL.g:770:1: ( ruleXAnnotation EOF )
-            // InternalDataDSL.g:771:1: ruleXAnnotation EOF
+            // InternalDataDSL.g:920:1: ( ruleXAnnotation EOF )
+            // InternalDataDSL.g:921:1: ruleXAnnotation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationRule()); 
@@ -2637,23 +3160,23 @@
 
 
     // $ANTLR start "ruleXAnnotation"
-    // InternalDataDSL.g:778:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
+    // InternalDataDSL.g:928:1: ruleXAnnotation : ( ( rule__XAnnotation__Group__0 ) ) ;
     public final void ruleXAnnotation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:782:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
-            // InternalDataDSL.g:783:2: ( ( rule__XAnnotation__Group__0 ) )
+            // InternalDataDSL.g:932:2: ( ( ( rule__XAnnotation__Group__0 ) ) )
+            // InternalDataDSL.g:933:2: ( ( rule__XAnnotation__Group__0 ) )
             {
-            // InternalDataDSL.g:783:2: ( ( rule__XAnnotation__Group__0 ) )
-            // InternalDataDSL.g:784:3: ( rule__XAnnotation__Group__0 )
+            // InternalDataDSL.g:933:2: ( ( rule__XAnnotation__Group__0 ) )
+            // InternalDataDSL.g:934:3: ( rule__XAnnotation__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup()); 
             }
-            // InternalDataDSL.g:785:3: ( rule__XAnnotation__Group__0 )
-            // InternalDataDSL.g:785:4: rule__XAnnotation__Group__0
+            // InternalDataDSL.g:935:3: ( rule__XAnnotation__Group__0 )
+            // InternalDataDSL.g:935:4: rule__XAnnotation__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group__0();
@@ -2688,11 +3211,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValuePair"
-    // InternalDataDSL.g:794:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
+    // InternalDataDSL.g:944:1: entryRuleXAnnotationElementValuePair : ruleXAnnotationElementValuePair EOF ;
     public final void entryRuleXAnnotationElementValuePair() throws RecognitionException {
         try {
-            // InternalDataDSL.g:795:1: ( ruleXAnnotationElementValuePair EOF )
-            // InternalDataDSL.g:796:1: ruleXAnnotationElementValuePair EOF
+            // InternalDataDSL.g:945:1: ( ruleXAnnotationElementValuePair EOF )
+            // InternalDataDSL.g:946:1: ruleXAnnotationElementValuePair EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairRule()); 
@@ -2722,23 +3245,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValuePair"
-    // InternalDataDSL.g:803:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
+    // InternalDataDSL.g:953:1: ruleXAnnotationElementValuePair : ( ( rule__XAnnotationElementValuePair__Group__0 ) ) ;
     public final void ruleXAnnotationElementValuePair() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:807:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
-            // InternalDataDSL.g:808:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            // InternalDataDSL.g:957:2: ( ( ( rule__XAnnotationElementValuePair__Group__0 ) ) )
+            // InternalDataDSL.g:958:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
             {
-            // InternalDataDSL.g:808:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
-            // InternalDataDSL.g:809:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            // InternalDataDSL.g:958:2: ( ( rule__XAnnotationElementValuePair__Group__0 ) )
+            // InternalDataDSL.g:959:3: ( rule__XAnnotationElementValuePair__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup()); 
             }
-            // InternalDataDSL.g:810:3: ( rule__XAnnotationElementValuePair__Group__0 )
-            // InternalDataDSL.g:810:4: rule__XAnnotationElementValuePair__Group__0
+            // InternalDataDSL.g:960:3: ( rule__XAnnotationElementValuePair__Group__0 )
+            // InternalDataDSL.g:960:4: rule__XAnnotationElementValuePair__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group__0();
@@ -2773,11 +3296,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
-    // InternalDataDSL.g:819:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
+    // InternalDataDSL.g:969:1: entryRuleXAnnotationElementValueOrCommaList : ruleXAnnotationElementValueOrCommaList EOF ;
     public final void entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
         try {
-            // InternalDataDSL.g:820:1: ( ruleXAnnotationElementValueOrCommaList EOF )
-            // InternalDataDSL.g:821:1: ruleXAnnotationElementValueOrCommaList EOF
+            // InternalDataDSL.g:970:1: ( ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalDataDSL.g:971:1: ruleXAnnotationElementValueOrCommaList EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
@@ -2807,23 +3330,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
-    // InternalDataDSL.g:828:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
+    // InternalDataDSL.g:978:1: ruleXAnnotationElementValueOrCommaList : ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) ;
     public final void ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:832:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
-            // InternalDataDSL.g:833:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            // InternalDataDSL.g:982:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) ) )
+            // InternalDataDSL.g:983:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
             {
-            // InternalDataDSL.g:833:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
-            // InternalDataDSL.g:834:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            // InternalDataDSL.g:983:2: ( ( rule__XAnnotationElementValueOrCommaList__Alternatives ) )
+            // InternalDataDSL.g:984:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:835:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
-            // InternalDataDSL.g:835:4: rule__XAnnotationElementValueOrCommaList__Alternatives
+            // InternalDataDSL.g:985:3: ( rule__XAnnotationElementValueOrCommaList__Alternatives )
+            // InternalDataDSL.g:985:4: rule__XAnnotationElementValueOrCommaList__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Alternatives();
@@ -2858,11 +3381,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValue"
-    // InternalDataDSL.g:844:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
+    // InternalDataDSL.g:994:1: entryRuleXAnnotationElementValue : ruleXAnnotationElementValue EOF ;
     public final void entryRuleXAnnotationElementValue() throws RecognitionException {
         try {
-            // InternalDataDSL.g:845:1: ( ruleXAnnotationElementValue EOF )
-            // InternalDataDSL.g:846:1: ruleXAnnotationElementValue EOF
+            // InternalDataDSL.g:995:1: ( ruleXAnnotationElementValue EOF )
+            // InternalDataDSL.g:996:1: ruleXAnnotationElementValue EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueRule()); 
@@ -2892,23 +3415,23 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValue"
-    // InternalDataDSL.g:853:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
+    // InternalDataDSL.g:1003:1: ruleXAnnotationElementValue : ( ( rule__XAnnotationElementValue__Alternatives ) ) ;
     public final void ruleXAnnotationElementValue() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:857:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
-            // InternalDataDSL.g:858:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            // InternalDataDSL.g:1007:2: ( ( ( rule__XAnnotationElementValue__Alternatives ) ) )
+            // InternalDataDSL.g:1008:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
             {
-            // InternalDataDSL.g:858:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
-            // InternalDataDSL.g:859:3: ( rule__XAnnotationElementValue__Alternatives )
+            // InternalDataDSL.g:1008:2: ( ( rule__XAnnotationElementValue__Alternatives ) )
+            // InternalDataDSL.g:1009:3: ( rule__XAnnotationElementValue__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:860:3: ( rule__XAnnotationElementValue__Alternatives )
-            // InternalDataDSL.g:860:4: rule__XAnnotationElementValue__Alternatives
+            // InternalDataDSL.g:1010:3: ( rule__XAnnotationElementValue__Alternatives )
+            // InternalDataDSL.g:1010:4: rule__XAnnotationElementValue__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Alternatives();
@@ -2943,11 +3466,11 @@
 
 
     // $ANTLR start "entryRuleXAnnotationOrExpression"
-    // InternalDataDSL.g:869:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
+    // InternalDataDSL.g:1019:1: entryRuleXAnnotationOrExpression : ruleXAnnotationOrExpression EOF ;
     public final void entryRuleXAnnotationOrExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:870:1: ( ruleXAnnotationOrExpression EOF )
-            // InternalDataDSL.g:871:1: ruleXAnnotationOrExpression EOF
+            // InternalDataDSL.g:1020:1: ( ruleXAnnotationOrExpression EOF )
+            // InternalDataDSL.g:1021:1: ruleXAnnotationOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationOrExpressionRule()); 
@@ -2977,23 +3500,23 @@
 
 
     // $ANTLR start "ruleXAnnotationOrExpression"
-    // InternalDataDSL.g:878:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
+    // InternalDataDSL.g:1028:1: ruleXAnnotationOrExpression : ( ( rule__XAnnotationOrExpression__Alternatives ) ) ;
     public final void ruleXAnnotationOrExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:882:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
-            // InternalDataDSL.g:883:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            // InternalDataDSL.g:1032:2: ( ( ( rule__XAnnotationOrExpression__Alternatives ) ) )
+            // InternalDataDSL.g:1033:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
             {
-            // InternalDataDSL.g:883:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
-            // InternalDataDSL.g:884:3: ( rule__XAnnotationOrExpression__Alternatives )
+            // InternalDataDSL.g:1033:2: ( ( rule__XAnnotationOrExpression__Alternatives ) )
+            // InternalDataDSL.g:1034:3: ( rule__XAnnotationOrExpression__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationOrExpressionAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:885:3: ( rule__XAnnotationOrExpression__Alternatives )
-            // InternalDataDSL.g:885:4: rule__XAnnotationOrExpression__Alternatives
+            // InternalDataDSL.g:1035:3: ( rule__XAnnotationOrExpression__Alternatives )
+            // InternalDataDSL.g:1035:4: rule__XAnnotationOrExpression__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationOrExpression__Alternatives();
@@ -3028,11 +3551,11 @@
 
 
     // $ANTLR start "entryRuleXExpression"
-    // InternalDataDSL.g:894:1: entryRuleXExpression : ruleXExpression EOF ;
+    // InternalDataDSL.g:1044:1: entryRuleXExpression : ruleXExpression EOF ;
     public final void entryRuleXExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:895:1: ( ruleXExpression EOF )
-            // InternalDataDSL.g:896:1: ruleXExpression EOF
+            // InternalDataDSL.g:1045:1: ( ruleXExpression EOF )
+            // InternalDataDSL.g:1046:1: ruleXExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionRule()); 
@@ -3062,17 +3585,17 @@
 
 
     // $ANTLR start "ruleXExpression"
-    // InternalDataDSL.g:903:1: ruleXExpression : ( ruleXAssignment ) ;
+    // InternalDataDSL.g:1053:1: ruleXExpression : ( ruleXAssignment ) ;
     public final void ruleXExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:907:2: ( ( ruleXAssignment ) )
-            // InternalDataDSL.g:908:2: ( ruleXAssignment )
+            // InternalDataDSL.g:1057:2: ( ( ruleXAssignment ) )
+            // InternalDataDSL.g:1058:2: ( ruleXAssignment )
             {
-            // InternalDataDSL.g:908:2: ( ruleXAssignment )
-            // InternalDataDSL.g:909:3: ruleXAssignment
+            // InternalDataDSL.g:1058:2: ( ruleXAssignment )
+            // InternalDataDSL.g:1059:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionAccess().getXAssignmentParserRuleCall()); 
@@ -3107,11 +3630,11 @@
 
 
     // $ANTLR start "entryRuleXAssignment"
-    // InternalDataDSL.g:919:1: entryRuleXAssignment : ruleXAssignment EOF ;
+    // InternalDataDSL.g:1069:1: entryRuleXAssignment : ruleXAssignment EOF ;
     public final void entryRuleXAssignment() throws RecognitionException {
         try {
-            // InternalDataDSL.g:920:1: ( ruleXAssignment EOF )
-            // InternalDataDSL.g:921:1: ruleXAssignment EOF
+            // InternalDataDSL.g:1070:1: ( ruleXAssignment EOF )
+            // InternalDataDSL.g:1071:1: ruleXAssignment EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentRule()); 
@@ -3141,23 +3664,23 @@
 
 
     // $ANTLR start "ruleXAssignment"
-    // InternalDataDSL.g:928:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
+    // InternalDataDSL.g:1078:1: ruleXAssignment : ( ( rule__XAssignment__Alternatives ) ) ;
     public final void ruleXAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:932:2: ( ( ( rule__XAssignment__Alternatives ) ) )
-            // InternalDataDSL.g:933:2: ( ( rule__XAssignment__Alternatives ) )
+            // InternalDataDSL.g:1082:2: ( ( ( rule__XAssignment__Alternatives ) ) )
+            // InternalDataDSL.g:1083:2: ( ( rule__XAssignment__Alternatives ) )
             {
-            // InternalDataDSL.g:933:2: ( ( rule__XAssignment__Alternatives ) )
-            // InternalDataDSL.g:934:3: ( rule__XAssignment__Alternatives )
+            // InternalDataDSL.g:1083:2: ( ( rule__XAssignment__Alternatives ) )
+            // InternalDataDSL.g:1084:3: ( rule__XAssignment__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:935:3: ( rule__XAssignment__Alternatives )
-            // InternalDataDSL.g:935:4: rule__XAssignment__Alternatives
+            // InternalDataDSL.g:1085:3: ( rule__XAssignment__Alternatives )
+            // InternalDataDSL.g:1085:4: rule__XAssignment__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Alternatives();
@@ -3192,11 +3715,11 @@
 
 
     // $ANTLR start "entryRuleOpSingleAssign"
-    // InternalDataDSL.g:944:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
+    // InternalDataDSL.g:1094:1: entryRuleOpSingleAssign : ruleOpSingleAssign EOF ;
     public final void entryRuleOpSingleAssign() throws RecognitionException {
         try {
-            // InternalDataDSL.g:945:1: ( ruleOpSingleAssign EOF )
-            // InternalDataDSL.g:946:1: ruleOpSingleAssign EOF
+            // InternalDataDSL.g:1095:1: ( ruleOpSingleAssign EOF )
+            // InternalDataDSL.g:1096:1: ruleOpSingleAssign EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpSingleAssignRule()); 
@@ -3226,17 +3749,17 @@
 
 
     // $ANTLR start "ruleOpSingleAssign"
-    // InternalDataDSL.g:953:1: ruleOpSingleAssign : ( '=' ) ;
+    // InternalDataDSL.g:1103:1: ruleOpSingleAssign : ( '=' ) ;
     public final void ruleOpSingleAssign() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:957:2: ( ( '=' ) )
-            // InternalDataDSL.g:958:2: ( '=' )
+            // InternalDataDSL.g:1107:2: ( ( '=' ) )
+            // InternalDataDSL.g:1108:2: ( '=' )
             {
-            // InternalDataDSL.g:958:2: ( '=' )
-            // InternalDataDSL.g:959:3: '='
+            // InternalDataDSL.g:1108:2: ( '=' )
+            // InternalDataDSL.g:1109:3: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpSingleAssignAccess().getEqualsSignKeyword()); 
@@ -3267,11 +3790,11 @@
 
 
     // $ANTLR start "entryRuleOpMultiAssign"
-    // InternalDataDSL.g:969:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
+    // InternalDataDSL.g:1119:1: entryRuleOpMultiAssign : ruleOpMultiAssign EOF ;
     public final void entryRuleOpMultiAssign() throws RecognitionException {
         try {
-            // InternalDataDSL.g:970:1: ( ruleOpMultiAssign EOF )
-            // InternalDataDSL.g:971:1: ruleOpMultiAssign EOF
+            // InternalDataDSL.g:1120:1: ( ruleOpMultiAssign EOF )
+            // InternalDataDSL.g:1121:1: ruleOpMultiAssign EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignRule()); 
@@ -3301,23 +3824,23 @@
 
 
     // $ANTLR start "ruleOpMultiAssign"
-    // InternalDataDSL.g:978:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
+    // InternalDataDSL.g:1128:1: ruleOpMultiAssign : ( ( rule__OpMultiAssign__Alternatives ) ) ;
     public final void ruleOpMultiAssign() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:982:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
-            // InternalDataDSL.g:983:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            // InternalDataDSL.g:1132:2: ( ( ( rule__OpMultiAssign__Alternatives ) ) )
+            // InternalDataDSL.g:1133:2: ( ( rule__OpMultiAssign__Alternatives ) )
             {
-            // InternalDataDSL.g:983:2: ( ( rule__OpMultiAssign__Alternatives ) )
-            // InternalDataDSL.g:984:3: ( rule__OpMultiAssign__Alternatives )
+            // InternalDataDSL.g:1133:2: ( ( rule__OpMultiAssign__Alternatives ) )
+            // InternalDataDSL.g:1134:3: ( rule__OpMultiAssign__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:985:3: ( rule__OpMultiAssign__Alternatives )
-            // InternalDataDSL.g:985:4: rule__OpMultiAssign__Alternatives
+            // InternalDataDSL.g:1135:3: ( rule__OpMultiAssign__Alternatives )
+            // InternalDataDSL.g:1135:4: rule__OpMultiAssign__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Alternatives();
@@ -3352,11 +3875,11 @@
 
 
     // $ANTLR start "entryRuleXOrExpression"
-    // InternalDataDSL.g:994:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
+    // InternalDataDSL.g:1144:1: entryRuleXOrExpression : ruleXOrExpression EOF ;
     public final void entryRuleXOrExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:995:1: ( ruleXOrExpression EOF )
-            // InternalDataDSL.g:996:1: ruleXOrExpression EOF
+            // InternalDataDSL.g:1145:1: ( ruleXOrExpression EOF )
+            // InternalDataDSL.g:1146:1: ruleXOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionRule()); 
@@ -3386,23 +3909,23 @@
 
 
     // $ANTLR start "ruleXOrExpression"
-    // InternalDataDSL.g:1003:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1153:1: ruleXOrExpression : ( ( rule__XOrExpression__Group__0 ) ) ;
     public final void ruleXOrExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1007:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1008:2: ( ( rule__XOrExpression__Group__0 ) )
+            // InternalDataDSL.g:1157:2: ( ( ( rule__XOrExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1158:2: ( ( rule__XOrExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1008:2: ( ( rule__XOrExpression__Group__0 ) )
-            // InternalDataDSL.g:1009:3: ( rule__XOrExpression__Group__0 )
+            // InternalDataDSL.g:1158:2: ( ( rule__XOrExpression__Group__0 ) )
+            // InternalDataDSL.g:1159:3: ( rule__XOrExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1010:3: ( rule__XOrExpression__Group__0 )
-            // InternalDataDSL.g:1010:4: rule__XOrExpression__Group__0
+            // InternalDataDSL.g:1160:3: ( rule__XOrExpression__Group__0 )
+            // InternalDataDSL.g:1160:4: rule__XOrExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group__0();
@@ -3437,11 +3960,11 @@
 
 
     // $ANTLR start "entryRuleOpOr"
-    // InternalDataDSL.g:1019:1: entryRuleOpOr : ruleOpOr EOF ;
+    // InternalDataDSL.g:1169:1: entryRuleOpOr : ruleOpOr EOF ;
     public final void entryRuleOpOr() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1020:1: ( ruleOpOr EOF )
-            // InternalDataDSL.g:1021:1: ruleOpOr EOF
+            // InternalDataDSL.g:1170:1: ( ruleOpOr EOF )
+            // InternalDataDSL.g:1171:1: ruleOpOr EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOrRule()); 
@@ -3471,17 +3994,17 @@
 
 
     // $ANTLR start "ruleOpOr"
-    // InternalDataDSL.g:1028:1: ruleOpOr : ( '||' ) ;
+    // InternalDataDSL.g:1178:1: ruleOpOr : ( '||' ) ;
     public final void ruleOpOr() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1032:2: ( ( '||' ) )
-            // InternalDataDSL.g:1033:2: ( '||' )
+            // InternalDataDSL.g:1182:2: ( ( '||' ) )
+            // InternalDataDSL.g:1183:2: ( '||' )
             {
-            // InternalDataDSL.g:1033:2: ( '||' )
-            // InternalDataDSL.g:1034:3: '||'
+            // InternalDataDSL.g:1183:2: ( '||' )
+            // InternalDataDSL.g:1184:3: '||'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOrAccess().getVerticalLineVerticalLineKeyword()); 
@@ -3512,11 +4035,11 @@
 
 
     // $ANTLR start "entryRuleXAndExpression"
-    // InternalDataDSL.g:1044:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
+    // InternalDataDSL.g:1194:1: entryRuleXAndExpression : ruleXAndExpression EOF ;
     public final void entryRuleXAndExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1045:1: ( ruleXAndExpression EOF )
-            // InternalDataDSL.g:1046:1: ruleXAndExpression EOF
+            // InternalDataDSL.g:1195:1: ( ruleXAndExpression EOF )
+            // InternalDataDSL.g:1196:1: ruleXAndExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionRule()); 
@@ -3546,23 +4069,23 @@
 
 
     // $ANTLR start "ruleXAndExpression"
-    // InternalDataDSL.g:1053:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1203:1: ruleXAndExpression : ( ( rule__XAndExpression__Group__0 ) ) ;
     public final void ruleXAndExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1057:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1058:2: ( ( rule__XAndExpression__Group__0 ) )
+            // InternalDataDSL.g:1207:2: ( ( ( rule__XAndExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1208:2: ( ( rule__XAndExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1058:2: ( ( rule__XAndExpression__Group__0 ) )
-            // InternalDataDSL.g:1059:3: ( rule__XAndExpression__Group__0 )
+            // InternalDataDSL.g:1208:2: ( ( rule__XAndExpression__Group__0 ) )
+            // InternalDataDSL.g:1209:3: ( rule__XAndExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1060:3: ( rule__XAndExpression__Group__0 )
-            // InternalDataDSL.g:1060:4: rule__XAndExpression__Group__0
+            // InternalDataDSL.g:1210:3: ( rule__XAndExpression__Group__0 )
+            // InternalDataDSL.g:1210:4: rule__XAndExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group__0();
@@ -3597,11 +4120,11 @@
 
 
     // $ANTLR start "entryRuleOpAnd"
-    // InternalDataDSL.g:1069:1: entryRuleOpAnd : ruleOpAnd EOF ;
+    // InternalDataDSL.g:1219:1: entryRuleOpAnd : ruleOpAnd EOF ;
     public final void entryRuleOpAnd() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1070:1: ( ruleOpAnd EOF )
-            // InternalDataDSL.g:1071:1: ruleOpAnd EOF
+            // InternalDataDSL.g:1220:1: ( ruleOpAnd EOF )
+            // InternalDataDSL.g:1221:1: ruleOpAnd EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAndRule()); 
@@ -3631,17 +4154,17 @@
 
 
     // $ANTLR start "ruleOpAnd"
-    // InternalDataDSL.g:1078:1: ruleOpAnd : ( '&&' ) ;
+    // InternalDataDSL.g:1228:1: ruleOpAnd : ( '&&' ) ;
     public final void ruleOpAnd() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1082:2: ( ( '&&' ) )
-            // InternalDataDSL.g:1083:2: ( '&&' )
+            // InternalDataDSL.g:1232:2: ( ( '&&' ) )
+            // InternalDataDSL.g:1233:2: ( '&&' )
             {
-            // InternalDataDSL.g:1083:2: ( '&&' )
-            // InternalDataDSL.g:1084:3: '&&'
+            // InternalDataDSL.g:1233:2: ( '&&' )
+            // InternalDataDSL.g:1234:3: '&&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAndAccess().getAmpersandAmpersandKeyword()); 
@@ -3672,11 +4195,11 @@
 
 
     // $ANTLR start "entryRuleXEqualityExpression"
-    // InternalDataDSL.g:1094:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
+    // InternalDataDSL.g:1244:1: entryRuleXEqualityExpression : ruleXEqualityExpression EOF ;
     public final void entryRuleXEqualityExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1095:1: ( ruleXEqualityExpression EOF )
-            // InternalDataDSL.g:1096:1: ruleXEqualityExpression EOF
+            // InternalDataDSL.g:1245:1: ( ruleXEqualityExpression EOF )
+            // InternalDataDSL.g:1246:1: ruleXEqualityExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionRule()); 
@@ -3706,23 +4229,23 @@
 
 
     // $ANTLR start "ruleXEqualityExpression"
-    // InternalDataDSL.g:1103:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1253:1: ruleXEqualityExpression : ( ( rule__XEqualityExpression__Group__0 ) ) ;
     public final void ruleXEqualityExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1107:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1108:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            // InternalDataDSL.g:1257:2: ( ( ( rule__XEqualityExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1258:2: ( ( rule__XEqualityExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1108:2: ( ( rule__XEqualityExpression__Group__0 ) )
-            // InternalDataDSL.g:1109:3: ( rule__XEqualityExpression__Group__0 )
+            // InternalDataDSL.g:1258:2: ( ( rule__XEqualityExpression__Group__0 ) )
+            // InternalDataDSL.g:1259:3: ( rule__XEqualityExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1110:3: ( rule__XEqualityExpression__Group__0 )
-            // InternalDataDSL.g:1110:4: rule__XEqualityExpression__Group__0
+            // InternalDataDSL.g:1260:3: ( rule__XEqualityExpression__Group__0 )
+            // InternalDataDSL.g:1260:4: rule__XEqualityExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group__0();
@@ -3757,11 +4280,11 @@
 
 
     // $ANTLR start "entryRuleOpEquality"
-    // InternalDataDSL.g:1119:1: entryRuleOpEquality : ruleOpEquality EOF ;
+    // InternalDataDSL.g:1269:1: entryRuleOpEquality : ruleOpEquality EOF ;
     public final void entryRuleOpEquality() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1120:1: ( ruleOpEquality EOF )
-            // InternalDataDSL.g:1121:1: ruleOpEquality EOF
+            // InternalDataDSL.g:1270:1: ( ruleOpEquality EOF )
+            // InternalDataDSL.g:1271:1: ruleOpEquality EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpEqualityRule()); 
@@ -3791,23 +4314,23 @@
 
 
     // $ANTLR start "ruleOpEquality"
-    // InternalDataDSL.g:1128:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
+    // InternalDataDSL.g:1278:1: ruleOpEquality : ( ( rule__OpEquality__Alternatives ) ) ;
     public final void ruleOpEquality() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1132:2: ( ( ( rule__OpEquality__Alternatives ) ) )
-            // InternalDataDSL.g:1133:2: ( ( rule__OpEquality__Alternatives ) )
+            // InternalDataDSL.g:1282:2: ( ( ( rule__OpEquality__Alternatives ) ) )
+            // InternalDataDSL.g:1283:2: ( ( rule__OpEquality__Alternatives ) )
             {
-            // InternalDataDSL.g:1133:2: ( ( rule__OpEquality__Alternatives ) )
-            // InternalDataDSL.g:1134:3: ( rule__OpEquality__Alternatives )
+            // InternalDataDSL.g:1283:2: ( ( rule__OpEquality__Alternatives ) )
+            // InternalDataDSL.g:1284:3: ( rule__OpEquality__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpEqualityAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1135:3: ( rule__OpEquality__Alternatives )
-            // InternalDataDSL.g:1135:4: rule__OpEquality__Alternatives
+            // InternalDataDSL.g:1285:3: ( rule__OpEquality__Alternatives )
+            // InternalDataDSL.g:1285:4: rule__OpEquality__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpEquality__Alternatives();
@@ -3842,11 +4365,11 @@
 
 
     // $ANTLR start "entryRuleXRelationalExpression"
-    // InternalDataDSL.g:1144:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
+    // InternalDataDSL.g:1294:1: entryRuleXRelationalExpression : ruleXRelationalExpression EOF ;
     public final void entryRuleXRelationalExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1145:1: ( ruleXRelationalExpression EOF )
-            // InternalDataDSL.g:1146:1: ruleXRelationalExpression EOF
+            // InternalDataDSL.g:1295:1: ( ruleXRelationalExpression EOF )
+            // InternalDataDSL.g:1296:1: ruleXRelationalExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionRule()); 
@@ -3876,23 +4399,23 @@
 
 
     // $ANTLR start "ruleXRelationalExpression"
-    // InternalDataDSL.g:1153:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1303:1: ruleXRelationalExpression : ( ( rule__XRelationalExpression__Group__0 ) ) ;
     public final void ruleXRelationalExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1157:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1158:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            // InternalDataDSL.g:1307:2: ( ( ( rule__XRelationalExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1308:2: ( ( rule__XRelationalExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1158:2: ( ( rule__XRelationalExpression__Group__0 ) )
-            // InternalDataDSL.g:1159:3: ( rule__XRelationalExpression__Group__0 )
+            // InternalDataDSL.g:1308:2: ( ( rule__XRelationalExpression__Group__0 ) )
+            // InternalDataDSL.g:1309:3: ( rule__XRelationalExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1160:3: ( rule__XRelationalExpression__Group__0 )
-            // InternalDataDSL.g:1160:4: rule__XRelationalExpression__Group__0
+            // InternalDataDSL.g:1310:3: ( rule__XRelationalExpression__Group__0 )
+            // InternalDataDSL.g:1310:4: rule__XRelationalExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group__0();
@@ -3927,11 +4450,11 @@
 
 
     // $ANTLR start "entryRuleOpCompare"
-    // InternalDataDSL.g:1169:1: entryRuleOpCompare : ruleOpCompare EOF ;
+    // InternalDataDSL.g:1319:1: entryRuleOpCompare : ruleOpCompare EOF ;
     public final void entryRuleOpCompare() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1170:1: ( ruleOpCompare EOF )
-            // InternalDataDSL.g:1171:1: ruleOpCompare EOF
+            // InternalDataDSL.g:1320:1: ( ruleOpCompare EOF )
+            // InternalDataDSL.g:1321:1: ruleOpCompare EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareRule()); 
@@ -3961,23 +4484,23 @@
 
 
     // $ANTLR start "ruleOpCompare"
-    // InternalDataDSL.g:1178:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
+    // InternalDataDSL.g:1328:1: ruleOpCompare : ( ( rule__OpCompare__Alternatives ) ) ;
     public final void ruleOpCompare() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1182:2: ( ( ( rule__OpCompare__Alternatives ) ) )
-            // InternalDataDSL.g:1183:2: ( ( rule__OpCompare__Alternatives ) )
+            // InternalDataDSL.g:1332:2: ( ( ( rule__OpCompare__Alternatives ) ) )
+            // InternalDataDSL.g:1333:2: ( ( rule__OpCompare__Alternatives ) )
             {
-            // InternalDataDSL.g:1183:2: ( ( rule__OpCompare__Alternatives ) )
-            // InternalDataDSL.g:1184:3: ( rule__OpCompare__Alternatives )
+            // InternalDataDSL.g:1333:2: ( ( rule__OpCompare__Alternatives ) )
+            // InternalDataDSL.g:1334:3: ( rule__OpCompare__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1185:3: ( rule__OpCompare__Alternatives )
-            // InternalDataDSL.g:1185:4: rule__OpCompare__Alternatives
+            // InternalDataDSL.g:1335:3: ( rule__OpCompare__Alternatives )
+            // InternalDataDSL.g:1335:4: rule__OpCompare__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpCompare__Alternatives();
@@ -4012,11 +4535,11 @@
 
 
     // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // InternalDataDSL.g:1194:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
+    // InternalDataDSL.g:1344:1: entryRuleXOtherOperatorExpression : ruleXOtherOperatorExpression EOF ;
     public final void entryRuleXOtherOperatorExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1195:1: ( ruleXOtherOperatorExpression EOF )
-            // InternalDataDSL.g:1196:1: ruleXOtherOperatorExpression EOF
+            // InternalDataDSL.g:1345:1: ( ruleXOtherOperatorExpression EOF )
+            // InternalDataDSL.g:1346:1: ruleXOtherOperatorExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionRule()); 
@@ -4046,23 +4569,23 @@
 
 
     // $ANTLR start "ruleXOtherOperatorExpression"
-    // InternalDataDSL.g:1203:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1353:1: ruleXOtherOperatorExpression : ( ( rule__XOtherOperatorExpression__Group__0 ) ) ;
     public final void ruleXOtherOperatorExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1207:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1208:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            // InternalDataDSL.g:1357:2: ( ( ( rule__XOtherOperatorExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1358:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1208:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
-            // InternalDataDSL.g:1209:3: ( rule__XOtherOperatorExpression__Group__0 )
+            // InternalDataDSL.g:1358:2: ( ( rule__XOtherOperatorExpression__Group__0 ) )
+            // InternalDataDSL.g:1359:3: ( rule__XOtherOperatorExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1210:3: ( rule__XOtherOperatorExpression__Group__0 )
-            // InternalDataDSL.g:1210:4: rule__XOtherOperatorExpression__Group__0
+            // InternalDataDSL.g:1360:3: ( rule__XOtherOperatorExpression__Group__0 )
+            // InternalDataDSL.g:1360:4: rule__XOtherOperatorExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group__0();
@@ -4097,11 +4620,11 @@
 
 
     // $ANTLR start "entryRuleOpOther"
-    // InternalDataDSL.g:1219:1: entryRuleOpOther : ruleOpOther EOF ;
+    // InternalDataDSL.g:1369:1: entryRuleOpOther : ruleOpOther EOF ;
     public final void entryRuleOpOther() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1220:1: ( ruleOpOther EOF )
-            // InternalDataDSL.g:1221:1: ruleOpOther EOF
+            // InternalDataDSL.g:1370:1: ( ruleOpOther EOF )
+            // InternalDataDSL.g:1371:1: ruleOpOther EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherRule()); 
@@ -4131,23 +4654,23 @@
 
 
     // $ANTLR start "ruleOpOther"
-    // InternalDataDSL.g:1228:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
+    // InternalDataDSL.g:1378:1: ruleOpOther : ( ( rule__OpOther__Alternatives ) ) ;
     public final void ruleOpOther() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1232:2: ( ( ( rule__OpOther__Alternatives ) ) )
-            // InternalDataDSL.g:1233:2: ( ( rule__OpOther__Alternatives ) )
+            // InternalDataDSL.g:1382:2: ( ( ( rule__OpOther__Alternatives ) ) )
+            // InternalDataDSL.g:1383:2: ( ( rule__OpOther__Alternatives ) )
             {
-            // InternalDataDSL.g:1233:2: ( ( rule__OpOther__Alternatives ) )
-            // InternalDataDSL.g:1234:3: ( rule__OpOther__Alternatives )
+            // InternalDataDSL.g:1383:2: ( ( rule__OpOther__Alternatives ) )
+            // InternalDataDSL.g:1384:3: ( rule__OpOther__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1235:3: ( rule__OpOther__Alternatives )
-            // InternalDataDSL.g:1235:4: rule__OpOther__Alternatives
+            // InternalDataDSL.g:1385:3: ( rule__OpOther__Alternatives )
+            // InternalDataDSL.g:1385:4: rule__OpOther__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives();
@@ -4182,11 +4705,11 @@
 
 
     // $ANTLR start "entryRuleXAdditiveExpression"
-    // InternalDataDSL.g:1244:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
+    // InternalDataDSL.g:1394:1: entryRuleXAdditiveExpression : ruleXAdditiveExpression EOF ;
     public final void entryRuleXAdditiveExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1245:1: ( ruleXAdditiveExpression EOF )
-            // InternalDataDSL.g:1246:1: ruleXAdditiveExpression EOF
+            // InternalDataDSL.g:1395:1: ( ruleXAdditiveExpression EOF )
+            // InternalDataDSL.g:1396:1: ruleXAdditiveExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionRule()); 
@@ -4216,23 +4739,23 @@
 
 
     // $ANTLR start "ruleXAdditiveExpression"
-    // InternalDataDSL.g:1253:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1403:1: ruleXAdditiveExpression : ( ( rule__XAdditiveExpression__Group__0 ) ) ;
     public final void ruleXAdditiveExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1257:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1258:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            // InternalDataDSL.g:1407:2: ( ( ( rule__XAdditiveExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1408:2: ( ( rule__XAdditiveExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1258:2: ( ( rule__XAdditiveExpression__Group__0 ) )
-            // InternalDataDSL.g:1259:3: ( rule__XAdditiveExpression__Group__0 )
+            // InternalDataDSL.g:1408:2: ( ( rule__XAdditiveExpression__Group__0 ) )
+            // InternalDataDSL.g:1409:3: ( rule__XAdditiveExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1260:3: ( rule__XAdditiveExpression__Group__0 )
-            // InternalDataDSL.g:1260:4: rule__XAdditiveExpression__Group__0
+            // InternalDataDSL.g:1410:3: ( rule__XAdditiveExpression__Group__0 )
+            // InternalDataDSL.g:1410:4: rule__XAdditiveExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group__0();
@@ -4267,11 +4790,11 @@
 
 
     // $ANTLR start "entryRuleOpAdd"
-    // InternalDataDSL.g:1269:1: entryRuleOpAdd : ruleOpAdd EOF ;
+    // InternalDataDSL.g:1419:1: entryRuleOpAdd : ruleOpAdd EOF ;
     public final void entryRuleOpAdd() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1270:1: ( ruleOpAdd EOF )
-            // InternalDataDSL.g:1271:1: ruleOpAdd EOF
+            // InternalDataDSL.g:1420:1: ( ruleOpAdd EOF )
+            // InternalDataDSL.g:1421:1: ruleOpAdd EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAddRule()); 
@@ -4301,23 +4824,23 @@
 
 
     // $ANTLR start "ruleOpAdd"
-    // InternalDataDSL.g:1278:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
+    // InternalDataDSL.g:1428:1: ruleOpAdd : ( ( rule__OpAdd__Alternatives ) ) ;
     public final void ruleOpAdd() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1282:2: ( ( ( rule__OpAdd__Alternatives ) ) )
-            // InternalDataDSL.g:1283:2: ( ( rule__OpAdd__Alternatives ) )
+            // InternalDataDSL.g:1432:2: ( ( ( rule__OpAdd__Alternatives ) ) )
+            // InternalDataDSL.g:1433:2: ( ( rule__OpAdd__Alternatives ) )
             {
-            // InternalDataDSL.g:1283:2: ( ( rule__OpAdd__Alternatives ) )
-            // InternalDataDSL.g:1284:3: ( rule__OpAdd__Alternatives )
+            // InternalDataDSL.g:1433:2: ( ( rule__OpAdd__Alternatives ) )
+            // InternalDataDSL.g:1434:3: ( rule__OpAdd__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpAddAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1285:3: ( rule__OpAdd__Alternatives )
-            // InternalDataDSL.g:1285:4: rule__OpAdd__Alternatives
+            // InternalDataDSL.g:1435:3: ( rule__OpAdd__Alternatives )
+            // InternalDataDSL.g:1435:4: rule__OpAdd__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpAdd__Alternatives();
@@ -4352,11 +4875,11 @@
 
 
     // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // InternalDataDSL.g:1294:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
+    // InternalDataDSL.g:1444:1: entryRuleXMultiplicativeExpression : ruleXMultiplicativeExpression EOF ;
     public final void entryRuleXMultiplicativeExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1295:1: ( ruleXMultiplicativeExpression EOF )
-            // InternalDataDSL.g:1296:1: ruleXMultiplicativeExpression EOF
+            // InternalDataDSL.g:1445:1: ( ruleXMultiplicativeExpression EOF )
+            // InternalDataDSL.g:1446:1: ruleXMultiplicativeExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionRule()); 
@@ -4386,23 +4909,23 @@
 
 
     // $ANTLR start "ruleXMultiplicativeExpression"
-    // InternalDataDSL.g:1303:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1453:1: ruleXMultiplicativeExpression : ( ( rule__XMultiplicativeExpression__Group__0 ) ) ;
     public final void ruleXMultiplicativeExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1307:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1308:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            // InternalDataDSL.g:1457:2: ( ( ( rule__XMultiplicativeExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1458:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1308:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
-            // InternalDataDSL.g:1309:3: ( rule__XMultiplicativeExpression__Group__0 )
+            // InternalDataDSL.g:1458:2: ( ( rule__XMultiplicativeExpression__Group__0 ) )
+            // InternalDataDSL.g:1459:3: ( rule__XMultiplicativeExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1310:3: ( rule__XMultiplicativeExpression__Group__0 )
-            // InternalDataDSL.g:1310:4: rule__XMultiplicativeExpression__Group__0
+            // InternalDataDSL.g:1460:3: ( rule__XMultiplicativeExpression__Group__0 )
+            // InternalDataDSL.g:1460:4: rule__XMultiplicativeExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group__0();
@@ -4437,11 +4960,11 @@
 
 
     // $ANTLR start "entryRuleOpMulti"
-    // InternalDataDSL.g:1319:1: entryRuleOpMulti : ruleOpMulti EOF ;
+    // InternalDataDSL.g:1469:1: entryRuleOpMulti : ruleOpMulti EOF ;
     public final void entryRuleOpMulti() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1320:1: ( ruleOpMulti EOF )
-            // InternalDataDSL.g:1321:1: ruleOpMulti EOF
+            // InternalDataDSL.g:1470:1: ( ruleOpMulti EOF )
+            // InternalDataDSL.g:1471:1: ruleOpMulti EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiRule()); 
@@ -4471,23 +4994,23 @@
 
 
     // $ANTLR start "ruleOpMulti"
-    // InternalDataDSL.g:1328:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
+    // InternalDataDSL.g:1478:1: ruleOpMulti : ( ( rule__OpMulti__Alternatives ) ) ;
     public final void ruleOpMulti() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1332:2: ( ( ( rule__OpMulti__Alternatives ) ) )
-            // InternalDataDSL.g:1333:2: ( ( rule__OpMulti__Alternatives ) )
+            // InternalDataDSL.g:1482:2: ( ( ( rule__OpMulti__Alternatives ) ) )
+            // InternalDataDSL.g:1483:2: ( ( rule__OpMulti__Alternatives ) )
             {
-            // InternalDataDSL.g:1333:2: ( ( rule__OpMulti__Alternatives ) )
-            // InternalDataDSL.g:1334:3: ( rule__OpMulti__Alternatives )
+            // InternalDataDSL.g:1483:2: ( ( rule__OpMulti__Alternatives ) )
+            // InternalDataDSL.g:1484:3: ( rule__OpMulti__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1335:3: ( rule__OpMulti__Alternatives )
-            // InternalDataDSL.g:1335:4: rule__OpMulti__Alternatives
+            // InternalDataDSL.g:1485:3: ( rule__OpMulti__Alternatives )
+            // InternalDataDSL.g:1485:4: rule__OpMulti__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpMulti__Alternatives();
@@ -4522,11 +5045,11 @@
 
 
     // $ANTLR start "entryRuleXUnaryOperation"
-    // InternalDataDSL.g:1344:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
+    // InternalDataDSL.g:1494:1: entryRuleXUnaryOperation : ruleXUnaryOperation EOF ;
     public final void entryRuleXUnaryOperation() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1345:1: ( ruleXUnaryOperation EOF )
-            // InternalDataDSL.g:1346:1: ruleXUnaryOperation EOF
+            // InternalDataDSL.g:1495:1: ( ruleXUnaryOperation EOF )
+            // InternalDataDSL.g:1496:1: ruleXUnaryOperation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationRule()); 
@@ -4556,23 +5079,23 @@
 
 
     // $ANTLR start "ruleXUnaryOperation"
-    // InternalDataDSL.g:1353:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
+    // InternalDataDSL.g:1503:1: ruleXUnaryOperation : ( ( rule__XUnaryOperation__Alternatives ) ) ;
     public final void ruleXUnaryOperation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1357:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
-            // InternalDataDSL.g:1358:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            // InternalDataDSL.g:1507:2: ( ( ( rule__XUnaryOperation__Alternatives ) ) )
+            // InternalDataDSL.g:1508:2: ( ( rule__XUnaryOperation__Alternatives ) )
             {
-            // InternalDataDSL.g:1358:2: ( ( rule__XUnaryOperation__Alternatives ) )
-            // InternalDataDSL.g:1359:3: ( rule__XUnaryOperation__Alternatives )
+            // InternalDataDSL.g:1508:2: ( ( rule__XUnaryOperation__Alternatives ) )
+            // InternalDataDSL.g:1509:3: ( rule__XUnaryOperation__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1360:3: ( rule__XUnaryOperation__Alternatives )
-            // InternalDataDSL.g:1360:4: rule__XUnaryOperation__Alternatives
+            // InternalDataDSL.g:1510:3: ( rule__XUnaryOperation__Alternatives )
+            // InternalDataDSL.g:1510:4: rule__XUnaryOperation__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__Alternatives();
@@ -4607,11 +5130,11 @@
 
 
     // $ANTLR start "entryRuleOpUnary"
-    // InternalDataDSL.g:1369:1: entryRuleOpUnary : ruleOpUnary EOF ;
+    // InternalDataDSL.g:1519:1: entryRuleOpUnary : ruleOpUnary EOF ;
     public final void entryRuleOpUnary() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1370:1: ( ruleOpUnary EOF )
-            // InternalDataDSL.g:1371:1: ruleOpUnary EOF
+            // InternalDataDSL.g:1520:1: ( ruleOpUnary EOF )
+            // InternalDataDSL.g:1521:1: ruleOpUnary EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpUnaryRule()); 
@@ -4641,23 +5164,23 @@
 
 
     // $ANTLR start "ruleOpUnary"
-    // InternalDataDSL.g:1378:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
+    // InternalDataDSL.g:1528:1: ruleOpUnary : ( ( rule__OpUnary__Alternatives ) ) ;
     public final void ruleOpUnary() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1382:2: ( ( ( rule__OpUnary__Alternatives ) ) )
-            // InternalDataDSL.g:1383:2: ( ( rule__OpUnary__Alternatives ) )
+            // InternalDataDSL.g:1532:2: ( ( ( rule__OpUnary__Alternatives ) ) )
+            // InternalDataDSL.g:1533:2: ( ( rule__OpUnary__Alternatives ) )
             {
-            // InternalDataDSL.g:1383:2: ( ( rule__OpUnary__Alternatives ) )
-            // InternalDataDSL.g:1384:3: ( rule__OpUnary__Alternatives )
+            // InternalDataDSL.g:1533:2: ( ( rule__OpUnary__Alternatives ) )
+            // InternalDataDSL.g:1534:3: ( rule__OpUnary__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpUnaryAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1385:3: ( rule__OpUnary__Alternatives )
-            // InternalDataDSL.g:1385:4: rule__OpUnary__Alternatives
+            // InternalDataDSL.g:1535:3: ( rule__OpUnary__Alternatives )
+            // InternalDataDSL.g:1535:4: rule__OpUnary__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpUnary__Alternatives();
@@ -4692,11 +5215,11 @@
 
 
     // $ANTLR start "entryRuleXCastedExpression"
-    // InternalDataDSL.g:1394:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
+    // InternalDataDSL.g:1544:1: entryRuleXCastedExpression : ruleXCastedExpression EOF ;
     public final void entryRuleXCastedExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1395:1: ( ruleXCastedExpression EOF )
-            // InternalDataDSL.g:1396:1: ruleXCastedExpression EOF
+            // InternalDataDSL.g:1545:1: ( ruleXCastedExpression EOF )
+            // InternalDataDSL.g:1546:1: ruleXCastedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionRule()); 
@@ -4726,23 +5249,23 @@
 
 
     // $ANTLR start "ruleXCastedExpression"
-    // InternalDataDSL.g:1403:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1553:1: ruleXCastedExpression : ( ( rule__XCastedExpression__Group__0 ) ) ;
     public final void ruleXCastedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1407:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1408:2: ( ( rule__XCastedExpression__Group__0 ) )
+            // InternalDataDSL.g:1557:2: ( ( ( rule__XCastedExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1558:2: ( ( rule__XCastedExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1408:2: ( ( rule__XCastedExpression__Group__0 ) )
-            // InternalDataDSL.g:1409:3: ( rule__XCastedExpression__Group__0 )
+            // InternalDataDSL.g:1558:2: ( ( rule__XCastedExpression__Group__0 ) )
+            // InternalDataDSL.g:1559:3: ( rule__XCastedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1410:3: ( rule__XCastedExpression__Group__0 )
-            // InternalDataDSL.g:1410:4: rule__XCastedExpression__Group__0
+            // InternalDataDSL.g:1560:3: ( rule__XCastedExpression__Group__0 )
+            // InternalDataDSL.g:1560:4: rule__XCastedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group__0();
@@ -4777,11 +5300,11 @@
 
 
     // $ANTLR start "entryRuleXPostfixOperation"
-    // InternalDataDSL.g:1419:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
+    // InternalDataDSL.g:1569:1: entryRuleXPostfixOperation : ruleXPostfixOperation EOF ;
     public final void entryRuleXPostfixOperation() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1420:1: ( ruleXPostfixOperation EOF )
-            // InternalDataDSL.g:1421:1: ruleXPostfixOperation EOF
+            // InternalDataDSL.g:1570:1: ( ruleXPostfixOperation EOF )
+            // InternalDataDSL.g:1571:1: ruleXPostfixOperation EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationRule()); 
@@ -4811,23 +5334,23 @@
 
 
     // $ANTLR start "ruleXPostfixOperation"
-    // InternalDataDSL.g:1428:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
+    // InternalDataDSL.g:1578:1: ruleXPostfixOperation : ( ( rule__XPostfixOperation__Group__0 ) ) ;
     public final void ruleXPostfixOperation() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1432:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
-            // InternalDataDSL.g:1433:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            // InternalDataDSL.g:1582:2: ( ( ( rule__XPostfixOperation__Group__0 ) ) )
+            // InternalDataDSL.g:1583:2: ( ( rule__XPostfixOperation__Group__0 ) )
             {
-            // InternalDataDSL.g:1433:2: ( ( rule__XPostfixOperation__Group__0 ) )
-            // InternalDataDSL.g:1434:3: ( rule__XPostfixOperation__Group__0 )
+            // InternalDataDSL.g:1583:2: ( ( rule__XPostfixOperation__Group__0 ) )
+            // InternalDataDSL.g:1584:3: ( rule__XPostfixOperation__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1435:3: ( rule__XPostfixOperation__Group__0 )
-            // InternalDataDSL.g:1435:4: rule__XPostfixOperation__Group__0
+            // InternalDataDSL.g:1585:3: ( rule__XPostfixOperation__Group__0 )
+            // InternalDataDSL.g:1585:4: rule__XPostfixOperation__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group__0();
@@ -4862,11 +5385,11 @@
 
 
     // $ANTLR start "entryRuleOpPostfix"
-    // InternalDataDSL.g:1444:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
+    // InternalDataDSL.g:1594:1: entryRuleOpPostfix : ruleOpPostfix EOF ;
     public final void entryRuleOpPostfix() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1445:1: ( ruleOpPostfix EOF )
-            // InternalDataDSL.g:1446:1: ruleOpPostfix EOF
+            // InternalDataDSL.g:1595:1: ( ruleOpPostfix EOF )
+            // InternalDataDSL.g:1596:1: ruleOpPostfix EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpPostfixRule()); 
@@ -4896,23 +5419,23 @@
 
 
     // $ANTLR start "ruleOpPostfix"
-    // InternalDataDSL.g:1453:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
+    // InternalDataDSL.g:1603:1: ruleOpPostfix : ( ( rule__OpPostfix__Alternatives ) ) ;
     public final void ruleOpPostfix() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1457:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
-            // InternalDataDSL.g:1458:2: ( ( rule__OpPostfix__Alternatives ) )
+            // InternalDataDSL.g:1607:2: ( ( ( rule__OpPostfix__Alternatives ) ) )
+            // InternalDataDSL.g:1608:2: ( ( rule__OpPostfix__Alternatives ) )
             {
-            // InternalDataDSL.g:1458:2: ( ( rule__OpPostfix__Alternatives ) )
-            // InternalDataDSL.g:1459:3: ( rule__OpPostfix__Alternatives )
+            // InternalDataDSL.g:1608:2: ( ( rule__OpPostfix__Alternatives ) )
+            // InternalDataDSL.g:1609:3: ( rule__OpPostfix__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpPostfixAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1460:3: ( rule__OpPostfix__Alternatives )
-            // InternalDataDSL.g:1460:4: rule__OpPostfix__Alternatives
+            // InternalDataDSL.g:1610:3: ( rule__OpPostfix__Alternatives )
+            // InternalDataDSL.g:1610:4: rule__OpPostfix__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__OpPostfix__Alternatives();
@@ -4947,11 +5470,11 @@
 
 
     // $ANTLR start "entryRuleXMemberFeatureCall"
-    // InternalDataDSL.g:1469:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
+    // InternalDataDSL.g:1619:1: entryRuleXMemberFeatureCall : ruleXMemberFeatureCall EOF ;
     public final void entryRuleXMemberFeatureCall() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1470:1: ( ruleXMemberFeatureCall EOF )
-            // InternalDataDSL.g:1471:1: ruleXMemberFeatureCall EOF
+            // InternalDataDSL.g:1620:1: ( ruleXMemberFeatureCall EOF )
+            // InternalDataDSL.g:1621:1: ruleXMemberFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallRule()); 
@@ -4981,23 +5504,23 @@
 
 
     // $ANTLR start "ruleXMemberFeatureCall"
-    // InternalDataDSL.g:1478:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
+    // InternalDataDSL.g:1628:1: ruleXMemberFeatureCall : ( ( rule__XMemberFeatureCall__Group__0 ) ) ;
     public final void ruleXMemberFeatureCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1482:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
-            // InternalDataDSL.g:1483:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            // InternalDataDSL.g:1632:2: ( ( ( rule__XMemberFeatureCall__Group__0 ) ) )
+            // InternalDataDSL.g:1633:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
             {
-            // InternalDataDSL.g:1483:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
-            // InternalDataDSL.g:1484:3: ( rule__XMemberFeatureCall__Group__0 )
+            // InternalDataDSL.g:1633:2: ( ( rule__XMemberFeatureCall__Group__0 ) )
+            // InternalDataDSL.g:1634:3: ( rule__XMemberFeatureCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1485:3: ( rule__XMemberFeatureCall__Group__0 )
-            // InternalDataDSL.g:1485:4: rule__XMemberFeatureCall__Group__0
+            // InternalDataDSL.g:1635:3: ( rule__XMemberFeatureCall__Group__0 )
+            // InternalDataDSL.g:1635:4: rule__XMemberFeatureCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group__0();
@@ -5032,11 +5555,11 @@
 
 
     // $ANTLR start "entryRuleXPrimaryExpression"
-    // InternalDataDSL.g:1494:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
+    // InternalDataDSL.g:1644:1: entryRuleXPrimaryExpression : ruleXPrimaryExpression EOF ;
     public final void entryRuleXPrimaryExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1495:1: ( ruleXPrimaryExpression EOF )
-            // InternalDataDSL.g:1496:1: ruleXPrimaryExpression EOF
+            // InternalDataDSL.g:1645:1: ( ruleXPrimaryExpression EOF )
+            // InternalDataDSL.g:1646:1: ruleXPrimaryExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPrimaryExpressionRule()); 
@@ -5066,23 +5589,23 @@
 
 
     // $ANTLR start "ruleXPrimaryExpression"
-    // InternalDataDSL.g:1503:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
+    // InternalDataDSL.g:1653:1: ruleXPrimaryExpression : ( ( rule__XPrimaryExpression__Alternatives ) ) ;
     public final void ruleXPrimaryExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1507:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
-            // InternalDataDSL.g:1508:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            // InternalDataDSL.g:1657:2: ( ( ( rule__XPrimaryExpression__Alternatives ) ) )
+            // InternalDataDSL.g:1658:2: ( ( rule__XPrimaryExpression__Alternatives ) )
             {
-            // InternalDataDSL.g:1508:2: ( ( rule__XPrimaryExpression__Alternatives ) )
-            // InternalDataDSL.g:1509:3: ( rule__XPrimaryExpression__Alternatives )
+            // InternalDataDSL.g:1658:2: ( ( rule__XPrimaryExpression__Alternatives ) )
+            // InternalDataDSL.g:1659:3: ( rule__XPrimaryExpression__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPrimaryExpressionAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1510:3: ( rule__XPrimaryExpression__Alternatives )
-            // InternalDataDSL.g:1510:4: rule__XPrimaryExpression__Alternatives
+            // InternalDataDSL.g:1660:3: ( rule__XPrimaryExpression__Alternatives )
+            // InternalDataDSL.g:1660:4: rule__XPrimaryExpression__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XPrimaryExpression__Alternatives();
@@ -5117,11 +5640,11 @@
 
 
     // $ANTLR start "entryRuleXLiteral"
-    // InternalDataDSL.g:1519:1: entryRuleXLiteral : ruleXLiteral EOF ;
+    // InternalDataDSL.g:1669:1: entryRuleXLiteral : ruleXLiteral EOF ;
     public final void entryRuleXLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1520:1: ( ruleXLiteral EOF )
-            // InternalDataDSL.g:1521:1: ruleXLiteral EOF
+            // InternalDataDSL.g:1670:1: ( ruleXLiteral EOF )
+            // InternalDataDSL.g:1671:1: ruleXLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXLiteralRule()); 
@@ -5151,23 +5674,23 @@
 
 
     // $ANTLR start "ruleXLiteral"
-    // InternalDataDSL.g:1528:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
+    // InternalDataDSL.g:1678:1: ruleXLiteral : ( ( rule__XLiteral__Alternatives ) ) ;
     public final void ruleXLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1532:2: ( ( ( rule__XLiteral__Alternatives ) ) )
-            // InternalDataDSL.g:1533:2: ( ( rule__XLiteral__Alternatives ) )
+            // InternalDataDSL.g:1682:2: ( ( ( rule__XLiteral__Alternatives ) ) )
+            // InternalDataDSL.g:1683:2: ( ( rule__XLiteral__Alternatives ) )
             {
-            // InternalDataDSL.g:1533:2: ( ( rule__XLiteral__Alternatives ) )
-            // InternalDataDSL.g:1534:3: ( rule__XLiteral__Alternatives )
+            // InternalDataDSL.g:1683:2: ( ( rule__XLiteral__Alternatives ) )
+            // InternalDataDSL.g:1684:3: ( rule__XLiteral__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXLiteralAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1535:3: ( rule__XLiteral__Alternatives )
-            // InternalDataDSL.g:1535:4: rule__XLiteral__Alternatives
+            // InternalDataDSL.g:1685:3: ( rule__XLiteral__Alternatives )
+            // InternalDataDSL.g:1685:4: rule__XLiteral__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XLiteral__Alternatives();
@@ -5202,11 +5725,11 @@
 
 
     // $ANTLR start "entryRuleXCollectionLiteral"
-    // InternalDataDSL.g:1544:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
+    // InternalDataDSL.g:1694:1: entryRuleXCollectionLiteral : ruleXCollectionLiteral EOF ;
     public final void entryRuleXCollectionLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1545:1: ( ruleXCollectionLiteral EOF )
-            // InternalDataDSL.g:1546:1: ruleXCollectionLiteral EOF
+            // InternalDataDSL.g:1695:1: ( ruleXCollectionLiteral EOF )
+            // InternalDataDSL.g:1696:1: ruleXCollectionLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCollectionLiteralRule()); 
@@ -5236,23 +5759,23 @@
 
 
     // $ANTLR start "ruleXCollectionLiteral"
-    // InternalDataDSL.g:1553:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
+    // InternalDataDSL.g:1703:1: ruleXCollectionLiteral : ( ( rule__XCollectionLiteral__Alternatives ) ) ;
     public final void ruleXCollectionLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1557:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
-            // InternalDataDSL.g:1558:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            // InternalDataDSL.g:1707:2: ( ( ( rule__XCollectionLiteral__Alternatives ) ) )
+            // InternalDataDSL.g:1708:2: ( ( rule__XCollectionLiteral__Alternatives ) )
             {
-            // InternalDataDSL.g:1558:2: ( ( rule__XCollectionLiteral__Alternatives ) )
-            // InternalDataDSL.g:1559:3: ( rule__XCollectionLiteral__Alternatives )
+            // InternalDataDSL.g:1708:2: ( ( rule__XCollectionLiteral__Alternatives ) )
+            // InternalDataDSL.g:1709:3: ( rule__XCollectionLiteral__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCollectionLiteralAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1560:3: ( rule__XCollectionLiteral__Alternatives )
-            // InternalDataDSL.g:1560:4: rule__XCollectionLiteral__Alternatives
+            // InternalDataDSL.g:1710:3: ( rule__XCollectionLiteral__Alternatives )
+            // InternalDataDSL.g:1710:4: rule__XCollectionLiteral__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XCollectionLiteral__Alternatives();
@@ -5287,11 +5810,11 @@
 
 
     // $ANTLR start "entryRuleXSetLiteral"
-    // InternalDataDSL.g:1569:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
+    // InternalDataDSL.g:1719:1: entryRuleXSetLiteral : ruleXSetLiteral EOF ;
     public final void entryRuleXSetLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1570:1: ( ruleXSetLiteral EOF )
-            // InternalDataDSL.g:1571:1: ruleXSetLiteral EOF
+            // InternalDataDSL.g:1720:1: ( ruleXSetLiteral EOF )
+            // InternalDataDSL.g:1721:1: ruleXSetLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralRule()); 
@@ -5321,23 +5844,23 @@
 
 
     // $ANTLR start "ruleXSetLiteral"
-    // InternalDataDSL.g:1578:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:1728:1: ruleXSetLiteral : ( ( rule__XSetLiteral__Group__0 ) ) ;
     public final void ruleXSetLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1582:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:1583:2: ( ( rule__XSetLiteral__Group__0 ) )
+            // InternalDataDSL.g:1732:2: ( ( ( rule__XSetLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:1733:2: ( ( rule__XSetLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:1583:2: ( ( rule__XSetLiteral__Group__0 ) )
-            // InternalDataDSL.g:1584:3: ( rule__XSetLiteral__Group__0 )
+            // InternalDataDSL.g:1733:2: ( ( rule__XSetLiteral__Group__0 ) )
+            // InternalDataDSL.g:1734:3: ( rule__XSetLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1585:3: ( rule__XSetLiteral__Group__0 )
-            // InternalDataDSL.g:1585:4: rule__XSetLiteral__Group__0
+            // InternalDataDSL.g:1735:3: ( rule__XSetLiteral__Group__0 )
+            // InternalDataDSL.g:1735:4: rule__XSetLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group__0();
@@ -5372,11 +5895,11 @@
 
 
     // $ANTLR start "entryRuleXListLiteral"
-    // InternalDataDSL.g:1594:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
+    // InternalDataDSL.g:1744:1: entryRuleXListLiteral : ruleXListLiteral EOF ;
     public final void entryRuleXListLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1595:1: ( ruleXListLiteral EOF )
-            // InternalDataDSL.g:1596:1: ruleXListLiteral EOF
+            // InternalDataDSL.g:1745:1: ( ruleXListLiteral EOF )
+            // InternalDataDSL.g:1746:1: ruleXListLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralRule()); 
@@ -5406,23 +5929,23 @@
 
 
     // $ANTLR start "ruleXListLiteral"
-    // InternalDataDSL.g:1603:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:1753:1: ruleXListLiteral : ( ( rule__XListLiteral__Group__0 ) ) ;
     public final void ruleXListLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1607:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:1608:2: ( ( rule__XListLiteral__Group__0 ) )
+            // InternalDataDSL.g:1757:2: ( ( ( rule__XListLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:1758:2: ( ( rule__XListLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:1608:2: ( ( rule__XListLiteral__Group__0 ) )
-            // InternalDataDSL.g:1609:3: ( rule__XListLiteral__Group__0 )
+            // InternalDataDSL.g:1758:2: ( ( rule__XListLiteral__Group__0 ) )
+            // InternalDataDSL.g:1759:3: ( rule__XListLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1610:3: ( rule__XListLiteral__Group__0 )
-            // InternalDataDSL.g:1610:4: rule__XListLiteral__Group__0
+            // InternalDataDSL.g:1760:3: ( rule__XListLiteral__Group__0 )
+            // InternalDataDSL.g:1760:4: rule__XListLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group__0();
@@ -5457,11 +5980,11 @@
 
 
     // $ANTLR start "entryRuleXClosure"
-    // InternalDataDSL.g:1619:1: entryRuleXClosure : ruleXClosure EOF ;
+    // InternalDataDSL.g:1769:1: entryRuleXClosure : ruleXClosure EOF ;
     public final void entryRuleXClosure() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1620:1: ( ruleXClosure EOF )
-            // InternalDataDSL.g:1621:1: ruleXClosure EOF
+            // InternalDataDSL.g:1770:1: ( ruleXClosure EOF )
+            // InternalDataDSL.g:1771:1: ruleXClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureRule()); 
@@ -5491,23 +6014,23 @@
 
 
     // $ANTLR start "ruleXClosure"
-    // InternalDataDSL.g:1628:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
+    // InternalDataDSL.g:1778:1: ruleXClosure : ( ( rule__XClosure__Group__0 ) ) ;
     public final void ruleXClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1632:2: ( ( ( rule__XClosure__Group__0 ) ) )
-            // InternalDataDSL.g:1633:2: ( ( rule__XClosure__Group__0 ) )
+            // InternalDataDSL.g:1782:2: ( ( ( rule__XClosure__Group__0 ) ) )
+            // InternalDataDSL.g:1783:2: ( ( rule__XClosure__Group__0 ) )
             {
-            // InternalDataDSL.g:1633:2: ( ( rule__XClosure__Group__0 ) )
-            // InternalDataDSL.g:1634:3: ( rule__XClosure__Group__0 )
+            // InternalDataDSL.g:1783:2: ( ( rule__XClosure__Group__0 ) )
+            // InternalDataDSL.g:1784:3: ( rule__XClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1635:3: ( rule__XClosure__Group__0 )
-            // InternalDataDSL.g:1635:4: rule__XClosure__Group__0
+            // InternalDataDSL.g:1785:3: ( rule__XClosure__Group__0 )
+            // InternalDataDSL.g:1785:4: rule__XClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group__0();
@@ -5542,11 +6065,11 @@
 
 
     // $ANTLR start "entryRuleXExpressionInClosure"
-    // InternalDataDSL.g:1644:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
+    // InternalDataDSL.g:1794:1: entryRuleXExpressionInClosure : ruleXExpressionInClosure EOF ;
     public final void entryRuleXExpressionInClosure() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1645:1: ( ruleXExpressionInClosure EOF )
-            // InternalDataDSL.g:1646:1: ruleXExpressionInClosure EOF
+            // InternalDataDSL.g:1795:1: ( ruleXExpressionInClosure EOF )
+            // InternalDataDSL.g:1796:1: ruleXExpressionInClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureRule()); 
@@ -5576,23 +6099,23 @@
 
 
     // $ANTLR start "ruleXExpressionInClosure"
-    // InternalDataDSL.g:1653:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
+    // InternalDataDSL.g:1803:1: ruleXExpressionInClosure : ( ( rule__XExpressionInClosure__Group__0 ) ) ;
     public final void ruleXExpressionInClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1657:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
-            // InternalDataDSL.g:1658:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            // InternalDataDSL.g:1807:2: ( ( ( rule__XExpressionInClosure__Group__0 ) ) )
+            // InternalDataDSL.g:1808:2: ( ( rule__XExpressionInClosure__Group__0 ) )
             {
-            // InternalDataDSL.g:1658:2: ( ( rule__XExpressionInClosure__Group__0 ) )
-            // InternalDataDSL.g:1659:3: ( rule__XExpressionInClosure__Group__0 )
+            // InternalDataDSL.g:1808:2: ( ( rule__XExpressionInClosure__Group__0 ) )
+            // InternalDataDSL.g:1809:3: ( rule__XExpressionInClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1660:3: ( rule__XExpressionInClosure__Group__0 )
-            // InternalDataDSL.g:1660:4: rule__XExpressionInClosure__Group__0
+            // InternalDataDSL.g:1810:3: ( rule__XExpressionInClosure__Group__0 )
+            // InternalDataDSL.g:1810:4: rule__XExpressionInClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group__0();
@@ -5627,11 +6150,11 @@
 
 
     // $ANTLR start "entryRuleXShortClosure"
-    // InternalDataDSL.g:1669:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
+    // InternalDataDSL.g:1819:1: entryRuleXShortClosure : ruleXShortClosure EOF ;
     public final void entryRuleXShortClosure() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1670:1: ( ruleXShortClosure EOF )
-            // InternalDataDSL.g:1671:1: ruleXShortClosure EOF
+            // InternalDataDSL.g:1820:1: ( ruleXShortClosure EOF )
+            // InternalDataDSL.g:1821:1: ruleXShortClosure EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureRule()); 
@@ -5661,23 +6184,23 @@
 
 
     // $ANTLR start "ruleXShortClosure"
-    // InternalDataDSL.g:1678:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
+    // InternalDataDSL.g:1828:1: ruleXShortClosure : ( ( rule__XShortClosure__Group__0 ) ) ;
     public final void ruleXShortClosure() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1682:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
-            // InternalDataDSL.g:1683:2: ( ( rule__XShortClosure__Group__0 ) )
+            // InternalDataDSL.g:1832:2: ( ( ( rule__XShortClosure__Group__0 ) ) )
+            // InternalDataDSL.g:1833:2: ( ( rule__XShortClosure__Group__0 ) )
             {
-            // InternalDataDSL.g:1683:2: ( ( rule__XShortClosure__Group__0 ) )
-            // InternalDataDSL.g:1684:3: ( rule__XShortClosure__Group__0 )
+            // InternalDataDSL.g:1833:2: ( ( rule__XShortClosure__Group__0 ) )
+            // InternalDataDSL.g:1834:3: ( rule__XShortClosure__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1685:3: ( rule__XShortClosure__Group__0 )
-            // InternalDataDSL.g:1685:4: rule__XShortClosure__Group__0
+            // InternalDataDSL.g:1835:3: ( rule__XShortClosure__Group__0 )
+            // InternalDataDSL.g:1835:4: rule__XShortClosure__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group__0();
@@ -5712,11 +6235,11 @@
 
 
     // $ANTLR start "entryRuleXParenthesizedExpression"
-    // InternalDataDSL.g:1694:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
+    // InternalDataDSL.g:1844:1: entryRuleXParenthesizedExpression : ruleXParenthesizedExpression EOF ;
     public final void entryRuleXParenthesizedExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1695:1: ( ruleXParenthesizedExpression EOF )
-            // InternalDataDSL.g:1696:1: ruleXParenthesizedExpression EOF
+            // InternalDataDSL.g:1845:1: ( ruleXParenthesizedExpression EOF )
+            // InternalDataDSL.g:1846:1: ruleXParenthesizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionRule()); 
@@ -5746,23 +6269,23 @@
 
 
     // $ANTLR start "ruleXParenthesizedExpression"
-    // InternalDataDSL.g:1703:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1853:1: ruleXParenthesizedExpression : ( ( rule__XParenthesizedExpression__Group__0 ) ) ;
     public final void ruleXParenthesizedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1707:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1708:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            // InternalDataDSL.g:1857:2: ( ( ( rule__XParenthesizedExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1858:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1708:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
-            // InternalDataDSL.g:1709:3: ( rule__XParenthesizedExpression__Group__0 )
+            // InternalDataDSL.g:1858:2: ( ( rule__XParenthesizedExpression__Group__0 ) )
+            // InternalDataDSL.g:1859:3: ( rule__XParenthesizedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1710:3: ( rule__XParenthesizedExpression__Group__0 )
-            // InternalDataDSL.g:1710:4: rule__XParenthesizedExpression__Group__0
+            // InternalDataDSL.g:1860:3: ( rule__XParenthesizedExpression__Group__0 )
+            // InternalDataDSL.g:1860:4: rule__XParenthesizedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XParenthesizedExpression__Group__0();
@@ -5797,11 +6320,11 @@
 
 
     // $ANTLR start "entryRuleXIfExpression"
-    // InternalDataDSL.g:1719:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
+    // InternalDataDSL.g:1869:1: entryRuleXIfExpression : ruleXIfExpression EOF ;
     public final void entryRuleXIfExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1720:1: ( ruleXIfExpression EOF )
-            // InternalDataDSL.g:1721:1: ruleXIfExpression EOF
+            // InternalDataDSL.g:1870:1: ( ruleXIfExpression EOF )
+            // InternalDataDSL.g:1871:1: ruleXIfExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionRule()); 
@@ -5831,23 +6354,23 @@
 
 
     // $ANTLR start "ruleXIfExpression"
-    // InternalDataDSL.g:1728:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1878:1: ruleXIfExpression : ( ( rule__XIfExpression__Group__0 ) ) ;
     public final void ruleXIfExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1732:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1733:2: ( ( rule__XIfExpression__Group__0 ) )
+            // InternalDataDSL.g:1882:2: ( ( ( rule__XIfExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1883:2: ( ( rule__XIfExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1733:2: ( ( rule__XIfExpression__Group__0 ) )
-            // InternalDataDSL.g:1734:3: ( rule__XIfExpression__Group__0 )
+            // InternalDataDSL.g:1883:2: ( ( rule__XIfExpression__Group__0 ) )
+            // InternalDataDSL.g:1884:3: ( rule__XIfExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1735:3: ( rule__XIfExpression__Group__0 )
-            // InternalDataDSL.g:1735:4: rule__XIfExpression__Group__0
+            // InternalDataDSL.g:1885:3: ( rule__XIfExpression__Group__0 )
+            // InternalDataDSL.g:1885:4: rule__XIfExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group__0();
@@ -5882,11 +6405,11 @@
 
 
     // $ANTLR start "entryRuleXSwitchExpression"
-    // InternalDataDSL.g:1744:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
+    // InternalDataDSL.g:1894:1: entryRuleXSwitchExpression : ruleXSwitchExpression EOF ;
     public final void entryRuleXSwitchExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1745:1: ( ruleXSwitchExpression EOF )
-            // InternalDataDSL.g:1746:1: ruleXSwitchExpression EOF
+            // InternalDataDSL.g:1895:1: ( ruleXSwitchExpression EOF )
+            // InternalDataDSL.g:1896:1: ruleXSwitchExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionRule()); 
@@ -5916,23 +6439,23 @@
 
 
     // $ANTLR start "ruleXSwitchExpression"
-    // InternalDataDSL.g:1753:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1903:1: ruleXSwitchExpression : ( ( rule__XSwitchExpression__Group__0 ) ) ;
     public final void ruleXSwitchExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1757:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1758:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            // InternalDataDSL.g:1907:2: ( ( ( rule__XSwitchExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1908:2: ( ( rule__XSwitchExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1758:2: ( ( rule__XSwitchExpression__Group__0 ) )
-            // InternalDataDSL.g:1759:3: ( rule__XSwitchExpression__Group__0 )
+            // InternalDataDSL.g:1908:2: ( ( rule__XSwitchExpression__Group__0 ) )
+            // InternalDataDSL.g:1909:3: ( rule__XSwitchExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1760:3: ( rule__XSwitchExpression__Group__0 )
-            // InternalDataDSL.g:1760:4: rule__XSwitchExpression__Group__0
+            // InternalDataDSL.g:1910:3: ( rule__XSwitchExpression__Group__0 )
+            // InternalDataDSL.g:1910:4: rule__XSwitchExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group__0();
@@ -5967,11 +6490,11 @@
 
 
     // $ANTLR start "entryRuleXCasePart"
-    // InternalDataDSL.g:1769:1: entryRuleXCasePart : ruleXCasePart EOF ;
+    // InternalDataDSL.g:1919:1: entryRuleXCasePart : ruleXCasePart EOF ;
     public final void entryRuleXCasePart() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1770:1: ( ruleXCasePart EOF )
-            // InternalDataDSL.g:1771:1: ruleXCasePart EOF
+            // InternalDataDSL.g:1920:1: ( ruleXCasePart EOF )
+            // InternalDataDSL.g:1921:1: ruleXCasePart EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartRule()); 
@@ -6001,23 +6524,23 @@
 
 
     // $ANTLR start "ruleXCasePart"
-    // InternalDataDSL.g:1778:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
+    // InternalDataDSL.g:1928:1: ruleXCasePart : ( ( rule__XCasePart__Group__0 ) ) ;
     public final void ruleXCasePart() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1782:2: ( ( ( rule__XCasePart__Group__0 ) ) )
-            // InternalDataDSL.g:1783:2: ( ( rule__XCasePart__Group__0 ) )
+            // InternalDataDSL.g:1932:2: ( ( ( rule__XCasePart__Group__0 ) ) )
+            // InternalDataDSL.g:1933:2: ( ( rule__XCasePart__Group__0 ) )
             {
-            // InternalDataDSL.g:1783:2: ( ( rule__XCasePart__Group__0 ) )
-            // InternalDataDSL.g:1784:3: ( rule__XCasePart__Group__0 )
+            // InternalDataDSL.g:1933:2: ( ( rule__XCasePart__Group__0 ) )
+            // InternalDataDSL.g:1934:3: ( rule__XCasePart__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1785:3: ( rule__XCasePart__Group__0 )
-            // InternalDataDSL.g:1785:4: rule__XCasePart__Group__0
+            // InternalDataDSL.g:1935:3: ( rule__XCasePart__Group__0 )
+            // InternalDataDSL.g:1935:4: rule__XCasePart__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group__0();
@@ -6052,11 +6575,11 @@
 
 
     // $ANTLR start "entryRuleXForLoopExpression"
-    // InternalDataDSL.g:1794:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
+    // InternalDataDSL.g:1944:1: entryRuleXForLoopExpression : ruleXForLoopExpression EOF ;
     public final void entryRuleXForLoopExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1795:1: ( ruleXForLoopExpression EOF )
-            // InternalDataDSL.g:1796:1: ruleXForLoopExpression EOF
+            // InternalDataDSL.g:1945:1: ( ruleXForLoopExpression EOF )
+            // InternalDataDSL.g:1946:1: ruleXForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionRule()); 
@@ -6086,23 +6609,23 @@
 
 
     // $ANTLR start "ruleXForLoopExpression"
-    // InternalDataDSL.g:1803:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1953:1: ruleXForLoopExpression : ( ( rule__XForLoopExpression__Group__0 ) ) ;
     public final void ruleXForLoopExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1807:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1808:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            // InternalDataDSL.g:1957:2: ( ( ( rule__XForLoopExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1958:2: ( ( rule__XForLoopExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1808:2: ( ( rule__XForLoopExpression__Group__0 ) )
-            // InternalDataDSL.g:1809:3: ( rule__XForLoopExpression__Group__0 )
+            // InternalDataDSL.g:1958:2: ( ( rule__XForLoopExpression__Group__0 ) )
+            // InternalDataDSL.g:1959:3: ( rule__XForLoopExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1810:3: ( rule__XForLoopExpression__Group__0 )
-            // InternalDataDSL.g:1810:4: rule__XForLoopExpression__Group__0
+            // InternalDataDSL.g:1960:3: ( rule__XForLoopExpression__Group__0 )
+            // InternalDataDSL.g:1960:4: rule__XForLoopExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group__0();
@@ -6137,11 +6660,11 @@
 
 
     // $ANTLR start "entryRuleXBasicForLoopExpression"
-    // InternalDataDSL.g:1819:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
+    // InternalDataDSL.g:1969:1: entryRuleXBasicForLoopExpression : ruleXBasicForLoopExpression EOF ;
     public final void entryRuleXBasicForLoopExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1820:1: ( ruleXBasicForLoopExpression EOF )
-            // InternalDataDSL.g:1821:1: ruleXBasicForLoopExpression EOF
+            // InternalDataDSL.g:1970:1: ( ruleXBasicForLoopExpression EOF )
+            // InternalDataDSL.g:1971:1: ruleXBasicForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionRule()); 
@@ -6171,23 +6694,23 @@
 
 
     // $ANTLR start "ruleXBasicForLoopExpression"
-    // InternalDataDSL.g:1828:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:1978:1: ruleXBasicForLoopExpression : ( ( rule__XBasicForLoopExpression__Group__0 ) ) ;
     public final void ruleXBasicForLoopExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1832:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1833:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            // InternalDataDSL.g:1982:2: ( ( ( rule__XBasicForLoopExpression__Group__0 ) ) )
+            // InternalDataDSL.g:1983:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1833:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
-            // InternalDataDSL.g:1834:3: ( rule__XBasicForLoopExpression__Group__0 )
+            // InternalDataDSL.g:1983:2: ( ( rule__XBasicForLoopExpression__Group__0 ) )
+            // InternalDataDSL.g:1984:3: ( rule__XBasicForLoopExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1835:3: ( rule__XBasicForLoopExpression__Group__0 )
-            // InternalDataDSL.g:1835:4: rule__XBasicForLoopExpression__Group__0
+            // InternalDataDSL.g:1985:3: ( rule__XBasicForLoopExpression__Group__0 )
+            // InternalDataDSL.g:1985:4: rule__XBasicForLoopExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group__0();
@@ -6222,11 +6745,11 @@
 
 
     // $ANTLR start "entryRuleXWhileExpression"
-    // InternalDataDSL.g:1844:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
+    // InternalDataDSL.g:1994:1: entryRuleXWhileExpression : ruleXWhileExpression EOF ;
     public final void entryRuleXWhileExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1845:1: ( ruleXWhileExpression EOF )
-            // InternalDataDSL.g:1846:1: ruleXWhileExpression EOF
+            // InternalDataDSL.g:1995:1: ( ruleXWhileExpression EOF )
+            // InternalDataDSL.g:1996:1: ruleXWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionRule()); 
@@ -6256,23 +6779,23 @@
 
 
     // $ANTLR start "ruleXWhileExpression"
-    // InternalDataDSL.g:1853:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2003:1: ruleXWhileExpression : ( ( rule__XWhileExpression__Group__0 ) ) ;
     public final void ruleXWhileExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1857:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1858:2: ( ( rule__XWhileExpression__Group__0 ) )
+            // InternalDataDSL.g:2007:2: ( ( ( rule__XWhileExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2008:2: ( ( rule__XWhileExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1858:2: ( ( rule__XWhileExpression__Group__0 ) )
-            // InternalDataDSL.g:1859:3: ( rule__XWhileExpression__Group__0 )
+            // InternalDataDSL.g:2008:2: ( ( rule__XWhileExpression__Group__0 ) )
+            // InternalDataDSL.g:2009:3: ( rule__XWhileExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1860:3: ( rule__XWhileExpression__Group__0 )
-            // InternalDataDSL.g:1860:4: rule__XWhileExpression__Group__0
+            // InternalDataDSL.g:2010:3: ( rule__XWhileExpression__Group__0 )
+            // InternalDataDSL.g:2010:4: rule__XWhileExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__Group__0();
@@ -6307,11 +6830,11 @@
 
 
     // $ANTLR start "entryRuleXDoWhileExpression"
-    // InternalDataDSL.g:1869:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
+    // InternalDataDSL.g:2019:1: entryRuleXDoWhileExpression : ruleXDoWhileExpression EOF ;
     public final void entryRuleXDoWhileExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1870:1: ( ruleXDoWhileExpression EOF )
-            // InternalDataDSL.g:1871:1: ruleXDoWhileExpression EOF
+            // InternalDataDSL.g:2020:1: ( ruleXDoWhileExpression EOF )
+            // InternalDataDSL.g:2021:1: ruleXDoWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionRule()); 
@@ -6341,23 +6864,23 @@
 
 
     // $ANTLR start "ruleXDoWhileExpression"
-    // InternalDataDSL.g:1878:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2028:1: ruleXDoWhileExpression : ( ( rule__XDoWhileExpression__Group__0 ) ) ;
     public final void ruleXDoWhileExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1882:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1883:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            // InternalDataDSL.g:2032:2: ( ( ( rule__XDoWhileExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2033:2: ( ( rule__XDoWhileExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1883:2: ( ( rule__XDoWhileExpression__Group__0 ) )
-            // InternalDataDSL.g:1884:3: ( rule__XDoWhileExpression__Group__0 )
+            // InternalDataDSL.g:2033:2: ( ( rule__XDoWhileExpression__Group__0 ) )
+            // InternalDataDSL.g:2034:3: ( rule__XDoWhileExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1885:3: ( rule__XDoWhileExpression__Group__0 )
-            // InternalDataDSL.g:1885:4: rule__XDoWhileExpression__Group__0
+            // InternalDataDSL.g:2035:3: ( rule__XDoWhileExpression__Group__0 )
+            // InternalDataDSL.g:2035:4: rule__XDoWhileExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__Group__0();
@@ -6392,11 +6915,11 @@
 
 
     // $ANTLR start "entryRuleXBlockExpression"
-    // InternalDataDSL.g:1894:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
+    // InternalDataDSL.g:2044:1: entryRuleXBlockExpression : ruleXBlockExpression EOF ;
     public final void entryRuleXBlockExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1895:1: ( ruleXBlockExpression EOF )
-            // InternalDataDSL.g:1896:1: ruleXBlockExpression EOF
+            // InternalDataDSL.g:2045:1: ( ruleXBlockExpression EOF )
+            // InternalDataDSL.g:2046:1: ruleXBlockExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionRule()); 
@@ -6426,23 +6949,23 @@
 
 
     // $ANTLR start "ruleXBlockExpression"
-    // InternalDataDSL.g:1903:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2053:1: ruleXBlockExpression : ( ( rule__XBlockExpression__Group__0 ) ) ;
     public final void ruleXBlockExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1907:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
-            // InternalDataDSL.g:1908:2: ( ( rule__XBlockExpression__Group__0 ) )
+            // InternalDataDSL.g:2057:2: ( ( ( rule__XBlockExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2058:2: ( ( rule__XBlockExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:1908:2: ( ( rule__XBlockExpression__Group__0 ) )
-            // InternalDataDSL.g:1909:3: ( rule__XBlockExpression__Group__0 )
+            // InternalDataDSL.g:2058:2: ( ( rule__XBlockExpression__Group__0 ) )
+            // InternalDataDSL.g:2059:3: ( rule__XBlockExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1910:3: ( rule__XBlockExpression__Group__0 )
-            // InternalDataDSL.g:1910:4: rule__XBlockExpression__Group__0
+            // InternalDataDSL.g:2060:3: ( rule__XBlockExpression__Group__0 )
+            // InternalDataDSL.g:2060:4: rule__XBlockExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group__0();
@@ -6477,11 +7000,11 @@
 
 
     // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
-    // InternalDataDSL.g:1919:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
+    // InternalDataDSL.g:2069:1: entryRuleXExpressionOrVarDeclaration : ruleXExpressionOrVarDeclaration EOF ;
     public final void entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1920:1: ( ruleXExpressionOrVarDeclaration EOF )
-            // InternalDataDSL.g:1921:1: ruleXExpressionOrVarDeclaration EOF
+            // InternalDataDSL.g:2070:1: ( ruleXExpressionOrVarDeclaration EOF )
+            // InternalDataDSL.g:2071:1: ruleXExpressionOrVarDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionOrVarDeclarationRule()); 
@@ -6511,23 +7034,23 @@
 
 
     // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // InternalDataDSL.g:1928:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
+    // InternalDataDSL.g:2078:1: ruleXExpressionOrVarDeclaration : ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) ;
     public final void ruleXExpressionOrVarDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1932:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
-            // InternalDataDSL.g:1933:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            // InternalDataDSL.g:2082:2: ( ( ( rule__XExpressionOrVarDeclaration__Alternatives ) ) )
+            // InternalDataDSL.g:2083:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
             {
-            // InternalDataDSL.g:1933:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
-            // InternalDataDSL.g:1934:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            // InternalDataDSL.g:2083:2: ( ( rule__XExpressionOrVarDeclaration__Alternatives ) )
+            // InternalDataDSL.g:2084:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionOrVarDeclarationAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:1935:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
-            // InternalDataDSL.g:1935:4: rule__XExpressionOrVarDeclaration__Alternatives
+            // InternalDataDSL.g:2085:3: ( rule__XExpressionOrVarDeclaration__Alternatives )
+            // InternalDataDSL.g:2085:4: rule__XExpressionOrVarDeclaration__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionOrVarDeclaration__Alternatives();
@@ -6562,11 +7085,11 @@
 
 
     // $ANTLR start "entryRuleXVariableDeclaration"
-    // InternalDataDSL.g:1944:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
+    // InternalDataDSL.g:2094:1: entryRuleXVariableDeclaration : ruleXVariableDeclaration EOF ;
     public final void entryRuleXVariableDeclaration() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1945:1: ( ruleXVariableDeclaration EOF )
-            // InternalDataDSL.g:1946:1: ruleXVariableDeclaration EOF
+            // InternalDataDSL.g:2095:1: ( ruleXVariableDeclaration EOF )
+            // InternalDataDSL.g:2096:1: ruleXVariableDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationRule()); 
@@ -6596,23 +7119,23 @@
 
 
     // $ANTLR start "ruleXVariableDeclaration"
-    // InternalDataDSL.g:1953:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
+    // InternalDataDSL.g:2103:1: ruleXVariableDeclaration : ( ( rule__XVariableDeclaration__Group__0 ) ) ;
     public final void ruleXVariableDeclaration() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1957:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
-            // InternalDataDSL.g:1958:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            // InternalDataDSL.g:2107:2: ( ( ( rule__XVariableDeclaration__Group__0 ) ) )
+            // InternalDataDSL.g:2108:2: ( ( rule__XVariableDeclaration__Group__0 ) )
             {
-            // InternalDataDSL.g:1958:2: ( ( rule__XVariableDeclaration__Group__0 ) )
-            // InternalDataDSL.g:1959:3: ( rule__XVariableDeclaration__Group__0 )
+            // InternalDataDSL.g:2108:2: ( ( rule__XVariableDeclaration__Group__0 ) )
+            // InternalDataDSL.g:2109:3: ( rule__XVariableDeclaration__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1960:3: ( rule__XVariableDeclaration__Group__0 )
-            // InternalDataDSL.g:1960:4: rule__XVariableDeclaration__Group__0
+            // InternalDataDSL.g:2110:3: ( rule__XVariableDeclaration__Group__0 )
+            // InternalDataDSL.g:2110:4: rule__XVariableDeclaration__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group__0();
@@ -6647,11 +7170,11 @@
 
 
     // $ANTLR start "entryRuleJvmFormalParameter"
-    // InternalDataDSL.g:1969:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
+    // InternalDataDSL.g:2119:1: entryRuleJvmFormalParameter : ruleJvmFormalParameter EOF ;
     public final void entryRuleJvmFormalParameter() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1970:1: ( ruleJvmFormalParameter EOF )
-            // InternalDataDSL.g:1971:1: ruleJvmFormalParameter EOF
+            // InternalDataDSL.g:2120:1: ( ruleJvmFormalParameter EOF )
+            // InternalDataDSL.g:2121:1: ruleJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterRule()); 
@@ -6681,23 +7204,23 @@
 
 
     // $ANTLR start "ruleJvmFormalParameter"
-    // InternalDataDSL.g:1978:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
+    // InternalDataDSL.g:2128:1: ruleJvmFormalParameter : ( ( rule__JvmFormalParameter__Group__0 ) ) ;
     public final void ruleJvmFormalParameter() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:1982:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
-            // InternalDataDSL.g:1983:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            // InternalDataDSL.g:2132:2: ( ( ( rule__JvmFormalParameter__Group__0 ) ) )
+            // InternalDataDSL.g:2133:2: ( ( rule__JvmFormalParameter__Group__0 ) )
             {
-            // InternalDataDSL.g:1983:2: ( ( rule__JvmFormalParameter__Group__0 ) )
-            // InternalDataDSL.g:1984:3: ( rule__JvmFormalParameter__Group__0 )
+            // InternalDataDSL.g:2133:2: ( ( rule__JvmFormalParameter__Group__0 ) )
+            // InternalDataDSL.g:2134:3: ( rule__JvmFormalParameter__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getGroup()); 
             }
-            // InternalDataDSL.g:1985:3: ( rule__JvmFormalParameter__Group__0 )
-            // InternalDataDSL.g:1985:4: rule__JvmFormalParameter__Group__0
+            // InternalDataDSL.g:2135:3: ( rule__JvmFormalParameter__Group__0 )
+            // InternalDataDSL.g:2135:4: rule__JvmFormalParameter__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__Group__0();
@@ -6732,11 +7255,11 @@
 
 
     // $ANTLR start "entryRuleFullJvmFormalParameter"
-    // InternalDataDSL.g:1994:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
+    // InternalDataDSL.g:2144:1: entryRuleFullJvmFormalParameter : ruleFullJvmFormalParameter EOF ;
     public final void entryRuleFullJvmFormalParameter() throws RecognitionException {
         try {
-            // InternalDataDSL.g:1995:1: ( ruleFullJvmFormalParameter EOF )
-            // InternalDataDSL.g:1996:1: ruleFullJvmFormalParameter EOF
+            // InternalDataDSL.g:2145:1: ( ruleFullJvmFormalParameter EOF )
+            // InternalDataDSL.g:2146:1: ruleFullJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterRule()); 
@@ -6766,23 +7289,23 @@
 
 
     // $ANTLR start "ruleFullJvmFormalParameter"
-    // InternalDataDSL.g:2003:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
+    // InternalDataDSL.g:2153:1: ruleFullJvmFormalParameter : ( ( rule__FullJvmFormalParameter__Group__0 ) ) ;
     public final void ruleFullJvmFormalParameter() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2007:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
-            // InternalDataDSL.g:2008:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            // InternalDataDSL.g:2157:2: ( ( ( rule__FullJvmFormalParameter__Group__0 ) ) )
+            // InternalDataDSL.g:2158:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
             {
-            // InternalDataDSL.g:2008:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
-            // InternalDataDSL.g:2009:3: ( rule__FullJvmFormalParameter__Group__0 )
+            // InternalDataDSL.g:2158:2: ( ( rule__FullJvmFormalParameter__Group__0 ) )
+            // InternalDataDSL.g:2159:3: ( rule__FullJvmFormalParameter__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2010:3: ( rule__FullJvmFormalParameter__Group__0 )
-            // InternalDataDSL.g:2010:4: rule__FullJvmFormalParameter__Group__0
+            // InternalDataDSL.g:2160:3: ( rule__FullJvmFormalParameter__Group__0 )
+            // InternalDataDSL.g:2160:4: rule__FullJvmFormalParameter__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__Group__0();
@@ -6817,11 +7340,11 @@
 
 
     // $ANTLR start "entryRuleXFeatureCall"
-    // InternalDataDSL.g:2019:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
+    // InternalDataDSL.g:2169:1: entryRuleXFeatureCall : ruleXFeatureCall EOF ;
     public final void entryRuleXFeatureCall() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2020:1: ( ruleXFeatureCall EOF )
-            // InternalDataDSL.g:2021:1: ruleXFeatureCall EOF
+            // InternalDataDSL.g:2170:1: ( ruleXFeatureCall EOF )
+            // InternalDataDSL.g:2171:1: ruleXFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallRule()); 
@@ -6851,23 +7374,23 @@
 
 
     // $ANTLR start "ruleXFeatureCall"
-    // InternalDataDSL.g:2028:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
+    // InternalDataDSL.g:2178:1: ruleXFeatureCall : ( ( rule__XFeatureCall__Group__0 ) ) ;
     public final void ruleXFeatureCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2032:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
-            // InternalDataDSL.g:2033:2: ( ( rule__XFeatureCall__Group__0 ) )
+            // InternalDataDSL.g:2182:2: ( ( ( rule__XFeatureCall__Group__0 ) ) )
+            // InternalDataDSL.g:2183:2: ( ( rule__XFeatureCall__Group__0 ) )
             {
-            // InternalDataDSL.g:2033:2: ( ( rule__XFeatureCall__Group__0 ) )
-            // InternalDataDSL.g:2034:3: ( rule__XFeatureCall__Group__0 )
+            // InternalDataDSL.g:2183:2: ( ( rule__XFeatureCall__Group__0 ) )
+            // InternalDataDSL.g:2184:3: ( rule__XFeatureCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2035:3: ( rule__XFeatureCall__Group__0 )
-            // InternalDataDSL.g:2035:4: rule__XFeatureCall__Group__0
+            // InternalDataDSL.g:2185:3: ( rule__XFeatureCall__Group__0 )
+            // InternalDataDSL.g:2185:4: rule__XFeatureCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group__0();
@@ -6902,11 +7425,11 @@
 
 
     // $ANTLR start "entryRuleFeatureCallID"
-    // InternalDataDSL.g:2044:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
+    // InternalDataDSL.g:2194:1: entryRuleFeatureCallID : ruleFeatureCallID EOF ;
     public final void entryRuleFeatureCallID() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2045:1: ( ruleFeatureCallID EOF )
-            // InternalDataDSL.g:2046:1: ruleFeatureCallID EOF
+            // InternalDataDSL.g:2195:1: ( ruleFeatureCallID EOF )
+            // InternalDataDSL.g:2196:1: ruleFeatureCallID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFeatureCallIDRule()); 
@@ -6936,23 +7459,23 @@
 
 
     // $ANTLR start "ruleFeatureCallID"
-    // InternalDataDSL.g:2053:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
+    // InternalDataDSL.g:2203:1: ruleFeatureCallID : ( ( rule__FeatureCallID__Alternatives ) ) ;
     public final void ruleFeatureCallID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2057:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
-            // InternalDataDSL.g:2058:2: ( ( rule__FeatureCallID__Alternatives ) )
+            // InternalDataDSL.g:2207:2: ( ( ( rule__FeatureCallID__Alternatives ) ) )
+            // InternalDataDSL.g:2208:2: ( ( rule__FeatureCallID__Alternatives ) )
             {
-            // InternalDataDSL.g:2058:2: ( ( rule__FeatureCallID__Alternatives ) )
-            // InternalDataDSL.g:2059:3: ( rule__FeatureCallID__Alternatives )
+            // InternalDataDSL.g:2208:2: ( ( rule__FeatureCallID__Alternatives ) )
+            // InternalDataDSL.g:2209:3: ( rule__FeatureCallID__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFeatureCallIDAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2060:3: ( rule__FeatureCallID__Alternatives )
-            // InternalDataDSL.g:2060:4: rule__FeatureCallID__Alternatives
+            // InternalDataDSL.g:2210:3: ( rule__FeatureCallID__Alternatives )
+            // InternalDataDSL.g:2210:4: rule__FeatureCallID__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__FeatureCallID__Alternatives();
@@ -6987,11 +7510,11 @@
 
 
     // $ANTLR start "entryRuleIdOrSuper"
-    // InternalDataDSL.g:2069:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
+    // InternalDataDSL.g:2219:1: entryRuleIdOrSuper : ruleIdOrSuper EOF ;
     public final void entryRuleIdOrSuper() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2070:1: ( ruleIdOrSuper EOF )
-            // InternalDataDSL.g:2071:1: ruleIdOrSuper EOF
+            // InternalDataDSL.g:2220:1: ( ruleIdOrSuper EOF )
+            // InternalDataDSL.g:2221:1: ruleIdOrSuper EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdOrSuperRule()); 
@@ -7021,23 +7544,23 @@
 
 
     // $ANTLR start "ruleIdOrSuper"
-    // InternalDataDSL.g:2078:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
+    // InternalDataDSL.g:2228:1: ruleIdOrSuper : ( ( rule__IdOrSuper__Alternatives ) ) ;
     public final void ruleIdOrSuper() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2082:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
-            // InternalDataDSL.g:2083:2: ( ( rule__IdOrSuper__Alternatives ) )
+            // InternalDataDSL.g:2232:2: ( ( ( rule__IdOrSuper__Alternatives ) ) )
+            // InternalDataDSL.g:2233:2: ( ( rule__IdOrSuper__Alternatives ) )
             {
-            // InternalDataDSL.g:2083:2: ( ( rule__IdOrSuper__Alternatives ) )
-            // InternalDataDSL.g:2084:3: ( rule__IdOrSuper__Alternatives )
+            // InternalDataDSL.g:2233:2: ( ( rule__IdOrSuper__Alternatives ) )
+            // InternalDataDSL.g:2234:3: ( rule__IdOrSuper__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getIdOrSuperAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2085:3: ( rule__IdOrSuper__Alternatives )
-            // InternalDataDSL.g:2085:4: rule__IdOrSuper__Alternatives
+            // InternalDataDSL.g:2235:3: ( rule__IdOrSuper__Alternatives )
+            // InternalDataDSL.g:2235:4: rule__IdOrSuper__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__IdOrSuper__Alternatives();
@@ -7072,11 +7595,11 @@
 
 
     // $ANTLR start "entryRuleXConstructorCall"
-    // InternalDataDSL.g:2094:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
+    // InternalDataDSL.g:2244:1: entryRuleXConstructorCall : ruleXConstructorCall EOF ;
     public final void entryRuleXConstructorCall() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2095:1: ( ruleXConstructorCall EOF )
-            // InternalDataDSL.g:2096:1: ruleXConstructorCall EOF
+            // InternalDataDSL.g:2245:1: ( ruleXConstructorCall EOF )
+            // InternalDataDSL.g:2246:1: ruleXConstructorCall EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallRule()); 
@@ -7106,23 +7629,23 @@
 
 
     // $ANTLR start "ruleXConstructorCall"
-    // InternalDataDSL.g:2103:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
+    // InternalDataDSL.g:2253:1: ruleXConstructorCall : ( ( rule__XConstructorCall__Group__0 ) ) ;
     public final void ruleXConstructorCall() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2107:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
-            // InternalDataDSL.g:2108:2: ( ( rule__XConstructorCall__Group__0 ) )
+            // InternalDataDSL.g:2257:2: ( ( ( rule__XConstructorCall__Group__0 ) ) )
+            // InternalDataDSL.g:2258:2: ( ( rule__XConstructorCall__Group__0 ) )
             {
-            // InternalDataDSL.g:2108:2: ( ( rule__XConstructorCall__Group__0 ) )
-            // InternalDataDSL.g:2109:3: ( rule__XConstructorCall__Group__0 )
+            // InternalDataDSL.g:2258:2: ( ( rule__XConstructorCall__Group__0 ) )
+            // InternalDataDSL.g:2259:3: ( rule__XConstructorCall__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2110:3: ( rule__XConstructorCall__Group__0 )
-            // InternalDataDSL.g:2110:4: rule__XConstructorCall__Group__0
+            // InternalDataDSL.g:2260:3: ( rule__XConstructorCall__Group__0 )
+            // InternalDataDSL.g:2260:4: rule__XConstructorCall__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group__0();
@@ -7157,11 +7680,11 @@
 
 
     // $ANTLR start "entryRuleXBooleanLiteral"
-    // InternalDataDSL.g:2119:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
+    // InternalDataDSL.g:2269:1: entryRuleXBooleanLiteral : ruleXBooleanLiteral EOF ;
     public final void entryRuleXBooleanLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2120:1: ( ruleXBooleanLiteral EOF )
-            // InternalDataDSL.g:2121:1: ruleXBooleanLiteral EOF
+            // InternalDataDSL.g:2270:1: ( ruleXBooleanLiteral EOF )
+            // InternalDataDSL.g:2271:1: ruleXBooleanLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralRule()); 
@@ -7191,23 +7714,23 @@
 
 
     // $ANTLR start "ruleXBooleanLiteral"
-    // InternalDataDSL.g:2128:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:2278:1: ruleXBooleanLiteral : ( ( rule__XBooleanLiteral__Group__0 ) ) ;
     public final void ruleXBooleanLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2132:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:2133:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            // InternalDataDSL.g:2282:2: ( ( ( rule__XBooleanLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:2283:2: ( ( rule__XBooleanLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:2133:2: ( ( rule__XBooleanLiteral__Group__0 ) )
-            // InternalDataDSL.g:2134:3: ( rule__XBooleanLiteral__Group__0 )
+            // InternalDataDSL.g:2283:2: ( ( rule__XBooleanLiteral__Group__0 ) )
+            // InternalDataDSL.g:2284:3: ( rule__XBooleanLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2135:3: ( rule__XBooleanLiteral__Group__0 )
-            // InternalDataDSL.g:2135:4: rule__XBooleanLiteral__Group__0
+            // InternalDataDSL.g:2285:3: ( rule__XBooleanLiteral__Group__0 )
+            // InternalDataDSL.g:2285:4: rule__XBooleanLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Group__0();
@@ -7242,11 +7765,11 @@
 
 
     // $ANTLR start "entryRuleXNullLiteral"
-    // InternalDataDSL.g:2144:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
+    // InternalDataDSL.g:2294:1: entryRuleXNullLiteral : ruleXNullLiteral EOF ;
     public final void entryRuleXNullLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2145:1: ( ruleXNullLiteral EOF )
-            // InternalDataDSL.g:2146:1: ruleXNullLiteral EOF
+            // InternalDataDSL.g:2295:1: ( ruleXNullLiteral EOF )
+            // InternalDataDSL.g:2296:1: ruleXNullLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralRule()); 
@@ -7276,23 +7799,23 @@
 
 
     // $ANTLR start "ruleXNullLiteral"
-    // InternalDataDSL.g:2153:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:2303:1: ruleXNullLiteral : ( ( rule__XNullLiteral__Group__0 ) ) ;
     public final void ruleXNullLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2157:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:2158:2: ( ( rule__XNullLiteral__Group__0 ) )
+            // InternalDataDSL.g:2307:2: ( ( ( rule__XNullLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:2308:2: ( ( rule__XNullLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:2158:2: ( ( rule__XNullLiteral__Group__0 ) )
-            // InternalDataDSL.g:2159:3: ( rule__XNullLiteral__Group__0 )
+            // InternalDataDSL.g:2308:2: ( ( rule__XNullLiteral__Group__0 ) )
+            // InternalDataDSL.g:2309:3: ( rule__XNullLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2160:3: ( rule__XNullLiteral__Group__0 )
-            // InternalDataDSL.g:2160:4: rule__XNullLiteral__Group__0
+            // InternalDataDSL.g:2310:3: ( rule__XNullLiteral__Group__0 )
+            // InternalDataDSL.g:2310:4: rule__XNullLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XNullLiteral__Group__0();
@@ -7327,11 +7850,11 @@
 
 
     // $ANTLR start "entryRuleXNumberLiteral"
-    // InternalDataDSL.g:2169:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
+    // InternalDataDSL.g:2319:1: entryRuleXNumberLiteral : ruleXNumberLiteral EOF ;
     public final void entryRuleXNumberLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2170:1: ( ruleXNumberLiteral EOF )
-            // InternalDataDSL.g:2171:1: ruleXNumberLiteral EOF
+            // InternalDataDSL.g:2320:1: ( ruleXNumberLiteral EOF )
+            // InternalDataDSL.g:2321:1: ruleXNumberLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralRule()); 
@@ -7361,23 +7884,23 @@
 
 
     // $ANTLR start "ruleXNumberLiteral"
-    // InternalDataDSL.g:2178:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:2328:1: ruleXNumberLiteral : ( ( rule__XNumberLiteral__Group__0 ) ) ;
     public final void ruleXNumberLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2182:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:2183:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            // InternalDataDSL.g:2332:2: ( ( ( rule__XNumberLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:2333:2: ( ( rule__XNumberLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:2183:2: ( ( rule__XNumberLiteral__Group__0 ) )
-            // InternalDataDSL.g:2184:3: ( rule__XNumberLiteral__Group__0 )
+            // InternalDataDSL.g:2333:2: ( ( rule__XNumberLiteral__Group__0 ) )
+            // InternalDataDSL.g:2334:3: ( rule__XNumberLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2185:3: ( rule__XNumberLiteral__Group__0 )
-            // InternalDataDSL.g:2185:4: rule__XNumberLiteral__Group__0
+            // InternalDataDSL.g:2335:3: ( rule__XNumberLiteral__Group__0 )
+            // InternalDataDSL.g:2335:4: rule__XNumberLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__Group__0();
@@ -7412,11 +7935,11 @@
 
 
     // $ANTLR start "entryRuleXStringLiteral"
-    // InternalDataDSL.g:2194:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
+    // InternalDataDSL.g:2344:1: entryRuleXStringLiteral : ruleXStringLiteral EOF ;
     public final void entryRuleXStringLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2195:1: ( ruleXStringLiteral EOF )
-            // InternalDataDSL.g:2196:1: ruleXStringLiteral EOF
+            // InternalDataDSL.g:2345:1: ( ruleXStringLiteral EOF )
+            // InternalDataDSL.g:2346:1: ruleXStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralRule()); 
@@ -7446,23 +7969,23 @@
 
 
     // $ANTLR start "ruleXStringLiteral"
-    // InternalDataDSL.g:2203:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:2353:1: ruleXStringLiteral : ( ( rule__XStringLiteral__Group__0 ) ) ;
     public final void ruleXStringLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2207:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:2208:2: ( ( rule__XStringLiteral__Group__0 ) )
+            // InternalDataDSL.g:2357:2: ( ( ( rule__XStringLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:2358:2: ( ( rule__XStringLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:2208:2: ( ( rule__XStringLiteral__Group__0 ) )
-            // InternalDataDSL.g:2209:3: ( rule__XStringLiteral__Group__0 )
+            // InternalDataDSL.g:2358:2: ( ( rule__XStringLiteral__Group__0 ) )
+            // InternalDataDSL.g:2359:3: ( rule__XStringLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2210:3: ( rule__XStringLiteral__Group__0 )
-            // InternalDataDSL.g:2210:4: rule__XStringLiteral__Group__0
+            // InternalDataDSL.g:2360:3: ( rule__XStringLiteral__Group__0 )
+            // InternalDataDSL.g:2360:4: rule__XStringLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__Group__0();
@@ -7497,11 +8020,11 @@
 
 
     // $ANTLR start "entryRuleXTypeLiteral"
-    // InternalDataDSL.g:2219:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
+    // InternalDataDSL.g:2369:1: entryRuleXTypeLiteral : ruleXTypeLiteral EOF ;
     public final void entryRuleXTypeLiteral() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2220:1: ( ruleXTypeLiteral EOF )
-            // InternalDataDSL.g:2221:1: ruleXTypeLiteral EOF
+            // InternalDataDSL.g:2370:1: ( ruleXTypeLiteral EOF )
+            // InternalDataDSL.g:2371:1: ruleXTypeLiteral EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralRule()); 
@@ -7531,23 +8054,23 @@
 
 
     // $ANTLR start "ruleXTypeLiteral"
-    // InternalDataDSL.g:2228:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
+    // InternalDataDSL.g:2378:1: ruleXTypeLiteral : ( ( rule__XTypeLiteral__Group__0 ) ) ;
     public final void ruleXTypeLiteral() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2232:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
-            // InternalDataDSL.g:2233:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            // InternalDataDSL.g:2382:2: ( ( ( rule__XTypeLiteral__Group__0 ) ) )
+            // InternalDataDSL.g:2383:2: ( ( rule__XTypeLiteral__Group__0 ) )
             {
-            // InternalDataDSL.g:2233:2: ( ( rule__XTypeLiteral__Group__0 ) )
-            // InternalDataDSL.g:2234:3: ( rule__XTypeLiteral__Group__0 )
+            // InternalDataDSL.g:2383:2: ( ( rule__XTypeLiteral__Group__0 ) )
+            // InternalDataDSL.g:2384:3: ( rule__XTypeLiteral__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2235:3: ( rule__XTypeLiteral__Group__0 )
-            // InternalDataDSL.g:2235:4: rule__XTypeLiteral__Group__0
+            // InternalDataDSL.g:2385:3: ( rule__XTypeLiteral__Group__0 )
+            // InternalDataDSL.g:2385:4: rule__XTypeLiteral__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__Group__0();
@@ -7582,11 +8105,11 @@
 
 
     // $ANTLR start "entryRuleXThrowExpression"
-    // InternalDataDSL.g:2244:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
+    // InternalDataDSL.g:2394:1: entryRuleXThrowExpression : ruleXThrowExpression EOF ;
     public final void entryRuleXThrowExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2245:1: ( ruleXThrowExpression EOF )
-            // InternalDataDSL.g:2246:1: ruleXThrowExpression EOF
+            // InternalDataDSL.g:2395:1: ( ruleXThrowExpression EOF )
+            // InternalDataDSL.g:2396:1: ruleXThrowExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionRule()); 
@@ -7616,23 +8139,23 @@
 
 
     // $ANTLR start "ruleXThrowExpression"
-    // InternalDataDSL.g:2253:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2403:1: ruleXThrowExpression : ( ( rule__XThrowExpression__Group__0 ) ) ;
     public final void ruleXThrowExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2257:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
-            // InternalDataDSL.g:2258:2: ( ( rule__XThrowExpression__Group__0 ) )
+            // InternalDataDSL.g:2407:2: ( ( ( rule__XThrowExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2408:2: ( ( rule__XThrowExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:2258:2: ( ( rule__XThrowExpression__Group__0 ) )
-            // InternalDataDSL.g:2259:3: ( rule__XThrowExpression__Group__0 )
+            // InternalDataDSL.g:2408:2: ( ( rule__XThrowExpression__Group__0 ) )
+            // InternalDataDSL.g:2409:3: ( rule__XThrowExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2260:3: ( rule__XThrowExpression__Group__0 )
-            // InternalDataDSL.g:2260:4: rule__XThrowExpression__Group__0
+            // InternalDataDSL.g:2410:3: ( rule__XThrowExpression__Group__0 )
+            // InternalDataDSL.g:2410:4: rule__XThrowExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__Group__0();
@@ -7667,11 +8190,11 @@
 
 
     // $ANTLR start "entryRuleXReturnExpression"
-    // InternalDataDSL.g:2269:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
+    // InternalDataDSL.g:2419:1: entryRuleXReturnExpression : ruleXReturnExpression EOF ;
     public final void entryRuleXReturnExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2270:1: ( ruleXReturnExpression EOF )
-            // InternalDataDSL.g:2271:1: ruleXReturnExpression EOF
+            // InternalDataDSL.g:2420:1: ( ruleXReturnExpression EOF )
+            // InternalDataDSL.g:2421:1: ruleXReturnExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionRule()); 
@@ -7701,23 +8224,23 @@
 
 
     // $ANTLR start "ruleXReturnExpression"
-    // InternalDataDSL.g:2278:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2428:1: ruleXReturnExpression : ( ( rule__XReturnExpression__Group__0 ) ) ;
     public final void ruleXReturnExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2282:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
-            // InternalDataDSL.g:2283:2: ( ( rule__XReturnExpression__Group__0 ) )
+            // InternalDataDSL.g:2432:2: ( ( ( rule__XReturnExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2433:2: ( ( rule__XReturnExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:2283:2: ( ( rule__XReturnExpression__Group__0 ) )
-            // InternalDataDSL.g:2284:3: ( rule__XReturnExpression__Group__0 )
+            // InternalDataDSL.g:2433:2: ( ( rule__XReturnExpression__Group__0 ) )
+            // InternalDataDSL.g:2434:3: ( rule__XReturnExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2285:3: ( rule__XReturnExpression__Group__0 )
-            // InternalDataDSL.g:2285:4: rule__XReturnExpression__Group__0
+            // InternalDataDSL.g:2435:3: ( rule__XReturnExpression__Group__0 )
+            // InternalDataDSL.g:2435:4: rule__XReturnExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XReturnExpression__Group__0();
@@ -7752,11 +8275,11 @@
 
 
     // $ANTLR start "entryRuleXTryCatchFinallyExpression"
-    // InternalDataDSL.g:2294:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
+    // InternalDataDSL.g:2444:1: entryRuleXTryCatchFinallyExpression : ruleXTryCatchFinallyExpression EOF ;
     public final void entryRuleXTryCatchFinallyExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2295:1: ( ruleXTryCatchFinallyExpression EOF )
-            // InternalDataDSL.g:2296:1: ruleXTryCatchFinallyExpression EOF
+            // InternalDataDSL.g:2445:1: ( ruleXTryCatchFinallyExpression EOF )
+            // InternalDataDSL.g:2446:1: ruleXTryCatchFinallyExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionRule()); 
@@ -7786,23 +8309,23 @@
 
 
     // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // InternalDataDSL.g:2303:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2453:1: ruleXTryCatchFinallyExpression : ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) ;
     public final void ruleXTryCatchFinallyExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2307:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
-            // InternalDataDSL.g:2308:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            // InternalDataDSL.g:2457:2: ( ( ( rule__XTryCatchFinallyExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2458:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:2308:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
-            // InternalDataDSL.g:2309:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            // InternalDataDSL.g:2458:2: ( ( rule__XTryCatchFinallyExpression__Group__0 ) )
+            // InternalDataDSL.g:2459:3: ( rule__XTryCatchFinallyExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2310:3: ( rule__XTryCatchFinallyExpression__Group__0 )
-            // InternalDataDSL.g:2310:4: rule__XTryCatchFinallyExpression__Group__0
+            // InternalDataDSL.g:2460:3: ( rule__XTryCatchFinallyExpression__Group__0 )
+            // InternalDataDSL.g:2460:4: rule__XTryCatchFinallyExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group__0();
@@ -7837,11 +8360,11 @@
 
 
     // $ANTLR start "entryRuleXSynchronizedExpression"
-    // InternalDataDSL.g:2319:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
+    // InternalDataDSL.g:2469:1: entryRuleXSynchronizedExpression : ruleXSynchronizedExpression EOF ;
     public final void entryRuleXSynchronizedExpression() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2320:1: ( ruleXSynchronizedExpression EOF )
-            // InternalDataDSL.g:2321:1: ruleXSynchronizedExpression EOF
+            // InternalDataDSL.g:2470:1: ( ruleXSynchronizedExpression EOF )
+            // InternalDataDSL.g:2471:1: ruleXSynchronizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionRule()); 
@@ -7871,23 +8394,23 @@
 
 
     // $ANTLR start "ruleXSynchronizedExpression"
-    // InternalDataDSL.g:2328:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
+    // InternalDataDSL.g:2478:1: ruleXSynchronizedExpression : ( ( rule__XSynchronizedExpression__Group__0 ) ) ;
     public final void ruleXSynchronizedExpression() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2332:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
-            // InternalDataDSL.g:2333:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            // InternalDataDSL.g:2482:2: ( ( ( rule__XSynchronizedExpression__Group__0 ) ) )
+            // InternalDataDSL.g:2483:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
             {
-            // InternalDataDSL.g:2333:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
-            // InternalDataDSL.g:2334:3: ( rule__XSynchronizedExpression__Group__0 )
+            // InternalDataDSL.g:2483:2: ( ( rule__XSynchronizedExpression__Group__0 ) )
+            // InternalDataDSL.g:2484:3: ( rule__XSynchronizedExpression__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2335:3: ( rule__XSynchronizedExpression__Group__0 )
-            // InternalDataDSL.g:2335:4: rule__XSynchronizedExpression__Group__0
+            // InternalDataDSL.g:2485:3: ( rule__XSynchronizedExpression__Group__0 )
+            // InternalDataDSL.g:2485:4: rule__XSynchronizedExpression__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group__0();
@@ -7922,11 +8445,11 @@
 
 
     // $ANTLR start "entryRuleXCatchClause"
-    // InternalDataDSL.g:2344:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
+    // InternalDataDSL.g:2494:1: entryRuleXCatchClause : ruleXCatchClause EOF ;
     public final void entryRuleXCatchClause() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2345:1: ( ruleXCatchClause EOF )
-            // InternalDataDSL.g:2346:1: ruleXCatchClause EOF
+            // InternalDataDSL.g:2495:1: ( ruleXCatchClause EOF )
+            // InternalDataDSL.g:2496:1: ruleXCatchClause EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseRule()); 
@@ -7956,23 +8479,23 @@
 
 
     // $ANTLR start "ruleXCatchClause"
-    // InternalDataDSL.g:2353:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
+    // InternalDataDSL.g:2503:1: ruleXCatchClause : ( ( rule__XCatchClause__Group__0 ) ) ;
     public final void ruleXCatchClause() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2357:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
-            // InternalDataDSL.g:2358:2: ( ( rule__XCatchClause__Group__0 ) )
+            // InternalDataDSL.g:2507:2: ( ( ( rule__XCatchClause__Group__0 ) ) )
+            // InternalDataDSL.g:2508:2: ( ( rule__XCatchClause__Group__0 ) )
             {
-            // InternalDataDSL.g:2358:2: ( ( rule__XCatchClause__Group__0 ) )
-            // InternalDataDSL.g:2359:3: ( rule__XCatchClause__Group__0 )
+            // InternalDataDSL.g:2508:2: ( ( rule__XCatchClause__Group__0 ) )
+            // InternalDataDSL.g:2509:3: ( rule__XCatchClause__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2360:3: ( rule__XCatchClause__Group__0 )
-            // InternalDataDSL.g:2360:4: rule__XCatchClause__Group__0
+            // InternalDataDSL.g:2510:3: ( rule__XCatchClause__Group__0 )
+            // InternalDataDSL.g:2510:4: rule__XCatchClause__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__Group__0();
@@ -8007,11 +8530,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedName"
-    // InternalDataDSL.g:2369:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
+    // InternalDataDSL.g:2519:1: entryRuleQualifiedName : ruleQualifiedName EOF ;
     public final void entryRuleQualifiedName() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2370:1: ( ruleQualifiedName EOF )
-            // InternalDataDSL.g:2371:1: ruleQualifiedName EOF
+            // InternalDataDSL.g:2520:1: ( ruleQualifiedName EOF )
+            // InternalDataDSL.g:2521:1: ruleQualifiedName EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameRule()); 
@@ -8041,23 +8564,23 @@
 
 
     // $ANTLR start "ruleQualifiedName"
-    // InternalDataDSL.g:2378:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
+    // InternalDataDSL.g:2528:1: ruleQualifiedName : ( ( rule__QualifiedName__Group__0 ) ) ;
     public final void ruleQualifiedName() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2382:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
-            // InternalDataDSL.g:2383:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalDataDSL.g:2532:2: ( ( ( rule__QualifiedName__Group__0 ) ) )
+            // InternalDataDSL.g:2533:2: ( ( rule__QualifiedName__Group__0 ) )
             {
-            // InternalDataDSL.g:2383:2: ( ( rule__QualifiedName__Group__0 ) )
-            // InternalDataDSL.g:2384:3: ( rule__QualifiedName__Group__0 )
+            // InternalDataDSL.g:2533:2: ( ( rule__QualifiedName__Group__0 ) )
+            // InternalDataDSL.g:2534:3: ( rule__QualifiedName__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2385:3: ( rule__QualifiedName__Group__0 )
-            // InternalDataDSL.g:2385:4: rule__QualifiedName__Group__0
+            // InternalDataDSL.g:2535:3: ( rule__QualifiedName__Group__0 )
+            // InternalDataDSL.g:2535:4: rule__QualifiedName__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group__0();
@@ -8092,14 +8615,14 @@
 
 
     // $ANTLR start "entryRuleNumber"
-    // InternalDataDSL.g:2394:1: entryRuleNumber : ruleNumber EOF ;
+    // InternalDataDSL.g:2544:1: entryRuleNumber : ruleNumber EOF ;
     public final void entryRuleNumber() throws RecognitionException {
          
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalDataDSL.g:2398:1: ( ruleNumber EOF )
-            // InternalDataDSL.g:2399:1: ruleNumber EOF
+            // InternalDataDSL.g:2548:1: ( ruleNumber EOF )
+            // InternalDataDSL.g:2549:1: ruleNumber EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberRule()); 
@@ -8132,24 +8655,24 @@
 
 
     // $ANTLR start "ruleNumber"
-    // InternalDataDSL.g:2409:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
+    // InternalDataDSL.g:2559:1: ruleNumber : ( ( rule__Number__Alternatives ) ) ;
     public final void ruleNumber() throws RecognitionException {
 
         		HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2414:2: ( ( ( rule__Number__Alternatives ) ) )
-            // InternalDataDSL.g:2415:2: ( ( rule__Number__Alternatives ) )
+            // InternalDataDSL.g:2564:2: ( ( ( rule__Number__Alternatives ) ) )
+            // InternalDataDSL.g:2565:2: ( ( rule__Number__Alternatives ) )
             {
-            // InternalDataDSL.g:2415:2: ( ( rule__Number__Alternatives ) )
-            // InternalDataDSL.g:2416:3: ( rule__Number__Alternatives )
+            // InternalDataDSL.g:2565:2: ( ( rule__Number__Alternatives ) )
+            // InternalDataDSL.g:2566:3: ( rule__Number__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2417:3: ( rule__Number__Alternatives )
-            // InternalDataDSL.g:2417:4: rule__Number__Alternatives
+            // InternalDataDSL.g:2567:3: ( rule__Number__Alternatives )
+            // InternalDataDSL.g:2567:4: rule__Number__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives();
@@ -8185,11 +8708,11 @@
 
 
     // $ANTLR start "entryRuleJvmTypeReference"
-    // InternalDataDSL.g:2427:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
+    // InternalDataDSL.g:2577:1: entryRuleJvmTypeReference : ruleJvmTypeReference EOF ;
     public final void entryRuleJvmTypeReference() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2428:1: ( ruleJvmTypeReference EOF )
-            // InternalDataDSL.g:2429:1: ruleJvmTypeReference EOF
+            // InternalDataDSL.g:2578:1: ( ruleJvmTypeReference EOF )
+            // InternalDataDSL.g:2579:1: ruleJvmTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceRule()); 
@@ -8219,23 +8742,23 @@
 
 
     // $ANTLR start "ruleJvmTypeReference"
-    // InternalDataDSL.g:2436:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
+    // InternalDataDSL.g:2586:1: ruleJvmTypeReference : ( ( rule__JvmTypeReference__Alternatives ) ) ;
     public final void ruleJvmTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2440:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
-            // InternalDataDSL.g:2441:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalDataDSL.g:2590:2: ( ( ( rule__JvmTypeReference__Alternatives ) ) )
+            // InternalDataDSL.g:2591:2: ( ( rule__JvmTypeReference__Alternatives ) )
             {
-            // InternalDataDSL.g:2441:2: ( ( rule__JvmTypeReference__Alternatives ) )
-            // InternalDataDSL.g:2442:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalDataDSL.g:2591:2: ( ( rule__JvmTypeReference__Alternatives ) )
+            // InternalDataDSL.g:2592:3: ( rule__JvmTypeReference__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2443:3: ( rule__JvmTypeReference__Alternatives )
-            // InternalDataDSL.g:2443:4: rule__JvmTypeReference__Alternatives
+            // InternalDataDSL.g:2593:3: ( rule__JvmTypeReference__Alternatives )
+            // InternalDataDSL.g:2593:4: rule__JvmTypeReference__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Alternatives();
@@ -8270,11 +8793,11 @@
 
 
     // $ANTLR start "entryRuleArrayBrackets"
-    // InternalDataDSL.g:2452:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
+    // InternalDataDSL.g:2602:1: entryRuleArrayBrackets : ruleArrayBrackets EOF ;
     public final void entryRuleArrayBrackets() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2453:1: ( ruleArrayBrackets EOF )
-            // InternalDataDSL.g:2454:1: ruleArrayBrackets EOF
+            // InternalDataDSL.g:2603:1: ( ruleArrayBrackets EOF )
+            // InternalDataDSL.g:2604:1: ruleArrayBrackets EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsRule()); 
@@ -8304,23 +8827,23 @@
 
 
     // $ANTLR start "ruleArrayBrackets"
-    // InternalDataDSL.g:2461:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
+    // InternalDataDSL.g:2611:1: ruleArrayBrackets : ( ( rule__ArrayBrackets__Group__0 ) ) ;
     public final void ruleArrayBrackets() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2465:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
-            // InternalDataDSL.g:2466:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalDataDSL.g:2615:2: ( ( ( rule__ArrayBrackets__Group__0 ) ) )
+            // InternalDataDSL.g:2616:2: ( ( rule__ArrayBrackets__Group__0 ) )
             {
-            // InternalDataDSL.g:2466:2: ( ( rule__ArrayBrackets__Group__0 ) )
-            // InternalDataDSL.g:2467:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalDataDSL.g:2616:2: ( ( rule__ArrayBrackets__Group__0 ) )
+            // InternalDataDSL.g:2617:3: ( rule__ArrayBrackets__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2468:3: ( rule__ArrayBrackets__Group__0 )
-            // InternalDataDSL.g:2468:4: rule__ArrayBrackets__Group__0
+            // InternalDataDSL.g:2618:3: ( rule__ArrayBrackets__Group__0 )
+            // InternalDataDSL.g:2618:4: rule__ArrayBrackets__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__ArrayBrackets__Group__0();
@@ -8355,11 +8878,11 @@
 
 
     // $ANTLR start "entryRuleXFunctionTypeRef"
-    // InternalDataDSL.g:2477:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
+    // InternalDataDSL.g:2627:1: entryRuleXFunctionTypeRef : ruleXFunctionTypeRef EOF ;
     public final void entryRuleXFunctionTypeRef() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2478:1: ( ruleXFunctionTypeRef EOF )
-            // InternalDataDSL.g:2479:1: ruleXFunctionTypeRef EOF
+            // InternalDataDSL.g:2628:1: ( ruleXFunctionTypeRef EOF )
+            // InternalDataDSL.g:2629:1: ruleXFunctionTypeRef EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefRule()); 
@@ -8389,23 +8912,23 @@
 
 
     // $ANTLR start "ruleXFunctionTypeRef"
-    // InternalDataDSL.g:2486:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
+    // InternalDataDSL.g:2636:1: ruleXFunctionTypeRef : ( ( rule__XFunctionTypeRef__Group__0 ) ) ;
     public final void ruleXFunctionTypeRef() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2490:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
-            // InternalDataDSL.g:2491:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalDataDSL.g:2640:2: ( ( ( rule__XFunctionTypeRef__Group__0 ) ) )
+            // InternalDataDSL.g:2641:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
             {
-            // InternalDataDSL.g:2491:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
-            // InternalDataDSL.g:2492:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalDataDSL.g:2641:2: ( ( rule__XFunctionTypeRef__Group__0 ) )
+            // InternalDataDSL.g:2642:3: ( rule__XFunctionTypeRef__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2493:3: ( rule__XFunctionTypeRef__Group__0 )
-            // InternalDataDSL.g:2493:4: rule__XFunctionTypeRef__Group__0
+            // InternalDataDSL.g:2643:3: ( rule__XFunctionTypeRef__Group__0 )
+            // InternalDataDSL.g:2643:4: rule__XFunctionTypeRef__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group__0();
@@ -8440,11 +8963,11 @@
 
 
     // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // InternalDataDSL.g:2502:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
+    // InternalDataDSL.g:2652:1: entryRuleJvmParameterizedTypeReference : ruleJvmParameterizedTypeReference EOF ;
     public final void entryRuleJvmParameterizedTypeReference() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2503:1: ( ruleJvmParameterizedTypeReference EOF )
-            // InternalDataDSL.g:2504:1: ruleJvmParameterizedTypeReference EOF
+            // InternalDataDSL.g:2653:1: ( ruleJvmParameterizedTypeReference EOF )
+            // InternalDataDSL.g:2654:1: ruleJvmParameterizedTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
@@ -8474,23 +8997,23 @@
 
 
     // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // InternalDataDSL.g:2511:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
+    // InternalDataDSL.g:2661:1: ruleJvmParameterizedTypeReference : ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) ;
     public final void ruleJvmParameterizedTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2515:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
-            // InternalDataDSL.g:2516:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalDataDSL.g:2665:2: ( ( ( rule__JvmParameterizedTypeReference__Group__0 ) ) )
+            // InternalDataDSL.g:2666:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
             {
-            // InternalDataDSL.g:2516:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
-            // InternalDataDSL.g:2517:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalDataDSL.g:2666:2: ( ( rule__JvmParameterizedTypeReference__Group__0 ) )
+            // InternalDataDSL.g:2667:3: ( rule__JvmParameterizedTypeReference__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2518:3: ( rule__JvmParameterizedTypeReference__Group__0 )
-            // InternalDataDSL.g:2518:4: rule__JvmParameterizedTypeReference__Group__0
+            // InternalDataDSL.g:2668:3: ( rule__JvmParameterizedTypeReference__Group__0 )
+            // InternalDataDSL.g:2668:4: rule__JvmParameterizedTypeReference__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group__0();
@@ -8525,11 +9048,11 @@
 
 
     // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // InternalDataDSL.g:2527:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
+    // InternalDataDSL.g:2677:1: entryRuleJvmArgumentTypeReference : ruleJvmArgumentTypeReference EOF ;
     public final void entryRuleJvmArgumentTypeReference() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2528:1: ( ruleJvmArgumentTypeReference EOF )
-            // InternalDataDSL.g:2529:1: ruleJvmArgumentTypeReference EOF
+            // InternalDataDSL.g:2678:1: ( ruleJvmArgumentTypeReference EOF )
+            // InternalDataDSL.g:2679:1: ruleJvmArgumentTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmArgumentTypeReferenceRule()); 
@@ -8559,23 +9082,23 @@
 
 
     // $ANTLR start "ruleJvmArgumentTypeReference"
-    // InternalDataDSL.g:2536:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
+    // InternalDataDSL.g:2686:1: ruleJvmArgumentTypeReference : ( ( rule__JvmArgumentTypeReference__Alternatives ) ) ;
     public final void ruleJvmArgumentTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2540:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
-            // InternalDataDSL.g:2541:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalDataDSL.g:2690:2: ( ( ( rule__JvmArgumentTypeReference__Alternatives ) ) )
+            // InternalDataDSL.g:2691:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
             {
-            // InternalDataDSL.g:2541:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
-            // InternalDataDSL.g:2542:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalDataDSL.g:2691:2: ( ( rule__JvmArgumentTypeReference__Alternatives ) )
+            // InternalDataDSL.g:2692:3: ( rule__JvmArgumentTypeReference__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmArgumentTypeReferenceAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2543:3: ( rule__JvmArgumentTypeReference__Alternatives )
-            // InternalDataDSL.g:2543:4: rule__JvmArgumentTypeReference__Alternatives
+            // InternalDataDSL.g:2693:3: ( rule__JvmArgumentTypeReference__Alternatives )
+            // InternalDataDSL.g:2693:4: rule__JvmArgumentTypeReference__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__JvmArgumentTypeReference__Alternatives();
@@ -8610,11 +9133,11 @@
 
 
     // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // InternalDataDSL.g:2552:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
+    // InternalDataDSL.g:2702:1: entryRuleJvmWildcardTypeReference : ruleJvmWildcardTypeReference EOF ;
     public final void entryRuleJvmWildcardTypeReference() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2553:1: ( ruleJvmWildcardTypeReference EOF )
-            // InternalDataDSL.g:2554:1: ruleJvmWildcardTypeReference EOF
+            // InternalDataDSL.g:2703:1: ( ruleJvmWildcardTypeReference EOF )
+            // InternalDataDSL.g:2704:1: ruleJvmWildcardTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceRule()); 
@@ -8644,23 +9167,23 @@
 
 
     // $ANTLR start "ruleJvmWildcardTypeReference"
-    // InternalDataDSL.g:2561:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
+    // InternalDataDSL.g:2711:1: ruleJvmWildcardTypeReference : ( ( rule__JvmWildcardTypeReference__Group__0 ) ) ;
     public final void ruleJvmWildcardTypeReference() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2565:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
-            // InternalDataDSL.g:2566:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalDataDSL.g:2715:2: ( ( ( rule__JvmWildcardTypeReference__Group__0 ) ) )
+            // InternalDataDSL.g:2716:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
             {
-            // InternalDataDSL.g:2566:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
-            // InternalDataDSL.g:2567:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalDataDSL.g:2716:2: ( ( rule__JvmWildcardTypeReference__Group__0 ) )
+            // InternalDataDSL.g:2717:3: ( rule__JvmWildcardTypeReference__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2568:3: ( rule__JvmWildcardTypeReference__Group__0 )
-            // InternalDataDSL.g:2568:4: rule__JvmWildcardTypeReference__Group__0
+            // InternalDataDSL.g:2718:3: ( rule__JvmWildcardTypeReference__Group__0 )
+            // InternalDataDSL.g:2718:4: rule__JvmWildcardTypeReference__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group__0();
@@ -8695,11 +9218,11 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBound"
-    // InternalDataDSL.g:2577:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
+    // InternalDataDSL.g:2727:1: entryRuleJvmUpperBound : ruleJvmUpperBound EOF ;
     public final void entryRuleJvmUpperBound() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2578:1: ( ruleJvmUpperBound EOF )
-            // InternalDataDSL.g:2579:1: ruleJvmUpperBound EOF
+            // InternalDataDSL.g:2728:1: ( ruleJvmUpperBound EOF )
+            // InternalDataDSL.g:2729:1: ruleJvmUpperBound EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundRule()); 
@@ -8729,23 +9252,23 @@
 
 
     // $ANTLR start "ruleJvmUpperBound"
-    // InternalDataDSL.g:2586:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
+    // InternalDataDSL.g:2736:1: ruleJvmUpperBound : ( ( rule__JvmUpperBound__Group__0 ) ) ;
     public final void ruleJvmUpperBound() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2590:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
-            // InternalDataDSL.g:2591:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalDataDSL.g:2740:2: ( ( ( rule__JvmUpperBound__Group__0 ) ) )
+            // InternalDataDSL.g:2741:2: ( ( rule__JvmUpperBound__Group__0 ) )
             {
-            // InternalDataDSL.g:2591:2: ( ( rule__JvmUpperBound__Group__0 ) )
-            // InternalDataDSL.g:2592:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalDataDSL.g:2741:2: ( ( rule__JvmUpperBound__Group__0 ) )
+            // InternalDataDSL.g:2742:3: ( rule__JvmUpperBound__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2593:3: ( rule__JvmUpperBound__Group__0 )
-            // InternalDataDSL.g:2593:4: rule__JvmUpperBound__Group__0
+            // InternalDataDSL.g:2743:3: ( rule__JvmUpperBound__Group__0 )
+            // InternalDataDSL.g:2743:4: rule__JvmUpperBound__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__Group__0();
@@ -8780,11 +9303,11 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // InternalDataDSL.g:2602:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
+    // InternalDataDSL.g:2752:1: entryRuleJvmUpperBoundAnded : ruleJvmUpperBoundAnded EOF ;
     public final void entryRuleJvmUpperBoundAnded() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2603:1: ( ruleJvmUpperBoundAnded EOF )
-            // InternalDataDSL.g:2604:1: ruleJvmUpperBoundAnded EOF
+            // InternalDataDSL.g:2753:1: ( ruleJvmUpperBoundAnded EOF )
+            // InternalDataDSL.g:2754:1: ruleJvmUpperBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedRule()); 
@@ -8814,23 +9337,23 @@
 
 
     // $ANTLR start "ruleJvmUpperBoundAnded"
-    // InternalDataDSL.g:2611:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
+    // InternalDataDSL.g:2761:1: ruleJvmUpperBoundAnded : ( ( rule__JvmUpperBoundAnded__Group__0 ) ) ;
     public final void ruleJvmUpperBoundAnded() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2615:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
-            // InternalDataDSL.g:2616:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalDataDSL.g:2765:2: ( ( ( rule__JvmUpperBoundAnded__Group__0 ) ) )
+            // InternalDataDSL.g:2766:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
             {
-            // InternalDataDSL.g:2616:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
-            // InternalDataDSL.g:2617:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalDataDSL.g:2766:2: ( ( rule__JvmUpperBoundAnded__Group__0 ) )
+            // InternalDataDSL.g:2767:3: ( rule__JvmUpperBoundAnded__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2618:3: ( rule__JvmUpperBoundAnded__Group__0 )
-            // InternalDataDSL.g:2618:4: rule__JvmUpperBoundAnded__Group__0
+            // InternalDataDSL.g:2768:3: ( rule__JvmUpperBoundAnded__Group__0 )
+            // InternalDataDSL.g:2768:4: rule__JvmUpperBoundAnded__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__Group__0();
@@ -8865,11 +9388,11 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBound"
-    // InternalDataDSL.g:2627:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
+    // InternalDataDSL.g:2777:1: entryRuleJvmLowerBound : ruleJvmLowerBound EOF ;
     public final void entryRuleJvmLowerBound() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2628:1: ( ruleJvmLowerBound EOF )
-            // InternalDataDSL.g:2629:1: ruleJvmLowerBound EOF
+            // InternalDataDSL.g:2778:1: ( ruleJvmLowerBound EOF )
+            // InternalDataDSL.g:2779:1: ruleJvmLowerBound EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundRule()); 
@@ -8899,23 +9422,23 @@
 
 
     // $ANTLR start "ruleJvmLowerBound"
-    // InternalDataDSL.g:2636:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
+    // InternalDataDSL.g:2786:1: ruleJvmLowerBound : ( ( rule__JvmLowerBound__Group__0 ) ) ;
     public final void ruleJvmLowerBound() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2640:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
-            // InternalDataDSL.g:2641:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalDataDSL.g:2790:2: ( ( ( rule__JvmLowerBound__Group__0 ) ) )
+            // InternalDataDSL.g:2791:2: ( ( rule__JvmLowerBound__Group__0 ) )
             {
-            // InternalDataDSL.g:2641:2: ( ( rule__JvmLowerBound__Group__0 ) )
-            // InternalDataDSL.g:2642:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalDataDSL.g:2791:2: ( ( rule__JvmLowerBound__Group__0 ) )
+            // InternalDataDSL.g:2792:3: ( rule__JvmLowerBound__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2643:3: ( rule__JvmLowerBound__Group__0 )
-            // InternalDataDSL.g:2643:4: rule__JvmLowerBound__Group__0
+            // InternalDataDSL.g:2793:3: ( rule__JvmLowerBound__Group__0 )
+            // InternalDataDSL.g:2793:4: rule__JvmLowerBound__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__Group__0();
@@ -8950,11 +9473,11 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // InternalDataDSL.g:2652:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
+    // InternalDataDSL.g:2802:1: entryRuleJvmLowerBoundAnded : ruleJvmLowerBoundAnded EOF ;
     public final void entryRuleJvmLowerBoundAnded() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2653:1: ( ruleJvmLowerBoundAnded EOF )
-            // InternalDataDSL.g:2654:1: ruleJvmLowerBoundAnded EOF
+            // InternalDataDSL.g:2803:1: ( ruleJvmLowerBoundAnded EOF )
+            // InternalDataDSL.g:2804:1: ruleJvmLowerBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedRule()); 
@@ -8984,23 +9507,23 @@
 
 
     // $ANTLR start "ruleJvmLowerBoundAnded"
-    // InternalDataDSL.g:2661:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
+    // InternalDataDSL.g:2811:1: ruleJvmLowerBoundAnded : ( ( rule__JvmLowerBoundAnded__Group__0 ) ) ;
     public final void ruleJvmLowerBoundAnded() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2665:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
-            // InternalDataDSL.g:2666:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalDataDSL.g:2815:2: ( ( ( rule__JvmLowerBoundAnded__Group__0 ) ) )
+            // InternalDataDSL.g:2816:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
             {
-            // InternalDataDSL.g:2666:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
-            // InternalDataDSL.g:2667:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalDataDSL.g:2816:2: ( ( rule__JvmLowerBoundAnded__Group__0 ) )
+            // InternalDataDSL.g:2817:3: ( rule__JvmLowerBoundAnded__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2668:3: ( rule__JvmLowerBoundAnded__Group__0 )
-            // InternalDataDSL.g:2668:4: rule__JvmLowerBoundAnded__Group__0
+            // InternalDataDSL.g:2818:3: ( rule__JvmLowerBoundAnded__Group__0 )
+            // InternalDataDSL.g:2818:4: rule__JvmLowerBoundAnded__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__Group__0();
@@ -9035,11 +9558,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // InternalDataDSL.g:2677:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
+    // InternalDataDSL.g:2827:1: entryRuleQualifiedNameWithWildcard : ruleQualifiedNameWithWildcard EOF ;
     public final void entryRuleQualifiedNameWithWildcard() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2678:1: ( ruleQualifiedNameWithWildcard EOF )
-            // InternalDataDSL.g:2679:1: ruleQualifiedNameWithWildcard EOF
+            // InternalDataDSL.g:2828:1: ( ruleQualifiedNameWithWildcard EOF )
+            // InternalDataDSL.g:2829:1: ruleQualifiedNameWithWildcard EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardRule()); 
@@ -9069,23 +9592,23 @@
 
 
     // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // InternalDataDSL.g:2686:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
+    // InternalDataDSL.g:2836:1: ruleQualifiedNameWithWildcard : ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) ;
     public final void ruleQualifiedNameWithWildcard() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2690:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
-            // InternalDataDSL.g:2691:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalDataDSL.g:2840:2: ( ( ( rule__QualifiedNameWithWildcard__Group__0 ) ) )
+            // InternalDataDSL.g:2841:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
             {
-            // InternalDataDSL.g:2691:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
-            // InternalDataDSL.g:2692:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalDataDSL.g:2841:2: ( ( rule__QualifiedNameWithWildcard__Group__0 ) )
+            // InternalDataDSL.g:2842:3: ( rule__QualifiedNameWithWildcard__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2693:3: ( rule__QualifiedNameWithWildcard__Group__0 )
-            // InternalDataDSL.g:2693:4: rule__QualifiedNameWithWildcard__Group__0
+            // InternalDataDSL.g:2843:3: ( rule__QualifiedNameWithWildcard__Group__0 )
+            // InternalDataDSL.g:2843:4: rule__QualifiedNameWithWildcard__Group__0
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameWithWildcard__Group__0();
@@ -9120,11 +9643,11 @@
 
 
     // $ANTLR start "entryRuleValidID"
-    // InternalDataDSL.g:2702:1: entryRuleValidID : ruleValidID EOF ;
+    // InternalDataDSL.g:2852:1: entryRuleValidID : ruleValidID EOF ;
     public final void entryRuleValidID() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2703:1: ( ruleValidID EOF )
-            // InternalDataDSL.g:2704:1: ruleValidID EOF
+            // InternalDataDSL.g:2853:1: ( ruleValidID EOF )
+            // InternalDataDSL.g:2854:1: ruleValidID EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getValidIDRule()); 
@@ -9154,17 +9677,17 @@
 
 
     // $ANTLR start "ruleValidID"
-    // InternalDataDSL.g:2711:1: ruleValidID : ( RULE_ID ) ;
+    // InternalDataDSL.g:2861:1: ruleValidID : ( RULE_ID ) ;
     public final void ruleValidID() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2715:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:2716:2: ( RULE_ID )
+            // InternalDataDSL.g:2865:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:2866:2: ( RULE_ID )
             {
-            // InternalDataDSL.g:2716:2: ( RULE_ID )
-            // InternalDataDSL.g:2717:3: RULE_ID
+            // InternalDataDSL.g:2866:2: ( RULE_ID )
+            // InternalDataDSL.g:2867:3: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getValidIDAccess().getIDTerminalRuleCall()); 
@@ -9195,11 +9718,11 @@
 
 
     // $ANTLR start "entryRuleXImportSection"
-    // InternalDataDSL.g:2727:1: entryRuleXImportSection : ruleXImportSection EOF ;
+    // InternalDataDSL.g:2877:1: entryRuleXImportSection : ruleXImportSection EOF ;
     public final void entryRuleXImportSection() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2728:1: ( ruleXImportSection EOF )
-            // InternalDataDSL.g:2729:1: ruleXImportSection EOF
+            // InternalDataDSL.g:2878:1: ( ruleXImportSection EOF )
+            // InternalDataDSL.g:2879:1: ruleXImportSection EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionRule()); 
@@ -9229,26 +9752,26 @@
 
 
     // $ANTLR start "ruleXImportSection"
-    // InternalDataDSL.g:2736:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
+    // InternalDataDSL.g:2886:1: ruleXImportSection : ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) ;
     public final void ruleXImportSection() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2740:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
-            // InternalDataDSL.g:2741:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            // InternalDataDSL.g:2890:2: ( ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) ) )
+            // InternalDataDSL.g:2891:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
             {
-            // InternalDataDSL.g:2741:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
-            // InternalDataDSL.g:2742:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            // InternalDataDSL.g:2891:2: ( ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* ) )
+            // InternalDataDSL.g:2892:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) ) ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
             {
-            // InternalDataDSL.g:2742:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
-            // InternalDataDSL.g:2743:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            // InternalDataDSL.g:2892:3: ( ( rule__XImportSection__ImportDeclarationsAssignment ) )
+            // InternalDataDSL.g:2893:4: ( rule__XImportSection__ImportDeclarationsAssignment )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
             }
-            // InternalDataDSL.g:2744:4: ( rule__XImportSection__ImportDeclarationsAssignment )
-            // InternalDataDSL.g:2744:5: rule__XImportSection__ImportDeclarationsAssignment
+            // InternalDataDSL.g:2894:4: ( rule__XImportSection__ImportDeclarationsAssignment )
+            // InternalDataDSL.g:2894:5: rule__XImportSection__ImportDeclarationsAssignment
             {
             pushFollow(FOLLOW_3);
             rule__XImportSection__ImportDeclarationsAssignment();
@@ -9264,13 +9787,13 @@
 
             }
 
-            // InternalDataDSL.g:2747:3: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
-            // InternalDataDSL.g:2748:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            // InternalDataDSL.g:2897:3: ( ( rule__XImportSection__ImportDeclarationsAssignment )* )
+            // InternalDataDSL.g:2898:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsAssignment()); 
             }
-            // InternalDataDSL.g:2749:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
+            // InternalDataDSL.g:2899:4: ( rule__XImportSection__ImportDeclarationsAssignment )*
             loop1:
             do {
                 int alt1=2;
@@ -9283,7 +9806,7 @@
 
                 switch (alt1) {
             	case 1 :
-            	    // InternalDataDSL.g:2749:5: rule__XImportSection__ImportDeclarationsAssignment
+            	    // InternalDataDSL.g:2899:5: rule__XImportSection__ImportDeclarationsAssignment
             	    {
             	    pushFollow(FOLLOW_3);
             	    rule__XImportSection__ImportDeclarationsAssignment();
@@ -9327,11 +9850,11 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // InternalDataDSL.g:2759:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
+    // InternalDataDSL.g:2909:1: entryRuleQualifiedNameInStaticImport : ruleQualifiedNameInStaticImport EOF ;
     public final void entryRuleQualifiedNameInStaticImport() throws RecognitionException {
         try {
-            // InternalDataDSL.g:2760:1: ( ruleQualifiedNameInStaticImport EOF )
-            // InternalDataDSL.g:2761:1: ruleQualifiedNameInStaticImport EOF
+            // InternalDataDSL.g:2910:1: ( ruleQualifiedNameInStaticImport EOF )
+            // InternalDataDSL.g:2911:1: ruleQualifiedNameInStaticImport EOF
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportRule()); 
@@ -9361,26 +9884,26 @@
 
 
     // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // InternalDataDSL.g:2768:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
+    // InternalDataDSL.g:2918:1: ruleQualifiedNameInStaticImport : ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) ;
     public final void ruleQualifiedNameInStaticImport() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2772:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
-            // InternalDataDSL.g:2773:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalDataDSL.g:2922:2: ( ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) ) )
+            // InternalDataDSL.g:2923:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
             {
-            // InternalDataDSL.g:2773:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
-            // InternalDataDSL.g:2774:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalDataDSL.g:2923:2: ( ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* ) )
+            // InternalDataDSL.g:2924:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) ) ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
             {
-            // InternalDataDSL.g:2774:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
-            // InternalDataDSL.g:2775:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalDataDSL.g:2924:3: ( ( rule__QualifiedNameInStaticImport__Group__0 ) )
+            // InternalDataDSL.g:2925:4: ( rule__QualifiedNameInStaticImport__Group__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2776:4: ( rule__QualifiedNameInStaticImport__Group__0 )
-            // InternalDataDSL.g:2776:5: rule__QualifiedNameInStaticImport__Group__0
+            // InternalDataDSL.g:2926:4: ( rule__QualifiedNameInStaticImport__Group__0 )
+            // InternalDataDSL.g:2926:5: rule__QualifiedNameInStaticImport__Group__0
             {
             pushFollow(FOLLOW_4);
             rule__QualifiedNameInStaticImport__Group__0();
@@ -9396,13 +9919,13 @@
 
             }
 
-            // InternalDataDSL.g:2779:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
-            // InternalDataDSL.g:2780:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            // InternalDataDSL.g:2929:3: ( ( rule__QualifiedNameInStaticImport__Group__0 )* )
+            // InternalDataDSL.g:2930:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getGroup()); 
             }
-            // InternalDataDSL.g:2781:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
+            // InternalDataDSL.g:2931:4: ( rule__QualifiedNameInStaticImport__Group__0 )*
             loop2:
             do {
                 int alt2=2;
@@ -9421,7 +9944,7 @@
 
                 switch (alt2) {
             	case 1 :
-            	    // InternalDataDSL.g:2781:5: rule__QualifiedNameInStaticImport__Group__0
+            	    // InternalDataDSL.g:2931:5: rule__QualifiedNameInStaticImport__Group__0
             	    {
             	    pushFollow(FOLLOW_4);
             	    rule__QualifiedNameInStaticImport__Group__0();
@@ -9465,23 +9988,23 @@
 
 
     // $ANTLR start "rulePredefinedBlobMimeTypeEnum"
-    // InternalDataDSL.g:2791:1: rulePredefinedBlobMimeTypeEnum : ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) ) ;
+    // InternalDataDSL.g:2941:1: rulePredefinedBlobMimeTypeEnum : ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) ) ;
     public final void rulePredefinedBlobMimeTypeEnum() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2795:1: ( ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) ) )
-            // InternalDataDSL.g:2796:2: ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) )
+            // InternalDataDSL.g:2945:1: ( ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) ) )
+            // InternalDataDSL.g:2946:2: ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) )
             {
-            // InternalDataDSL.g:2796:2: ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) )
-            // InternalDataDSL.g:2797:3: ( rule__PredefinedBlobMimeTypeEnum__Alternatives )
+            // InternalDataDSL.g:2946:2: ( ( rule__PredefinedBlobMimeTypeEnum__Alternatives ) )
+            // InternalDataDSL.g:2947:3: ( rule__PredefinedBlobMimeTypeEnum__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2798:3: ( rule__PredefinedBlobMimeTypeEnum__Alternatives )
-            // InternalDataDSL.g:2798:4: rule__PredefinedBlobMimeTypeEnum__Alternatives
+            // InternalDataDSL.g:2948:3: ( rule__PredefinedBlobMimeTypeEnum__Alternatives )
+            // InternalDataDSL.g:2948:4: rule__PredefinedBlobMimeTypeEnum__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__PredefinedBlobMimeTypeEnum__Alternatives();
@@ -9516,23 +10039,23 @@
 
 
     // $ANTLR start "rulePredefinedBeanEnum"
-    // InternalDataDSL.g:2807:1: rulePredefinedBeanEnum : ( ( rule__PredefinedBeanEnum__Alternatives ) ) ;
+    // InternalDataDSL.g:2957:1: rulePredefinedBeanEnum : ( ( rule__PredefinedBeanEnum__Alternatives ) ) ;
     public final void rulePredefinedBeanEnum() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2811:1: ( ( ( rule__PredefinedBeanEnum__Alternatives ) ) )
-            // InternalDataDSL.g:2812:2: ( ( rule__PredefinedBeanEnum__Alternatives ) )
+            // InternalDataDSL.g:2961:1: ( ( ( rule__PredefinedBeanEnum__Alternatives ) ) )
+            // InternalDataDSL.g:2962:2: ( ( rule__PredefinedBeanEnum__Alternatives ) )
             {
-            // InternalDataDSL.g:2812:2: ( ( rule__PredefinedBeanEnum__Alternatives ) )
-            // InternalDataDSL.g:2813:3: ( rule__PredefinedBeanEnum__Alternatives )
+            // InternalDataDSL.g:2962:2: ( ( rule__PredefinedBeanEnum__Alternatives ) )
+            // InternalDataDSL.g:2963:3: ( rule__PredefinedBeanEnum__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPredefinedBeanEnumAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2814:3: ( rule__PredefinedBeanEnum__Alternatives )
-            // InternalDataDSL.g:2814:4: rule__PredefinedBeanEnum__Alternatives
+            // InternalDataDSL.g:2964:3: ( rule__PredefinedBeanEnum__Alternatives )
+            // InternalDataDSL.g:2964:4: rule__PredefinedBeanEnum__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__PredefinedBeanEnum__Alternatives();
@@ -9567,23 +10090,23 @@
 
 
     // $ANTLR start "rulePredefinedBeanTypeEnum"
-    // InternalDataDSL.g:2823:1: rulePredefinedBeanTypeEnum : ( ( rule__PredefinedBeanTypeEnum__Alternatives ) ) ;
+    // InternalDataDSL.g:2973:1: rulePredefinedBeanTypeEnum : ( ( rule__PredefinedBeanTypeEnum__Alternatives ) ) ;
     public final void rulePredefinedBeanTypeEnum() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2827:1: ( ( ( rule__PredefinedBeanTypeEnum__Alternatives ) ) )
-            // InternalDataDSL.g:2828:2: ( ( rule__PredefinedBeanTypeEnum__Alternatives ) )
+            // InternalDataDSL.g:2977:1: ( ( ( rule__PredefinedBeanTypeEnum__Alternatives ) ) )
+            // InternalDataDSL.g:2978:2: ( ( rule__PredefinedBeanTypeEnum__Alternatives ) )
             {
-            // InternalDataDSL.g:2828:2: ( ( rule__PredefinedBeanTypeEnum__Alternatives ) )
-            // InternalDataDSL.g:2829:3: ( rule__PredefinedBeanTypeEnum__Alternatives )
+            // InternalDataDSL.g:2978:2: ( ( rule__PredefinedBeanTypeEnum__Alternatives ) )
+            // InternalDataDSL.g:2979:3: ( rule__PredefinedBeanTypeEnum__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getPredefinedBeanTypeEnumAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2830:3: ( rule__PredefinedBeanTypeEnum__Alternatives )
-            // InternalDataDSL.g:2830:4: rule__PredefinedBeanTypeEnum__Alternatives
+            // InternalDataDSL.g:2980:3: ( rule__PredefinedBeanTypeEnum__Alternatives )
+            // InternalDataDSL.g:2980:4: rule__PredefinedBeanTypeEnum__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__PredefinedBeanTypeEnum__Alternatives();
@@ -9618,23 +10141,23 @@
 
 
     // $ANTLR start "ruleEntityManagerMode"
-    // InternalDataDSL.g:2839:1: ruleEntityManagerMode : ( ( rule__EntityManagerMode__Alternatives ) ) ;
+    // InternalDataDSL.g:2989:1: ruleEntityManagerMode : ( ( rule__EntityManagerMode__Alternatives ) ) ;
     public final void ruleEntityManagerMode() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2843:1: ( ( ( rule__EntityManagerMode__Alternatives ) ) )
-            // InternalDataDSL.g:2844:2: ( ( rule__EntityManagerMode__Alternatives ) )
+            // InternalDataDSL.g:2993:1: ( ( ( rule__EntityManagerMode__Alternatives ) ) )
+            // InternalDataDSL.g:2994:2: ( ( rule__EntityManagerMode__Alternatives ) )
             {
-            // InternalDataDSL.g:2844:2: ( ( rule__EntityManagerMode__Alternatives ) )
-            // InternalDataDSL.g:2845:3: ( rule__EntityManagerMode__Alternatives )
+            // InternalDataDSL.g:2994:2: ( ( rule__EntityManagerMode__Alternatives ) )
+            // InternalDataDSL.g:2995:3: ( rule__EntityManagerMode__Alternatives )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getEntityManagerModeAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2846:3: ( rule__EntityManagerMode__Alternatives )
-            // InternalDataDSL.g:2846:4: rule__EntityManagerMode__Alternatives
+            // InternalDataDSL.g:2996:3: ( rule__EntityManagerMode__Alternatives )
+            // InternalDataDSL.g:2996:4: rule__EntityManagerMode__Alternatives
             {
             pushFollow(FOLLOW_2);
             rule__EntityManagerMode__Alternatives();
@@ -9668,27 +10191,27 @@
     // $ANTLR end "ruleEntityManagerMode"
 
 
-    // $ANTLR start "ruleConditionAndOperator1"
-    // InternalDataDSL.g:2855:1: ruleConditionAndOperator1 : ( ( rule__ConditionAndOperator1__Alternatives ) ) ;
-    public final void ruleConditionAndOperator1() throws RecognitionException {
+    // $ANTLR start "ruleOperator"
+    // InternalDataDSL.g:3005:1: ruleOperator : ( ( rule__Operator__Alternatives ) ) ;
+    public final void ruleOperator() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2859:1: ( ( ( rule__ConditionAndOperator1__Alternatives ) ) )
-            // InternalDataDSL.g:2860:2: ( ( rule__ConditionAndOperator1__Alternatives ) )
+            // InternalDataDSL.g:3009:1: ( ( ( rule__Operator__Alternatives ) ) )
+            // InternalDataDSL.g:3010:2: ( ( rule__Operator__Alternatives ) )
             {
-            // InternalDataDSL.g:2860:2: ( ( rule__ConditionAndOperator1__Alternatives ) )
-            // InternalDataDSL.g:2861:3: ( rule__ConditionAndOperator1__Alternatives )
+            // InternalDataDSL.g:3010:2: ( ( rule__Operator__Alternatives ) )
+            // InternalDataDSL.g:3011:3: ( rule__Operator__Alternatives )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getConditionAndOperator1Access().getAlternatives()); 
+               before(grammarAccess.getOperatorAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2862:3: ( rule__ConditionAndOperator1__Alternatives )
-            // InternalDataDSL.g:2862:4: rule__ConditionAndOperator1__Alternatives
+            // InternalDataDSL.g:3012:3: ( rule__Operator__Alternatives )
+            // InternalDataDSL.g:3012:4: rule__Operator__Alternatives
             {
             pushFollow(FOLLOW_2);
-            rule__ConditionAndOperator1__Alternatives();
+            rule__Operator__Alternatives();
 
             state._fsp--;
             if (state.failed) return ;
@@ -9696,7 +10219,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getConditionAndOperator1Access().getAlternatives()); 
+               after(grammarAccess.getOperatorAccess().getAlternatives()); 
             }
 
             }
@@ -9716,30 +10239,30 @@
         }
         return ;
     }
-    // $ANTLR end "ruleConditionAndOperator1"
+    // $ANTLR end "ruleOperator"
 
 
-    // $ANTLR start "ruleConditionAndOperator2"
-    // InternalDataDSL.g:2871:1: ruleConditionAndOperator2 : ( ( rule__ConditionAndOperator2__Alternatives ) ) ;
-    public final void ruleConditionAndOperator2() throws RecognitionException {
+    // $ANTLR start "ruleJunction"
+    // InternalDataDSL.g:3021:1: ruleJunction : ( ( rule__Junction__Alternatives ) ) ;
+    public final void ruleJunction() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2875:1: ( ( ( rule__ConditionAndOperator2__Alternatives ) ) )
-            // InternalDataDSL.g:2876:2: ( ( rule__ConditionAndOperator2__Alternatives ) )
+            // InternalDataDSL.g:3025:1: ( ( ( rule__Junction__Alternatives ) ) )
+            // InternalDataDSL.g:3026:2: ( ( rule__Junction__Alternatives ) )
             {
-            // InternalDataDSL.g:2876:2: ( ( rule__ConditionAndOperator2__Alternatives ) )
-            // InternalDataDSL.g:2877:3: ( rule__ConditionAndOperator2__Alternatives )
+            // InternalDataDSL.g:3026:2: ( ( rule__Junction__Alternatives ) )
+            // InternalDataDSL.g:3027:3: ( rule__Junction__Alternatives )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getConditionAndOperator2Access().getAlternatives()); 
+               before(grammarAccess.getJunctionAccess().getAlternatives()); 
             }
-            // InternalDataDSL.g:2878:3: ( rule__ConditionAndOperator2__Alternatives )
-            // InternalDataDSL.g:2878:4: rule__ConditionAndOperator2__Alternatives
+            // InternalDataDSL.g:3028:3: ( rule__Junction__Alternatives )
+            // InternalDataDSL.g:3028:4: rule__Junction__Alternatives
             {
             pushFollow(FOLLOW_2);
-            rule__ConditionAndOperator2__Alternatives();
+            rule__Junction__Alternatives();
 
             state._fsp--;
             if (state.failed) return ;
@@ -9747,7 +10270,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getConditionAndOperator2Access().getAlternatives()); 
+               after(grammarAccess.getJunctionAccess().getAlternatives()); 
             }
 
             }
@@ -9767,18 +10290,18 @@
         }
         return ;
     }
-    // $ANTLR end "ruleConditionAndOperator2"
+    // $ANTLR end "ruleJunction"
 
 
     // $ANTLR start "rule__DataInterchangeFile__Alternatives"
-    // InternalDataDSL.g:2886:1: rule__DataInterchangeFile__Alternatives : ( ( ruleDataInterchangeFileXML ) | ( ruleDataInterchangeFileCSV ) | ( ruleDataInterchangeFileEDI ) );
+    // InternalDataDSL.g:3036:1: rule__DataInterchangeFile__Alternatives : ( ( ruleDataInterchangeFileXML ) | ( ruleDataInterchangeFileCSV ) | ( ruleDataInterchangeFileEDI ) | ( ruleDataInterchangeFileFixed ) );
     public final void rule__DataInterchangeFile__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2890:1: ( ( ruleDataInterchangeFileXML ) | ( ruleDataInterchangeFileCSV ) | ( ruleDataInterchangeFileEDI ) )
-            int alt3=3;
+            // InternalDataDSL.g:3040:1: ( ( ruleDataInterchangeFileXML ) | ( ruleDataInterchangeFileCSV ) | ( ruleDataInterchangeFileEDI ) | ( ruleDataInterchangeFileFixed ) )
+            int alt3=4;
             switch ( input.LA(1) ) {
             case 81:
                 {
@@ -9795,6 +10318,11 @@
                 alt3=3;
                 }
                 break;
+            case 90:
+                {
+                alt3=4;
+                }
+                break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
@@ -9805,10 +10333,10 @@
 
             switch (alt3) {
                 case 1 :
-                    // InternalDataDSL.g:2891:2: ( ruleDataInterchangeFileXML )
+                    // InternalDataDSL.g:3041:2: ( ruleDataInterchangeFileXML )
                     {
-                    // InternalDataDSL.g:2891:2: ( ruleDataInterchangeFileXML )
-                    // InternalDataDSL.g:2892:3: ruleDataInterchangeFileXML
+                    // InternalDataDSL.g:3041:2: ( ruleDataInterchangeFileXML )
+                    // InternalDataDSL.g:3042:3: ruleDataInterchangeFileXML
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileXMLParserRuleCall_0()); 
@@ -9828,10 +10356,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2897:2: ( ruleDataInterchangeFileCSV )
+                    // InternalDataDSL.g:3047:2: ( ruleDataInterchangeFileCSV )
                     {
-                    // InternalDataDSL.g:2897:2: ( ruleDataInterchangeFileCSV )
-                    // InternalDataDSL.g:2898:3: ruleDataInterchangeFileCSV
+                    // InternalDataDSL.g:3047:2: ( ruleDataInterchangeFileCSV )
+                    // InternalDataDSL.g:3048:3: ruleDataInterchangeFileCSV
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileCSVParserRuleCall_1()); 
@@ -9851,10 +10379,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:2903:2: ( ruleDataInterchangeFileEDI )
+                    // InternalDataDSL.g:3053:2: ( ruleDataInterchangeFileEDI )
                     {
-                    // InternalDataDSL.g:2903:2: ( ruleDataInterchangeFileEDI )
-                    // InternalDataDSL.g:2904:3: ruleDataInterchangeFileEDI
+                    // InternalDataDSL.g:3053:2: ( ruleDataInterchangeFileEDI )
+                    // InternalDataDSL.g:3054:3: ruleDataInterchangeFileEDI
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileEDIParserRuleCall_2()); 
@@ -9873,6 +10401,29 @@
 
                     }
                     break;
+                case 4 :
+                    // InternalDataDSL.g:3059:2: ( ruleDataInterchangeFileFixed )
+                    {
+                    // InternalDataDSL.g:3059:2: ( ruleDataInterchangeFileFixed )
+                    // InternalDataDSL.g:3060:3: ruleDataInterchangeFileFixed
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleDataInterchangeFileFixed();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
 
             }
         }
@@ -9891,20 +10442,20 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpression__Alternatives"
-    // InternalDataDSL.g:2913:1: rule__DataInterchangeExpression__Alternatives : ( ( ruleDataInterchangeEntityExpression ) | ( ruleDataInterchangePredefinedExpression ) );
+    // InternalDataDSL.g:3069:1: rule__DataInterchangeExpression__Alternatives : ( ( ruleDataInterchangeEntityExpression ) | ( ruleDataInterchangePredefinedExpression ) );
     public final void rule__DataInterchangeExpression__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2917:1: ( ( ruleDataInterchangeEntityExpression ) | ( ruleDataInterchangePredefinedExpression ) )
+            // InternalDataDSL.g:3073:1: ( ( ruleDataInterchangeEntityExpression ) | ( ruleDataInterchangePredefinedExpression ) )
             int alt4=2;
             int LA4_0 = input.LA(1);
 
-            if ( (LA4_0==108) ) {
+            if ( (LA4_0==111) ) {
                 alt4=1;
             }
-            else if ( (LA4_0==114) ) {
+            else if ( (LA4_0==117) ) {
                 alt4=2;
             }
             else {
@@ -9916,10 +10467,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalDataDSL.g:2918:2: ( ruleDataInterchangeEntityExpression )
+                    // InternalDataDSL.g:3074:2: ( ruleDataInterchangeEntityExpression )
                     {
-                    // InternalDataDSL.g:2918:2: ( ruleDataInterchangeEntityExpression )
-                    // InternalDataDSL.g:2919:3: ruleDataInterchangeEntityExpression
+                    // InternalDataDSL.g:3074:2: ( ruleDataInterchangeEntityExpression )
+                    // InternalDataDSL.g:3075:3: ruleDataInterchangeEntityExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeExpressionAccess().getDataInterchangeEntityExpressionParserRuleCall_0()); 
@@ -9939,10 +10490,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2924:2: ( ruleDataInterchangePredefinedExpression )
+                    // InternalDataDSL.g:3080:2: ( ruleDataInterchangePredefinedExpression )
                     {
-                    // InternalDataDSL.g:2924:2: ( ruleDataInterchangePredefinedExpression )
-                    // InternalDataDSL.g:2925:3: ruleDataInterchangePredefinedExpression
+                    // InternalDataDSL.g:3080:2: ( ruleDataInterchangePredefinedExpression )
+                    // InternalDataDSL.g:3081:3: ruleDataInterchangePredefinedExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeExpressionAccess().getDataInterchangePredefinedExpressionParserRuleCall_1()); 
@@ -9979,20 +10530,20 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Alternatives_3"
-    // InternalDataDSL.g:2934:1: rule__DataInterchangeExpose__Alternatives_3 : ( ( ( rule__DataInterchangeExpose__Group_3_0__0 ) ) | ( ( rule__DataInterchangeExpose__Group_3_1__0 ) ) );
+    // InternalDataDSL.g:3090:1: rule__DataInterchangeExpose__Alternatives_3 : ( ( ( rule__DataInterchangeExpose__Group_3_0__0 ) ) | ( ( rule__DataInterchangeExpose__Group_3_1__0 ) ) );
     public final void rule__DataInterchangeExpose__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2938:1: ( ( ( rule__DataInterchangeExpose__Group_3_0__0 ) ) | ( ( rule__DataInterchangeExpose__Group_3_1__0 ) ) )
+            // InternalDataDSL.g:3094:1: ( ( ( rule__DataInterchangeExpose__Group_3_0__0 ) ) | ( ( rule__DataInterchangeExpose__Group_3_1__0 ) ) )
             int alt5=2;
             int LA5_0 = input.LA(1);
 
-            if ( (LA5_0==102) ) {
+            if ( (LA5_0==115) ) {
                 alt5=1;
             }
-            else if ( (LA5_0==96) ) {
+            else if ( (LA5_0==98) ) {
                 alt5=2;
             }
             else {
@@ -10004,16 +10555,16 @@
             }
             switch (alt5) {
                 case 1 :
-                    // InternalDataDSL.g:2939:2: ( ( rule__DataInterchangeExpose__Group_3_0__0 ) )
+                    // InternalDataDSL.g:3095:2: ( ( rule__DataInterchangeExpose__Group_3_0__0 ) )
                     {
-                    // InternalDataDSL.g:2939:2: ( ( rule__DataInterchangeExpose__Group_3_0__0 ) )
-                    // InternalDataDSL.g:2940:3: ( rule__DataInterchangeExpose__Group_3_0__0 )
+                    // InternalDataDSL.g:3095:2: ( ( rule__DataInterchangeExpose__Group_3_0__0 ) )
+                    // InternalDataDSL.g:3096:3: ( rule__DataInterchangeExpose__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeExposeAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:2941:3: ( rule__DataInterchangeExpose__Group_3_0__0 )
-                    // InternalDataDSL.g:2941:4: rule__DataInterchangeExpose__Group_3_0__0
+                    // InternalDataDSL.g:3097:3: ( rule__DataInterchangeExpose__Group_3_0__0 )
+                    // InternalDataDSL.g:3097:4: rule__DataInterchangeExpose__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeExpose__Group_3_0__0();
@@ -10033,16 +10584,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2945:2: ( ( rule__DataInterchangeExpose__Group_3_1__0 ) )
+                    // InternalDataDSL.g:3101:2: ( ( rule__DataInterchangeExpose__Group_3_1__0 ) )
                     {
-                    // InternalDataDSL.g:2945:2: ( ( rule__DataInterchangeExpose__Group_3_1__0 ) )
-                    // InternalDataDSL.g:2946:3: ( rule__DataInterchangeExpose__Group_3_1__0 )
+                    // InternalDataDSL.g:3101:2: ( ( rule__DataInterchangeExpose__Group_3_1__0 ) )
+                    // InternalDataDSL.g:3102:3: ( rule__DataInterchangeExpose__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeExposeAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:2947:3: ( rule__DataInterchangeExpose__Group_3_1__0 )
-                    // InternalDataDSL.g:2947:4: rule__DataInterchangeExpose__Group_3_1__0
+                    // InternalDataDSL.g:3103:3: ( rule__DataInterchangeExpose__Group_3_1__0 )
+                    // InternalDataDSL.g:3103:4: rule__DataInterchangeExpose__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeExpose__Group_3_1__0();
@@ -10078,21 +10629,21 @@
     // $ANTLR end "rule__DataInterchangeExpose__Alternatives_3"
 
 
-    // $ANTLR start "rule__DataInterchangeMapping__Alternatives"
-    // InternalDataDSL.g:2955:1: rule__DataInterchangeMapping__Alternatives : ( ( ruleDataInterchangeValueMapping ) | ( ruleDataInterchangeBlobMapping ) );
-    public final void rule__DataInterchangeMapping__Alternatives() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperand__Alternatives"
+    // InternalDataDSL.g:3111:1: rule__DataInterchangeLookupFilterOperand__Alternatives : ( ( ruleDataInterchangeLookupFilterOperandString ) | ( ruleDataInterchangeLookupFilterOperandProperty ) );
+    public final void rule__DataInterchangeLookupFilterOperand__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2959:1: ( ( ruleDataInterchangeValueMapping ) | ( ruleDataInterchangeBlobMapping ) )
+            // InternalDataDSL.g:3115:1: ( ( ruleDataInterchangeLookupFilterOperandString ) | ( ruleDataInterchangeLookupFilterOperandProperty ) )
             int alt6=2;
             int LA6_0 = input.LA(1);
 
-            if ( (LA6_0==116) ) {
+            if ( (LA6_0==RULE_STRING) ) {
                 alt6=1;
             }
-            else if ( (LA6_0==118) ) {
+            else if ( (LA6_0==RULE_ID) ) {
                 alt6=2;
             }
             else {
@@ -10104,10 +10655,107 @@
             }
             switch (alt6) {
                 case 1 :
-                    // InternalDataDSL.g:2960:2: ( ruleDataInterchangeValueMapping )
+                    // InternalDataDSL.g:3116:2: ( ruleDataInterchangeLookupFilterOperandString )
                     {
-                    // InternalDataDSL.g:2960:2: ( ruleDataInterchangeValueMapping )
-                    // InternalDataDSL.g:2961:3: ruleDataInterchangeValueMapping
+                    // InternalDataDSL.g:3116:2: ( ruleDataInterchangeLookupFilterOperandString )
+                    // InternalDataDSL.g:3117:3: ruleDataInterchangeLookupFilterOperandString
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleDataInterchangeLookupFilterOperandString();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:3122:2: ( ruleDataInterchangeLookupFilterOperandProperty )
+                    {
+                    // InternalDataDSL.g:3122:2: ( ruleDataInterchangeLookupFilterOperandProperty )
+                    // InternalDataDSL.g:3123:3: ruleDataInterchangeLookupFilterOperandProperty
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleDataInterchangeLookupFilterOperandProperty();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperand__Alternatives"
+
+
+    // $ANTLR start "rule__DataInterchangeMapping__Alternatives"
+    // InternalDataDSL.g:3132:1: rule__DataInterchangeMapping__Alternatives : ( ( ruleDataInterchangeValueMapping ) | ( ruleDataInterchangeBlobMapping ) | ( ruleDataInterchangeFixedColumnMapping ) );
+    public final void rule__DataInterchangeMapping__Alternatives() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:3136:1: ( ( ruleDataInterchangeValueMapping ) | ( ruleDataInterchangeBlobMapping ) | ( ruleDataInterchangeFixedColumnMapping ) )
+            int alt7=3;
+            switch ( input.LA(1) ) {
+            case 120:
+                {
+                alt7=1;
+                }
+                break;
+            case 122:
+                {
+                alt7=2;
+                }
+                break;
+            case 124:
+                {
+                alt7=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 7, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt7) {
+                case 1 :
+                    // InternalDataDSL.g:3137:2: ( ruleDataInterchangeValueMapping )
+                    {
+                    // InternalDataDSL.g:3137:2: ( ruleDataInterchangeValueMapping )
+                    // InternalDataDSL.g:3138:3: ruleDataInterchangeValueMapping
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeValueMappingParserRuleCall_0()); 
@@ -10127,10 +10775,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2966:2: ( ruleDataInterchangeBlobMapping )
+                    // InternalDataDSL.g:3143:2: ( ruleDataInterchangeBlobMapping )
                     {
-                    // InternalDataDSL.g:2966:2: ( ruleDataInterchangeBlobMapping )
-                    // InternalDataDSL.g:2967:3: ruleDataInterchangeBlobMapping
+                    // InternalDataDSL.g:3143:2: ( ruleDataInterchangeBlobMapping )
+                    // InternalDataDSL.g:3144:3: ruleDataInterchangeBlobMapping
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeBlobMappingParserRuleCall_1()); 
@@ -10149,6 +10797,29 @@
 
                     }
                     break;
+                case 3 :
+                    // InternalDataDSL.g:3149:2: ( ruleDataInterchangeFixedColumnMapping )
+                    {
+                    // InternalDataDSL.g:3149:2: ( ruleDataInterchangeFixedColumnMapping )
+                    // InternalDataDSL.g:3150:3: ruleDataInterchangeFixedColumnMapping
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2()); 
+                    }
+                    pushFollow(FOLLOW_2);
+                    ruleDataInterchangeFixedColumnMapping();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
 
             }
         }
@@ -10166,28 +10837,372 @@
     // $ANTLR end "rule__DataInterchangeMapping__Alternatives"
 
 
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Alternatives_5_0"
+    // InternalDataDSL.g:3159:1: rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 : ( ( ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 ) ) );
+    public final void rule__DataInterchangeFixedColumnMapping__Alternatives_5_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:3163:1: ( ( ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 ) ) )
+            int alt8=3;
+            switch ( input.LA(1) ) {
+            case 166:
+                {
+                alt8=1;
+                }
+                break;
+            case 167:
+                {
+                alt8=2;
+                }
+                break;
+            case 168:
+                {
+                alt8=3;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 8, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt8) {
+                case 1 :
+                    // InternalDataDSL.g:3164:2: ( ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 ) )
+                    {
+                    // InternalDataDSL.g:3164:2: ( ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 ) )
+                    // InternalDataDSL.g:3165:3: ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimAssignment_5_0_0()); 
+                    }
+                    // InternalDataDSL.g:3166:3: ( rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 )
+                    // InternalDataDSL.g:3166:4: rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimAssignment_5_0_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:3170:2: ( ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 ) )
+                    {
+                    // InternalDataDSL.g:3170:2: ( ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 ) )
+                    // InternalDataDSL.g:3171:3: ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimAssignment_5_0_1()); 
+                    }
+                    // InternalDataDSL.g:3172:3: ( rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 )
+                    // InternalDataDSL.g:3172:4: rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimAssignment_5_0_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalDataDSL.g:3176:2: ( ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 ) )
+                    {
+                    // InternalDataDSL.g:3176:2: ( ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 ) )
+                    // InternalDataDSL.g:3177:3: ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimAssignment_5_0_2()); 
+                    }
+                    // InternalDataDSL.g:3178:3: ( rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 )
+                    // InternalDataDSL.g:3178:4: rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimAssignment_5_0_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Alternatives_5_0"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Alternatives_5_1"
+    // InternalDataDSL.g:3186:1: rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 : ( ( ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 ) ) );
+    public final void rule__DataInterchangeFixedColumnMapping__Alternatives_5_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:3190:1: ( ( ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 ) ) | ( ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 ) ) )
+            int alt9=5;
+            switch ( input.LA(1) ) {
+            case 169:
+                {
+                alt9=1;
+                }
+                break;
+            case 170:
+                {
+                alt9=2;
+                }
+                break;
+            case 171:
+                {
+                alt9=3;
+                }
+                break;
+            case 172:
+                {
+                alt9=4;
+                }
+                break;
+            case 173:
+                {
+                alt9=5;
+                }
+                break;
+            default:
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 9, 0, input);
+
+                throw nvae;
+            }
+
+            switch (alt9) {
+                case 1 :
+                    // InternalDataDSL.g:3191:2: ( ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 ) )
+                    {
+                    // InternalDataDSL.g:3191:2: ( ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 ) )
+                    // InternalDataDSL.g:3192:3: ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseAssignment_5_1_0()); 
+                    }
+                    // InternalDataDSL.g:3193:3: ( rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 )
+                    // InternalDataDSL.g:3193:4: rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseAssignment_5_1_0()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:3197:2: ( ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 ) )
+                    {
+                    // InternalDataDSL.g:3197:2: ( ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 ) )
+                    // InternalDataDSL.g:3198:3: ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseAssignment_5_1_1()); 
+                    }
+                    // InternalDataDSL.g:3199:3: ( rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 )
+                    // InternalDataDSL.g:3199:4: rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseAssignment_5_1_1()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 3 :
+                    // InternalDataDSL.g:3203:2: ( ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 ) )
+                    {
+                    // InternalDataDSL.g:3203:2: ( ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 ) )
+                    // InternalDataDSL.g:3204:3: ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstAssignment_5_1_2()); 
+                    }
+                    // InternalDataDSL.g:3205:3: ( rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 )
+                    // InternalDataDSL.g:3205:4: rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstAssignment_5_1_2()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 4 :
+                    // InternalDataDSL.g:3209:2: ( ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 ) )
+                    {
+                    // InternalDataDSL.g:3209:2: ( ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 ) )
+                    // InternalDataDSL.g:3210:3: ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstAssignment_5_1_3()); 
+                    }
+                    // InternalDataDSL.g:3211:3: ( rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 )
+                    // InternalDataDSL.g:3211:4: rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstAssignment_5_1_3()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+                case 5 :
+                    // InternalDataDSL.g:3215:2: ( ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 ) )
+                    {
+                    // InternalDataDSL.g:3215:2: ( ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 ) )
+                    // InternalDataDSL.g:3216:3: ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeAssignment_5_1_4()); 
+                    }
+                    // InternalDataDSL.g:3217:3: ( rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 )
+                    // InternalDataDSL.g:3217:4: rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeAssignment_5_1_4()); 
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Alternatives_5_1"
+
+
     // $ANTLR start "rule__XImportDeclaration__Alternatives_2"
-    // InternalDataDSL.g:2976:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );
+    // InternalDataDSL.g:3225:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );
     public final void rule__XImportDeclaration__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:2980:1: ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) )
-            int alt7=4;
-            alt7 = dfa7.predict(input);
-            switch (alt7) {
+            // InternalDataDSL.g:3229:1: ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) )
+            int alt10=4;
+            alt10 = dfa10.predict(input);
+            switch (alt10) {
                 case 1 :
-                    // InternalDataDSL.g:2981:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    // InternalDataDSL.g:3230:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
                     {
-                    // InternalDataDSL.g:2981:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
-                    // InternalDataDSL.g:2982:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    // InternalDataDSL.g:3230:2: ( ( rule__XImportDeclaration__Group_2_0__0 ) )
+                    // InternalDataDSL.g:3231:3: ( rule__XImportDeclaration__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getGroup_2_0()); 
                     }
-                    // InternalDataDSL.g:2983:3: ( rule__XImportDeclaration__Group_2_0__0 )
-                    // InternalDataDSL.g:2983:4: rule__XImportDeclaration__Group_2_0__0
+                    // InternalDataDSL.g:3232:3: ( rule__XImportDeclaration__Group_2_0__0 )
+                    // InternalDataDSL.g:3232:4: rule__XImportDeclaration__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__Group_2_0__0();
@@ -10207,16 +11222,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2987:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    // InternalDataDSL.g:3236:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
                     {
-                    // InternalDataDSL.g:2987:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
-                    // InternalDataDSL.g:2988:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    // InternalDataDSL.g:3236:2: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) )
+                    // InternalDataDSL.g:3237:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_1()); 
                     }
-                    // InternalDataDSL.g:2989:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
-                    // InternalDataDSL.g:2989:4: rule__XImportDeclaration__ImportedTypeAssignment_2_1
+                    // InternalDataDSL.g:3238:3: ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 )
+                    // InternalDataDSL.g:3238:4: rule__XImportDeclaration__ImportedTypeAssignment_2_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ImportedTypeAssignment_2_1();
@@ -10236,16 +11251,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:2993:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    // InternalDataDSL.g:3242:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
                     {
-                    // InternalDataDSL.g:2993:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
-                    // InternalDataDSL.g:2994:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    // InternalDataDSL.g:3242:2: ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) )
+                    // InternalDataDSL.g:3243:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceAssignment_2_2()); 
                     }
-                    // InternalDataDSL.g:2995:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
-                    // InternalDataDSL.g:2995:4: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
+                    // InternalDataDSL.g:3244:3: ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 )
+                    // InternalDataDSL.g:3244:4: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ImportedNamespaceAssignment_2_2();
@@ -10265,16 +11280,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:2999:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    // InternalDataDSL.g:3248:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
                     {
-                    // InternalDataDSL.g:2999:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
-                    // InternalDataDSL.g:3000:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    // InternalDataDSL.g:3248:2: ( ( rule__XImportDeclaration__Group_2_3__0 ) )
+                    // InternalDataDSL.g:3249:3: ( rule__XImportDeclaration__Group_2_3__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getGroup_2_3()); 
                     }
-                    // InternalDataDSL.g:3001:3: ( rule__XImportDeclaration__Group_2_3__0 )
-                    // InternalDataDSL.g:3001:4: rule__XImportDeclaration__Group_2_3__0
+                    // InternalDataDSL.g:3250:3: ( rule__XImportDeclaration__Group_2_3__0 )
+                    // InternalDataDSL.g:3250:4: rule__XImportDeclaration__Group_2_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__Group_2_3__0();
@@ -10311,41 +11326,41 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Alternatives_2_0_3"
-    // InternalDataDSL.g:3009:1: rule__XImportDeclaration__Alternatives_2_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) );
+    // InternalDataDSL.g:3258:1: rule__XImportDeclaration__Alternatives_2_0_3 : ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) );
     public final void rule__XImportDeclaration__Alternatives_2_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3013:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) )
-            int alt8=2;
-            int LA8_0 = input.LA(1);
+            // InternalDataDSL.g:3262:1: ( ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) ) | ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) ) )
+            int alt11=2;
+            int LA11_0 = input.LA(1);
 
-            if ( (LA8_0==36) ) {
-                alt8=1;
+            if ( (LA11_0==36) ) {
+                alt11=1;
             }
-            else if ( (LA8_0==RULE_ID) ) {
-                alt8=2;
+            else if ( (LA11_0==RULE_ID) ) {
+                alt11=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 8, 0, input);
+                    new NoViableAltException("", 11, 0, input);
 
                 throw nvae;
             }
-            switch (alt8) {
+            switch (alt11) {
                 case 1 :
-                    // InternalDataDSL.g:3014:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    // InternalDataDSL.g:3263:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
                     {
-                    // InternalDataDSL.g:3014:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
-                    // InternalDataDSL.g:3015:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    // InternalDataDSL.g:3263:2: ( ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 ) )
+                    // InternalDataDSL.g:3264:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getWildcardAssignment_2_0_3_0()); 
                     }
-                    // InternalDataDSL.g:3016:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
-                    // InternalDataDSL.g:3016:4: rule__XImportDeclaration__WildcardAssignment_2_0_3_0
+                    // InternalDataDSL.g:3265:3: ( rule__XImportDeclaration__WildcardAssignment_2_0_3_0 )
+                    // InternalDataDSL.g:3265:4: rule__XImportDeclaration__WildcardAssignment_2_0_3_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__WildcardAssignment_2_0_3_0();
@@ -10365,16 +11380,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3020:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    // InternalDataDSL.g:3269:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
                     {
-                    // InternalDataDSL.g:3020:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
-                    // InternalDataDSL.g:3021:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    // InternalDataDSL.g:3269:2: ( ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 ) )
+                    // InternalDataDSL.g:3270:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXImportDeclarationAccess().getMemberNameAssignment_2_0_3_1()); 
                     }
-                    // InternalDataDSL.g:3022:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
-                    // InternalDataDSL.g:3022:4: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
+                    // InternalDataDSL.g:3271:3: ( rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 )
+                    // InternalDataDSL.g:3271:4: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__MemberNameAssignment_2_0_3_1();
@@ -10411,27 +11426,27 @@
 
 
     // $ANTLR start "rule__XAnnotation__Alternatives_3_1"
-    // InternalDataDSL.g:3030:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
+    // InternalDataDSL.g:3279:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );
     public final void rule__XAnnotation__Alternatives_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3034:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
-            int alt9=2;
-            alt9 = dfa9.predict(input);
-            switch (alt9) {
+            // InternalDataDSL.g:3283:1: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) )
+            int alt12=2;
+            alt12 = dfa12.predict(input);
+            switch (alt12) {
                 case 1 :
-                    // InternalDataDSL.g:3035:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    // InternalDataDSL.g:3284:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
                     {
-                    // InternalDataDSL.g:3035:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-                    // InternalDataDSL.g:3036:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    // InternalDataDSL.g:3284:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+                    // InternalDataDSL.g:3285:3: ( rule__XAnnotation__Group_3_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
                     }
-                    // InternalDataDSL.g:3037:3: ( rule__XAnnotation__Group_3_1_0__0 )
-                    // InternalDataDSL.g:3037:4: rule__XAnnotation__Group_3_1_0__0
+                    // InternalDataDSL.g:3286:3: ( rule__XAnnotation__Group_3_1_0__0 )
+                    // InternalDataDSL.g:3286:4: rule__XAnnotation__Group_3_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Group_3_1_0__0();
@@ -10451,16 +11466,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3041:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    // InternalDataDSL.g:3290:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
                     {
-                    // InternalDataDSL.g:3041:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
-                    // InternalDataDSL.g:3042:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    // InternalDataDSL.g:3290:2: ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) )
+                    // InternalDataDSL.g:3291:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationAccess().getValueAssignment_3_1_1()); 
                     }
-                    // InternalDataDSL.g:3043:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
-                    // InternalDataDSL.g:3043:4: rule__XAnnotation__ValueAssignment_3_1_1
+                    // InternalDataDSL.g:3292:3: ( rule__XAnnotation__ValueAssignment_3_1_1 )
+                    // InternalDataDSL.g:3292:4: rule__XAnnotation__ValueAssignment_3_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__ValueAssignment_3_1_1();
@@ -10497,27 +11512,27 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Alternatives"
-    // InternalDataDSL.g:3051:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
+    // InternalDataDSL.g:3300:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );
     public final void rule__XAnnotationElementValueOrCommaList__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3055:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
-            int alt10=2;
-            alt10 = dfa10.predict(input);
-            switch (alt10) {
+            // InternalDataDSL.g:3304:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) )
+            int alt13=2;
+            alt13 = dfa13.predict(input);
+            switch (alt13) {
                 case 1 :
-                    // InternalDataDSL.g:3056:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    // InternalDataDSL.g:3305:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
                     {
-                    // InternalDataDSL.g:3056:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-                    // InternalDataDSL.g:3057:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    // InternalDataDSL.g:3305:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+                    // InternalDataDSL.g:3306:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
                     }
-                    // InternalDataDSL.g:3058:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-                    // InternalDataDSL.g:3058:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+                    // InternalDataDSL.g:3307:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+                    // InternalDataDSL.g:3307:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_0__0();
@@ -10537,16 +11552,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3062:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    // InternalDataDSL.g:3311:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
                     {
-                    // InternalDataDSL.g:3062:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
-                    // InternalDataDSL.g:3063:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    // InternalDataDSL.g:3311:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) )
+                    // InternalDataDSL.g:3312:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1()); 
                     }
-                    // InternalDataDSL.g:3064:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
-                    // InternalDataDSL.g:3064:4: rule__XAnnotationElementValueOrCommaList__Group_1__0
+                    // InternalDataDSL.g:3313:3: ( rule__XAnnotationElementValueOrCommaList__Group_1__0 )
+                    // InternalDataDSL.g:3313:4: rule__XAnnotationElementValueOrCommaList__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_1__0();
@@ -10583,27 +11598,27 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Alternatives"
-    // InternalDataDSL.g:3072:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
+    // InternalDataDSL.g:3321:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );
     public final void rule__XAnnotationElementValue__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3076:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
-            int alt11=2;
-            alt11 = dfa11.predict(input);
-            switch (alt11) {
+            // InternalDataDSL.g:3325:1: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) )
+            int alt14=2;
+            alt14 = dfa14.predict(input);
+            switch (alt14) {
                 case 1 :
-                    // InternalDataDSL.g:3077:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    // InternalDataDSL.g:3326:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
                     {
-                    // InternalDataDSL.g:3077:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-                    // InternalDataDSL.g:3078:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    // InternalDataDSL.g:3326:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+                    // InternalDataDSL.g:3327:3: ( rule__XAnnotationElementValue__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
                     }
-                    // InternalDataDSL.g:3079:3: ( rule__XAnnotationElementValue__Group_0__0 )
-                    // InternalDataDSL.g:3079:4: rule__XAnnotationElementValue__Group_0__0
+                    // InternalDataDSL.g:3328:3: ( rule__XAnnotationElementValue__Group_0__0 )
+                    // InternalDataDSL.g:3328:4: rule__XAnnotationElementValue__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValue__Group_0__0();
@@ -10623,10 +11638,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3083:2: ( ruleXAnnotationOrExpression )
+                    // InternalDataDSL.g:3332:2: ( ruleXAnnotationOrExpression )
                     {
-                    // InternalDataDSL.g:3083:2: ( ruleXAnnotationOrExpression )
-                    // InternalDataDSL.g:3084:3: ruleXAnnotationOrExpression
+                    // InternalDataDSL.g:3332:2: ( ruleXAnnotationOrExpression )
+                    // InternalDataDSL.g:3333:3: ruleXAnnotationOrExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationElementValueAccess().getXAnnotationOrExpressionParserRuleCall_1()); 
@@ -10663,35 +11678,35 @@
 
 
     // $ANTLR start "rule__XAnnotationOrExpression__Alternatives"
-    // InternalDataDSL.g:3093:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
+    // InternalDataDSL.g:3342:1: rule__XAnnotationOrExpression__Alternatives : ( ( ruleXAnnotation ) | ( ruleXExpression ) );
     public final void rule__XAnnotationOrExpression__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3097:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
-            int alt12=2;
-            int LA12_0 = input.LA(1);
+            // InternalDataDSL.g:3346:1: ( ( ruleXAnnotation ) | ( ruleXExpression ) )
+            int alt15=2;
+            int LA15_0 = input.LA(1);
 
-            if ( (LA12_0==121) ) {
-                alt12=1;
+            if ( (LA15_0==127) ) {
+                alt15=1;
             }
-            else if ( ((LA12_0>=RULE_STRING && LA12_0<=RULE_DECIMAL)||LA12_0==27||(LA12_0>=34 && LA12_0<=35)||LA12_0==40||(LA12_0>=45 && LA12_0<=50)||LA12_0==74||LA12_0==101||LA12_0==122||(LA12_0>=126 && LA12_0<=127)||LA12_0==129||LA12_0==131||(LA12_0>=135 && LA12_0<=142)||LA12_0==144||LA12_0==166) ) {
-                alt12=2;
+            else if ( ((LA15_0>=RULE_STRING && LA15_0<=RULE_DECIMAL)||LA15_0==27||(LA15_0>=34 && LA15_0<=35)||LA15_0==40||(LA15_0>=45 && LA15_0<=50)||LA15_0==74||LA15_0==103||LA15_0==128||(LA15_0>=132 && LA15_0<=133)||LA15_0==135||LA15_0==137||(LA15_0>=141 && LA15_0<=148)||LA15_0==150||LA15_0==179) ) {
+                alt15=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 12, 0, input);
+                    new NoViableAltException("", 15, 0, input);
 
                 throw nvae;
             }
-            switch (alt12) {
+            switch (alt15) {
                 case 1 :
-                    // InternalDataDSL.g:3098:2: ( ruleXAnnotation )
+                    // InternalDataDSL.g:3347:2: ( ruleXAnnotation )
                     {
-                    // InternalDataDSL.g:3098:2: ( ruleXAnnotation )
-                    // InternalDataDSL.g:3099:3: ruleXAnnotation
+                    // InternalDataDSL.g:3347:2: ( ruleXAnnotation )
+                    // InternalDataDSL.g:3348:3: ruleXAnnotation
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationOrExpressionAccess().getXAnnotationParserRuleCall_0()); 
@@ -10711,10 +11726,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3104:2: ( ruleXExpression )
+                    // InternalDataDSL.g:3353:2: ( ruleXExpression )
                     {
-                    // InternalDataDSL.g:3104:2: ( ruleXExpression )
-                    // InternalDataDSL.g:3105:3: ruleXExpression
+                    // InternalDataDSL.g:3353:2: ( ruleXExpression )
+                    // InternalDataDSL.g:3354:3: ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAnnotationOrExpressionAccess().getXExpressionParserRuleCall_1()); 
@@ -10751,29 +11766,29 @@
 
 
     // $ANTLR start "rule__XAssignment__Alternatives"
-    // InternalDataDSL.g:3114:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
+    // InternalDataDSL.g:3363:1: rule__XAssignment__Alternatives : ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) );
     public final void rule__XAssignment__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3118:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
-            int alt13=2;
+            // InternalDataDSL.g:3367:1: ( ( ( rule__XAssignment__Group_0__0 ) ) | ( ( rule__XAssignment__Group_1__0 ) ) )
+            int alt16=2;
             switch ( input.LA(1) ) {
             case RULE_ID:
                 {
-                int LA13_1 = input.LA(2);
+                int LA16_1 = input.LA(2);
 
-                if ( (LA13_1==13) ) {
-                    alt13=1;
+                if ( (LA16_1==EOF||(LA16_1>=RULE_STRING && LA16_1<=RULE_DECIMAL)||(LA16_1>=14 && LA16_1<=50)||(LA16_1>=74 && LA16_1<=75)||LA16_1==103||LA16_1==119||LA16_1==126||(LA16_1>=128 && LA16_1<=151)||(LA16_1>=175 && LA16_1<=176)||(LA16_1>=178 && LA16_1<=179)) ) {
+                    alt16=2;
                 }
-                else if ( (LA13_1==EOF||(LA13_1>=RULE_STRING && LA13_1<=RULE_DECIMAL)||(LA13_1>=14 && LA13_1<=50)||(LA13_1>=74 && LA13_1<=75)||LA13_1==101||LA13_1==115||LA13_1==120||(LA13_1>=122 && LA13_1<=145)||(LA13_1>=162 && LA13_1<=163)||(LA13_1>=165 && LA13_1<=166)) ) {
-                    alt13=2;
+                else if ( (LA16_1==13) ) {
+                    alt16=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 13, 1, input);
+                        new NoViableAltException("", 16, 1, input);
 
                     throw nvae;
                 }
@@ -10781,18 +11796,18 @@
                 break;
             case 45:
                 {
-                int LA13_2 = input.LA(2);
+                int LA16_2 = input.LA(2);
 
-                if ( (LA13_2==13) ) {
-                    alt13=1;
+                if ( (LA16_2==EOF||(LA16_2>=RULE_STRING && LA16_2<=RULE_DECIMAL)||(LA16_2>=14 && LA16_2<=50)||(LA16_2>=74 && LA16_2<=75)||LA16_2==103||LA16_2==119||LA16_2==126||(LA16_2>=128 && LA16_2<=151)||(LA16_2>=175 && LA16_2<=176)||(LA16_2>=178 && LA16_2<=179)) ) {
+                    alt16=2;
                 }
-                else if ( (LA13_2==EOF||(LA13_2>=RULE_STRING && LA13_2<=RULE_DECIMAL)||(LA13_2>=14 && LA13_2<=50)||(LA13_2>=74 && LA13_2<=75)||LA13_2==101||LA13_2==115||LA13_2==120||(LA13_2>=122 && LA13_2<=145)||(LA13_2>=162 && LA13_2<=163)||(LA13_2>=165 && LA13_2<=166)) ) {
-                    alt13=2;
+                else if ( (LA16_2==13) ) {
+                    alt16=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 13, 2, input);
+                        new NoViableAltException("", 16, 2, input);
 
                     throw nvae;
                 }
@@ -10800,18 +11815,18 @@
                 break;
             case 46:
                 {
-                int LA13_3 = input.LA(2);
+                int LA16_3 = input.LA(2);
 
-                if ( (LA13_3==EOF||(LA13_3>=RULE_STRING && LA13_3<=RULE_DECIMAL)||(LA13_3>=14 && LA13_3<=50)||(LA13_3>=74 && LA13_3<=75)||LA13_3==101||LA13_3==115||LA13_3==120||(LA13_3>=122 && LA13_3<=145)||(LA13_3>=162 && LA13_3<=163)||(LA13_3>=165 && LA13_3<=166)) ) {
-                    alt13=2;
+                if ( (LA16_3==EOF||(LA16_3>=RULE_STRING && LA16_3<=RULE_DECIMAL)||(LA16_3>=14 && LA16_3<=50)||(LA16_3>=74 && LA16_3<=75)||LA16_3==103||LA16_3==119||LA16_3==126||(LA16_3>=128 && LA16_3<=151)||(LA16_3>=175 && LA16_3<=176)||(LA16_3>=178 && LA16_3<=179)) ) {
+                    alt16=2;
                 }
-                else if ( (LA13_3==13) ) {
-                    alt13=1;
+                else if ( (LA16_3==13) ) {
+                    alt16=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 13, 3, input);
+                        new NoViableAltException("", 16, 3, input);
 
                     throw nvae;
                 }
@@ -10819,18 +11834,18 @@
                 break;
             case 47:
                 {
-                int LA13_4 = input.LA(2);
+                int LA16_4 = input.LA(2);
 
-                if ( (LA13_4==13) ) {
-                    alt13=1;
+                if ( (LA16_4==EOF||(LA16_4>=RULE_STRING && LA16_4<=RULE_DECIMAL)||(LA16_4>=14 && LA16_4<=50)||(LA16_4>=74 && LA16_4<=75)||LA16_4==103||LA16_4==119||LA16_4==126||(LA16_4>=128 && LA16_4<=151)||(LA16_4>=175 && LA16_4<=176)||(LA16_4>=178 && LA16_4<=179)) ) {
+                    alt16=2;
                 }
-                else if ( (LA13_4==EOF||(LA13_4>=RULE_STRING && LA13_4<=RULE_DECIMAL)||(LA13_4>=14 && LA13_4<=50)||(LA13_4>=74 && LA13_4<=75)||LA13_4==101||LA13_4==115||LA13_4==120||(LA13_4>=122 && LA13_4<=145)||(LA13_4>=162 && LA13_4<=163)||(LA13_4>=165 && LA13_4<=166)) ) {
-                    alt13=2;
+                else if ( (LA16_4==13) ) {
+                    alt16=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 13, 4, input);
+                        new NoViableAltException("", 16, 4, input);
 
                     throw nvae;
                 }
@@ -10838,18 +11853,18 @@
                 break;
             case 48:
                 {
-                int LA13_5 = input.LA(2);
+                int LA16_5 = input.LA(2);
 
-                if ( (LA13_5==EOF||(LA13_5>=RULE_STRING && LA13_5<=RULE_DECIMAL)||(LA13_5>=14 && LA13_5<=50)||(LA13_5>=74 && LA13_5<=75)||LA13_5==101||LA13_5==115||LA13_5==120||(LA13_5>=122 && LA13_5<=145)||(LA13_5>=162 && LA13_5<=163)||(LA13_5>=165 && LA13_5<=166)) ) {
-                    alt13=2;
+                if ( (LA16_5==EOF||(LA16_5>=RULE_STRING && LA16_5<=RULE_DECIMAL)||(LA16_5>=14 && LA16_5<=50)||(LA16_5>=74 && LA16_5<=75)||LA16_5==103||LA16_5==119||LA16_5==126||(LA16_5>=128 && LA16_5<=151)||(LA16_5>=175 && LA16_5<=176)||(LA16_5>=178 && LA16_5<=179)) ) {
+                    alt16=2;
                 }
-                else if ( (LA13_5==13) ) {
-                    alt13=1;
+                else if ( (LA16_5==13) ) {
+                    alt16=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 13, 5, input);
+                        new NoViableAltException("", 16, 5, input);
 
                     throw nvae;
                 }
@@ -10866,46 +11881,46 @@
             case 49:
             case 50:
             case 74:
-            case 101:
-            case 122:
-            case 126:
-            case 127:
-            case 129:
-            case 131:
+            case 103:
+            case 128:
+            case 132:
+            case 133:
             case 135:
-            case 136:
             case 137:
-            case 138:
-            case 139:
-            case 140:
             case 141:
             case 142:
+            case 143:
             case 144:
-            case 166:
+            case 145:
+            case 146:
+            case 147:
+            case 148:
+            case 150:
+            case 179:
                 {
-                alt13=2;
+                alt16=2;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 13, 0, input);
+                    new NoViableAltException("", 16, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt13) {
+            switch (alt16) {
                 case 1 :
-                    // InternalDataDSL.g:3119:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    // InternalDataDSL.g:3368:2: ( ( rule__XAssignment__Group_0__0 ) )
                     {
-                    // InternalDataDSL.g:3119:2: ( ( rule__XAssignment__Group_0__0 ) )
-                    // InternalDataDSL.g:3120:3: ( rule__XAssignment__Group_0__0 )
+                    // InternalDataDSL.g:3368:2: ( ( rule__XAssignment__Group_0__0 ) )
+                    // InternalDataDSL.g:3369:3: ( rule__XAssignment__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAssignmentAccess().getGroup_0()); 
                     }
-                    // InternalDataDSL.g:3121:3: ( rule__XAssignment__Group_0__0 )
-                    // InternalDataDSL.g:3121:4: rule__XAssignment__Group_0__0
+                    // InternalDataDSL.g:3370:3: ( rule__XAssignment__Group_0__0 )
+                    // InternalDataDSL.g:3370:4: rule__XAssignment__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_0__0();
@@ -10925,16 +11940,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3125:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    // InternalDataDSL.g:3374:2: ( ( rule__XAssignment__Group_1__0 ) )
                     {
-                    // InternalDataDSL.g:3125:2: ( ( rule__XAssignment__Group_1__0 ) )
-                    // InternalDataDSL.g:3126:3: ( rule__XAssignment__Group_1__0 )
+                    // InternalDataDSL.g:3374:2: ( ( rule__XAssignment__Group_1__0 ) )
+                    // InternalDataDSL.g:3375:3: ( rule__XAssignment__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXAssignmentAccess().getGroup_1()); 
                     }
-                    // InternalDataDSL.g:3127:3: ( rule__XAssignment__Group_1__0 )
-                    // InternalDataDSL.g:3127:4: rule__XAssignment__Group_1__0
+                    // InternalDataDSL.g:3376:3: ( rule__XAssignment__Group_1__0 )
+                    // InternalDataDSL.g:3376:4: rule__XAssignment__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_1__0();
@@ -10971,64 +11986,64 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Alternatives"
-    // InternalDataDSL.g:3135:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
+    // InternalDataDSL.g:3384:1: rule__OpMultiAssign__Alternatives : ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) );
     public final void rule__OpMultiAssign__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3139:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
-            int alt14=7;
+            // InternalDataDSL.g:3388:1: ( ( '+=' ) | ( '-=' ) | ( '*=' ) | ( '/=' ) | ( '%=' ) | ( ( rule__OpMultiAssign__Group_5__0 ) ) | ( ( rule__OpMultiAssign__Group_6__0 ) ) )
+            int alt17=7;
             switch ( input.LA(1) ) {
             case 16:
                 {
-                alt14=1;
+                alt17=1;
                 }
                 break;
             case 17:
                 {
-                alt14=2;
+                alt17=2;
                 }
                 break;
             case 18:
                 {
-                alt14=3;
+                alt17=3;
                 }
                 break;
             case 19:
                 {
-                alt14=4;
+                alt17=4;
                 }
                 break;
             case 20:
                 {
-                alt14=5;
+                alt17=5;
                 }
                 break;
             case 27:
                 {
-                alt14=6;
+                alt17=6;
                 }
                 break;
             case 26:
                 {
-                alt14=7;
+                alt17=7;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 14, 0, input);
+                    new NoViableAltException("", 17, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt14) {
+            switch (alt17) {
                 case 1 :
-                    // InternalDataDSL.g:3140:2: ( '+=' )
+                    // InternalDataDSL.g:3389:2: ( '+=' )
                     {
-                    // InternalDataDSL.g:3140:2: ( '+=' )
-                    // InternalDataDSL.g:3141:3: '+='
+                    // InternalDataDSL.g:3389:2: ( '+=' )
+                    // InternalDataDSL.g:3390:3: '+='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getPlusSignEqualsSignKeyword_0()); 
@@ -11044,10 +12059,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3146:2: ( '-=' )
+                    // InternalDataDSL.g:3395:2: ( '-=' )
                     {
-                    // InternalDataDSL.g:3146:2: ( '-=' )
-                    // InternalDataDSL.g:3147:3: '-='
+                    // InternalDataDSL.g:3395:2: ( '-=' )
+                    // InternalDataDSL.g:3396:3: '-='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getHyphenMinusEqualsSignKeyword_1()); 
@@ -11063,10 +12078,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3152:2: ( '*=' )
+                    // InternalDataDSL.g:3401:2: ( '*=' )
                     {
-                    // InternalDataDSL.g:3152:2: ( '*=' )
-                    // InternalDataDSL.g:3153:3: '*='
+                    // InternalDataDSL.g:3401:2: ( '*=' )
+                    // InternalDataDSL.g:3402:3: '*='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getAsteriskEqualsSignKeyword_2()); 
@@ -11082,10 +12097,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3158:2: ( '/=' )
+                    // InternalDataDSL.g:3407:2: ( '/=' )
                     {
-                    // InternalDataDSL.g:3158:2: ( '/=' )
-                    // InternalDataDSL.g:3159:3: '/='
+                    // InternalDataDSL.g:3407:2: ( '/=' )
+                    // InternalDataDSL.g:3408:3: '/='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getSolidusEqualsSignKeyword_3()); 
@@ -11101,10 +12116,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3164:2: ( '%=' )
+                    // InternalDataDSL.g:3413:2: ( '%=' )
                     {
-                    // InternalDataDSL.g:3164:2: ( '%=' )
-                    // InternalDataDSL.g:3165:3: '%='
+                    // InternalDataDSL.g:3413:2: ( '%=' )
+                    // InternalDataDSL.g:3414:3: '%='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getPercentSignEqualsSignKeyword_4()); 
@@ -11120,16 +12135,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:3170:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    // InternalDataDSL.g:3419:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
                     {
-                    // InternalDataDSL.g:3170:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
-                    // InternalDataDSL.g:3171:3: ( rule__OpMultiAssign__Group_5__0 )
+                    // InternalDataDSL.g:3419:2: ( ( rule__OpMultiAssign__Group_5__0 ) )
+                    // InternalDataDSL.g:3420:3: ( rule__OpMultiAssign__Group_5__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getGroup_5()); 
                     }
-                    // InternalDataDSL.g:3172:3: ( rule__OpMultiAssign__Group_5__0 )
-                    // InternalDataDSL.g:3172:4: rule__OpMultiAssign__Group_5__0
+                    // InternalDataDSL.g:3421:3: ( rule__OpMultiAssign__Group_5__0 )
+                    // InternalDataDSL.g:3421:4: rule__OpMultiAssign__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpMultiAssign__Group_5__0();
@@ -11149,16 +12164,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:3176:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    // InternalDataDSL.g:3425:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
                     {
-                    // InternalDataDSL.g:3176:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
-                    // InternalDataDSL.g:3177:3: ( rule__OpMultiAssign__Group_6__0 )
+                    // InternalDataDSL.g:3425:2: ( ( rule__OpMultiAssign__Group_6__0 ) )
+                    // InternalDataDSL.g:3426:3: ( rule__OpMultiAssign__Group_6__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAssignAccess().getGroup_6()); 
                     }
-                    // InternalDataDSL.g:3178:3: ( rule__OpMultiAssign__Group_6__0 )
-                    // InternalDataDSL.g:3178:4: rule__OpMultiAssign__Group_6__0
+                    // InternalDataDSL.g:3427:3: ( rule__OpMultiAssign__Group_6__0 )
+                    // InternalDataDSL.g:3427:4: rule__OpMultiAssign__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpMultiAssign__Group_6__0();
@@ -11195,49 +12210,49 @@
 
 
     // $ANTLR start "rule__OpEquality__Alternatives"
-    // InternalDataDSL.g:3186:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
+    // InternalDataDSL.g:3435:1: rule__OpEquality__Alternatives : ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) );
     public final void rule__OpEquality__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3190:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
-            int alt15=4;
+            // InternalDataDSL.g:3439:1: ( ( '==' ) | ( '!=' ) | ( '===' ) | ( '!==' ) )
+            int alt18=4;
             switch ( input.LA(1) ) {
             case 21:
                 {
-                alt15=1;
+                alt18=1;
                 }
                 break;
             case 22:
                 {
-                alt15=2;
+                alt18=2;
                 }
                 break;
             case 23:
                 {
-                alt15=3;
+                alt18=3;
                 }
                 break;
             case 24:
                 {
-                alt15=4;
+                alt18=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 15, 0, input);
+                    new NoViableAltException("", 18, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt15) {
+            switch (alt18) {
                 case 1 :
-                    // InternalDataDSL.g:3191:2: ( '==' )
+                    // InternalDataDSL.g:3440:2: ( '==' )
                     {
-                    // InternalDataDSL.g:3191:2: ( '==' )
-                    // InternalDataDSL.g:3192:3: '=='
+                    // InternalDataDSL.g:3440:2: ( '==' )
+                    // InternalDataDSL.g:3441:3: '=='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignKeyword_0()); 
@@ -11253,10 +12268,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3197:2: ( '!=' )
+                    // InternalDataDSL.g:3446:2: ( '!=' )
                     {
-                    // InternalDataDSL.g:3197:2: ( '!=' )
-                    // InternalDataDSL.g:3198:3: '!='
+                    // InternalDataDSL.g:3446:2: ( '!=' )
+                    // InternalDataDSL.g:3447:3: '!='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignKeyword_1()); 
@@ -11272,10 +12287,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3203:2: ( '===' )
+                    // InternalDataDSL.g:3452:2: ( '===' )
                     {
-                    // InternalDataDSL.g:3203:2: ( '===' )
-                    // InternalDataDSL.g:3204:3: '==='
+                    // InternalDataDSL.g:3452:2: ( '===' )
+                    // InternalDataDSL.g:3453:3: '==='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getEqualsSignEqualsSignEqualsSignKeyword_2()); 
@@ -11291,10 +12306,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3209:2: ( '!==' )
+                    // InternalDataDSL.g:3458:2: ( '!==' )
                     {
-                    // InternalDataDSL.g:3209:2: ( '!==' )
-                    // InternalDataDSL.g:3210:3: '!=='
+                    // InternalDataDSL.g:3458:2: ( '!==' )
+                    // InternalDataDSL.g:3459:3: '!=='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpEqualityAccess().getExclamationMarkEqualsSignEqualsSignKeyword_3()); 
@@ -11327,41 +12342,41 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Alternatives_1"
-    // InternalDataDSL.g:3219:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
+    // InternalDataDSL.g:3468:1: rule__XRelationalExpression__Alternatives_1 : ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) );
     public final void rule__XRelationalExpression__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3223:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
-            int alt16=2;
-            int LA16_0 = input.LA(1);
+            // InternalDataDSL.g:3472:1: ( ( ( rule__XRelationalExpression__Group_1_0__0 ) ) | ( ( rule__XRelationalExpression__Group_1_1__0 ) ) )
+            int alt19=2;
+            int LA19_0 = input.LA(1);
 
-            if ( (LA16_0==128) ) {
-                alt16=1;
+            if ( (LA19_0==134) ) {
+                alt19=1;
             }
-            else if ( ((LA16_0>=25 && LA16_0<=27)) ) {
-                alt16=2;
+            else if ( ((LA19_0>=25 && LA19_0<=27)) ) {
+                alt19=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 16, 0, input);
+                    new NoViableAltException("", 19, 0, input);
 
                 throw nvae;
             }
-            switch (alt16) {
+            switch (alt19) {
                 case 1 :
-                    // InternalDataDSL.g:3224:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    // InternalDataDSL.g:3473:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
                     {
-                    // InternalDataDSL.g:3224:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
-                    // InternalDataDSL.g:3225:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    // InternalDataDSL.g:3473:2: ( ( rule__XRelationalExpression__Group_1_0__0 ) )
+                    // InternalDataDSL.g:3474:3: ( rule__XRelationalExpression__Group_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0()); 
                     }
-                    // InternalDataDSL.g:3226:3: ( rule__XRelationalExpression__Group_1_0__0 )
-                    // InternalDataDSL.g:3226:4: rule__XRelationalExpression__Group_1_0__0
+                    // InternalDataDSL.g:3475:3: ( rule__XRelationalExpression__Group_1_0__0 )
+                    // InternalDataDSL.g:3475:4: rule__XRelationalExpression__Group_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XRelationalExpression__Group_1_0__0();
@@ -11381,16 +12396,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3230:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    // InternalDataDSL.g:3479:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
                     {
-                    // InternalDataDSL.g:3230:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
-                    // InternalDataDSL.g:3231:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    // InternalDataDSL.g:3479:2: ( ( rule__XRelationalExpression__Group_1_1__0 ) )
+                    // InternalDataDSL.g:3480:3: ( rule__XRelationalExpression__Group_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1()); 
                     }
-                    // InternalDataDSL.g:3232:3: ( rule__XRelationalExpression__Group_1_1__0 )
-                    // InternalDataDSL.g:3232:4: rule__XRelationalExpression__Group_1_1__0
+                    // InternalDataDSL.g:3481:3: ( rule__XRelationalExpression__Group_1_1__0 )
+                    // InternalDataDSL.g:3481:4: rule__XRelationalExpression__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XRelationalExpression__Group_1_1__0();
@@ -11427,34 +12442,34 @@
 
 
     // $ANTLR start "rule__OpCompare__Alternatives"
-    // InternalDataDSL.g:3240:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
+    // InternalDataDSL.g:3489:1: rule__OpCompare__Alternatives : ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) );
     public final void rule__OpCompare__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3244:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
-            int alt17=4;
+            // InternalDataDSL.g:3493:1: ( ( '>=' ) | ( ( rule__OpCompare__Group_1__0 ) ) | ( '>' ) | ( '<' ) )
+            int alt20=4;
             switch ( input.LA(1) ) {
             case 25:
                 {
-                alt17=1;
+                alt20=1;
                 }
                 break;
             case 27:
                 {
-                int LA17_2 = input.LA(2);
+                int LA20_2 = input.LA(2);
 
-                if ( (LA17_2==EOF||(LA17_2>=RULE_STRING && LA17_2<=RULE_DECIMAL)||LA17_2==27||(LA17_2>=34 && LA17_2<=35)||LA17_2==40||(LA17_2>=45 && LA17_2<=50)||LA17_2==74||LA17_2==101||LA17_2==122||(LA17_2>=126 && LA17_2<=127)||LA17_2==129||LA17_2==131||(LA17_2>=135 && LA17_2<=142)||LA17_2==144||LA17_2==166) ) {
-                    alt17=4;
+                if ( (LA20_2==EOF||(LA20_2>=RULE_STRING && LA20_2<=RULE_DECIMAL)||LA20_2==27||(LA20_2>=34 && LA20_2<=35)||LA20_2==40||(LA20_2>=45 && LA20_2<=50)||LA20_2==74||LA20_2==103||LA20_2==128||(LA20_2>=132 && LA20_2<=133)||LA20_2==135||LA20_2==137||(LA20_2>=141 && LA20_2<=148)||LA20_2==150||LA20_2==179) ) {
+                    alt20=4;
                 }
-                else if ( (LA17_2==13) ) {
-                    alt17=2;
+                else if ( (LA20_2==13) ) {
+                    alt20=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 17, 2, input);
+                        new NoViableAltException("", 20, 2, input);
 
                     throw nvae;
                 }
@@ -11462,23 +12477,23 @@
                 break;
             case 26:
                 {
-                alt17=3;
+                alt20=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 17, 0, input);
+                    new NoViableAltException("", 20, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt17) {
+            switch (alt20) {
                 case 1 :
-                    // InternalDataDSL.g:3245:2: ( '>=' )
+                    // InternalDataDSL.g:3494:2: ( '>=' )
                     {
-                    // InternalDataDSL.g:3245:2: ( '>=' )
-                    // InternalDataDSL.g:3246:3: '>='
+                    // InternalDataDSL.g:3494:2: ( '>=' )
+                    // InternalDataDSL.g:3495:3: '>='
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGreaterThanSignEqualsSignKeyword_0()); 
@@ -11494,16 +12509,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3251:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    // InternalDataDSL.g:3500:2: ( ( rule__OpCompare__Group_1__0 ) )
                     {
-                    // InternalDataDSL.g:3251:2: ( ( rule__OpCompare__Group_1__0 ) )
-                    // InternalDataDSL.g:3252:3: ( rule__OpCompare__Group_1__0 )
+                    // InternalDataDSL.g:3500:2: ( ( rule__OpCompare__Group_1__0 ) )
+                    // InternalDataDSL.g:3501:3: ( rule__OpCompare__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGroup_1()); 
                     }
-                    // InternalDataDSL.g:3253:3: ( rule__OpCompare__Group_1__0 )
-                    // InternalDataDSL.g:3253:4: rule__OpCompare__Group_1__0
+                    // InternalDataDSL.g:3502:3: ( rule__OpCompare__Group_1__0 )
+                    // InternalDataDSL.g:3502:4: rule__OpCompare__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpCompare__Group_1__0();
@@ -11523,10 +12538,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3257:2: ( '>' )
+                    // InternalDataDSL.g:3506:2: ( '>' )
                     {
-                    // InternalDataDSL.g:3257:2: ( '>' )
-                    // InternalDataDSL.g:3258:3: '>'
+                    // InternalDataDSL.g:3506:2: ( '>' )
+                    // InternalDataDSL.g:3507:3: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getGreaterThanSignKeyword_2()); 
@@ -11542,10 +12557,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3263:2: ( '<' )
+                    // InternalDataDSL.g:3512:2: ( '<' )
                     {
-                    // InternalDataDSL.g:3263:2: ( '<' )
-                    // InternalDataDSL.g:3264:3: '<'
+                    // InternalDataDSL.g:3512:2: ( '<' )
+                    // InternalDataDSL.g:3513:3: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_3()); 
@@ -11578,21 +12593,21 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives"
-    // InternalDataDSL.g:3273:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
+    // InternalDataDSL.g:3522:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );
     public final void rule__OpOther__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3277:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
-            int alt18=9;
-            alt18 = dfa18.predict(input);
-            switch (alt18) {
+            // InternalDataDSL.g:3526:1: ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) )
+            int alt21=9;
+            alt21 = dfa21.predict(input);
+            switch (alt21) {
                 case 1 :
-                    // InternalDataDSL.g:3278:2: ( '->' )
+                    // InternalDataDSL.g:3527:2: ( '->' )
                     {
-                    // InternalDataDSL.g:3278:2: ( '->' )
-                    // InternalDataDSL.g:3279:3: '->'
+                    // InternalDataDSL.g:3527:2: ( '->' )
+                    // InternalDataDSL.g:3528:3: '->'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getHyphenMinusGreaterThanSignKeyword_0()); 
@@ -11608,10 +12623,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3284:2: ( '..<' )
+                    // InternalDataDSL.g:3533:2: ( '..<' )
                     {
-                    // InternalDataDSL.g:3284:2: ( '..<' )
-                    // InternalDataDSL.g:3285:3: '..<'
+                    // InternalDataDSL.g:3533:2: ( '..<' )
+                    // InternalDataDSL.g:3534:3: '..<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getFullStopFullStopLessThanSignKeyword_1()); 
@@ -11627,16 +12642,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3290:2: ( ( rule__OpOther__Group_2__0 ) )
+                    // InternalDataDSL.g:3539:2: ( ( rule__OpOther__Group_2__0 ) )
                     {
-                    // InternalDataDSL.g:3290:2: ( ( rule__OpOther__Group_2__0 ) )
-                    // InternalDataDSL.g:3291:3: ( rule__OpOther__Group_2__0 )
+                    // InternalDataDSL.g:3539:2: ( ( rule__OpOther__Group_2__0 ) )
+                    // InternalDataDSL.g:3540:3: ( rule__OpOther__Group_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_2()); 
                     }
-                    // InternalDataDSL.g:3292:3: ( rule__OpOther__Group_2__0 )
-                    // InternalDataDSL.g:3292:4: rule__OpOther__Group_2__0
+                    // InternalDataDSL.g:3541:3: ( rule__OpOther__Group_2__0 )
+                    // InternalDataDSL.g:3541:4: rule__OpOther__Group_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_2__0();
@@ -11656,10 +12671,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3296:2: ( '..' )
+                    // InternalDataDSL.g:3545:2: ( '..' )
                     {
-                    // InternalDataDSL.g:3296:2: ( '..' )
-                    // InternalDataDSL.g:3297:3: '..'
+                    // InternalDataDSL.g:3545:2: ( '..' )
+                    // InternalDataDSL.g:3546:3: '..'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_3()); 
@@ -11675,10 +12690,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3302:2: ( '=>' )
+                    // InternalDataDSL.g:3551:2: ( '=>' )
                     {
-                    // InternalDataDSL.g:3302:2: ( '=>' )
-                    // InternalDataDSL.g:3303:3: '=>'
+                    // InternalDataDSL.g:3551:2: ( '=>' )
+                    // InternalDataDSL.g:3552:3: '=>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_4()); 
@@ -11694,16 +12709,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:3308:2: ( ( rule__OpOther__Group_5__0 ) )
+                    // InternalDataDSL.g:3557:2: ( ( rule__OpOther__Group_5__0 ) )
                     {
-                    // InternalDataDSL.g:3308:2: ( ( rule__OpOther__Group_5__0 ) )
-                    // InternalDataDSL.g:3309:3: ( rule__OpOther__Group_5__0 )
+                    // InternalDataDSL.g:3557:2: ( ( rule__OpOther__Group_5__0 ) )
+                    // InternalDataDSL.g:3558:3: ( rule__OpOther__Group_5__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_5()); 
                     }
-                    // InternalDataDSL.g:3310:3: ( rule__OpOther__Group_5__0 )
-                    // InternalDataDSL.g:3310:4: rule__OpOther__Group_5__0
+                    // InternalDataDSL.g:3559:3: ( rule__OpOther__Group_5__0 )
+                    // InternalDataDSL.g:3559:4: rule__OpOther__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_5__0();
@@ -11723,16 +12738,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:3314:2: ( ( rule__OpOther__Group_6__0 ) )
+                    // InternalDataDSL.g:3563:2: ( ( rule__OpOther__Group_6__0 ) )
                     {
-                    // InternalDataDSL.g:3314:2: ( ( rule__OpOther__Group_6__0 ) )
-                    // InternalDataDSL.g:3315:3: ( rule__OpOther__Group_6__0 )
+                    // InternalDataDSL.g:3563:2: ( ( rule__OpOther__Group_6__0 ) )
+                    // InternalDataDSL.g:3564:3: ( rule__OpOther__Group_6__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_6()); 
                     }
-                    // InternalDataDSL.g:3316:3: ( rule__OpOther__Group_6__0 )
-                    // InternalDataDSL.g:3316:4: rule__OpOther__Group_6__0
+                    // InternalDataDSL.g:3565:3: ( rule__OpOther__Group_6__0 )
+                    // InternalDataDSL.g:3565:4: rule__OpOther__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_6__0();
@@ -11752,10 +12767,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:3320:2: ( '<>' )
+                    // InternalDataDSL.g:3569:2: ( '<>' )
                     {
-                    // InternalDataDSL.g:3320:2: ( '<>' )
-                    // InternalDataDSL.g:3321:3: '<>'
+                    // InternalDataDSL.g:3569:2: ( '<>' )
+                    // InternalDataDSL.g:3570:3: '<>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getLessThanSignGreaterThanSignKeyword_7()); 
@@ -11771,10 +12786,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalDataDSL.g:3326:2: ( '?:' )
+                    // InternalDataDSL.g:3575:2: ( '?:' )
                     {
-                    // InternalDataDSL.g:3326:2: ( '?:' )
-                    // InternalDataDSL.g:3327:3: '?:'
+                    // InternalDataDSL.g:3575:2: ( '?:' )
+                    // InternalDataDSL.g:3576:3: '?:'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getQuestionMarkColonKeyword_8()); 
@@ -11807,29 +12822,29 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives_5_1"
-    // InternalDataDSL.g:3336:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
+    // InternalDataDSL.g:3585:1: rule__OpOther__Alternatives_5_1 : ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) );
     public final void rule__OpOther__Alternatives_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3340:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
-            int alt19=2;
-            int LA19_0 = input.LA(1);
+            // InternalDataDSL.g:3589:1: ( ( ( rule__OpOther__Group_5_1_0__0 ) ) | ( '>' ) )
+            int alt22=2;
+            int LA22_0 = input.LA(1);
 
-            if ( (LA19_0==26) ) {
-                int LA19_1 = input.LA(2);
+            if ( (LA22_0==26) ) {
+                int LA22_1 = input.LA(2);
 
-                if ( (LA19_1==EOF||(LA19_1>=RULE_STRING && LA19_1<=RULE_DECIMAL)||LA19_1==27||(LA19_1>=34 && LA19_1<=35)||LA19_1==40||(LA19_1>=45 && LA19_1<=50)||LA19_1==74||LA19_1==101||LA19_1==122||(LA19_1>=126 && LA19_1<=127)||LA19_1==129||LA19_1==131||(LA19_1>=135 && LA19_1<=142)||LA19_1==144||LA19_1==166) ) {
-                    alt19=2;
+                if ( (LA22_1==EOF||(LA22_1>=RULE_STRING && LA22_1<=RULE_DECIMAL)||LA22_1==27||(LA22_1>=34 && LA22_1<=35)||LA22_1==40||(LA22_1>=45 && LA22_1<=50)||LA22_1==74||LA22_1==103||LA22_1==128||(LA22_1>=132 && LA22_1<=133)||LA22_1==135||LA22_1==137||(LA22_1>=141 && LA22_1<=148)||LA22_1==150||LA22_1==179) ) {
+                    alt22=2;
                 }
-                else if ( (LA19_1==26) ) {
-                    alt19=1;
+                else if ( (LA22_1==26) ) {
+                    alt22=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 19, 1, input);
+                        new NoViableAltException("", 22, 1, input);
 
                     throw nvae;
                 }
@@ -11837,22 +12852,22 @@
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 19, 0, input);
+                    new NoViableAltException("", 22, 0, input);
 
                 throw nvae;
             }
-            switch (alt19) {
+            switch (alt22) {
                 case 1 :
-                    // InternalDataDSL.g:3341:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    // InternalDataDSL.g:3590:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
                     {
-                    // InternalDataDSL.g:3341:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
-                    // InternalDataDSL.g:3342:3: ( rule__OpOther__Group_5_1_0__0 )
+                    // InternalDataDSL.g:3590:2: ( ( rule__OpOther__Group_5_1_0__0 ) )
+                    // InternalDataDSL.g:3591:3: ( rule__OpOther__Group_5_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_5_1_0()); 
                     }
-                    // InternalDataDSL.g:3343:3: ( rule__OpOther__Group_5_1_0__0 )
-                    // InternalDataDSL.g:3343:4: rule__OpOther__Group_5_1_0__0
+                    // InternalDataDSL.g:3592:3: ( rule__OpOther__Group_5_1_0__0 )
+                    // InternalDataDSL.g:3592:4: rule__OpOther__Group_5_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_5_1_0__0();
@@ -11872,10 +12887,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3347:2: ( '>' )
+                    // InternalDataDSL.g:3596:2: ( '>' )
                     {
-                    // InternalDataDSL.g:3347:2: ( '>' )
-                    // InternalDataDSL.g:3348:3: '>'
+                    // InternalDataDSL.g:3596:2: ( '>' )
+                    // InternalDataDSL.g:3597:3: '>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_1()); 
@@ -11908,55 +12923,55 @@
 
 
     // $ANTLR start "rule__OpOther__Alternatives_6_1"
-    // InternalDataDSL.g:3357:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
+    // InternalDataDSL.g:3606:1: rule__OpOther__Alternatives_6_1 : ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) );
     public final void rule__OpOther__Alternatives_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3361:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
-            int alt20=3;
-            int LA20_0 = input.LA(1);
+            // InternalDataDSL.g:3610:1: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) | ( '<' ) | ( '=>' ) )
+            int alt23=3;
+            int LA23_0 = input.LA(1);
 
-            if ( (LA20_0==27) ) {
-                int LA20_1 = input.LA(2);
+            if ( (LA23_0==27) ) {
+                int LA23_1 = input.LA(2);
 
-                if ( (synpred39_InternalDataDSL()) ) {
-                    alt20=1;
+                if ( (synpred48_InternalDataDSL()) ) {
+                    alt23=1;
                 }
-                else if ( (synpred40_InternalDataDSL()) ) {
-                    alt20=2;
+                else if ( (synpred49_InternalDataDSL()) ) {
+                    alt23=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 20, 1, input);
+                        new NoViableAltException("", 23, 1, input);
 
                     throw nvae;
                 }
             }
-            else if ( (LA20_0==31) ) {
-                alt20=3;
+            else if ( (LA23_0==31) ) {
+                alt23=3;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 20, 0, input);
+                    new NoViableAltException("", 23, 0, input);
 
                 throw nvae;
             }
-            switch (alt20) {
+            switch (alt23) {
                 case 1 :
-                    // InternalDataDSL.g:3362:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    // InternalDataDSL.g:3611:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
                     {
-                    // InternalDataDSL.g:3362:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
-                    // InternalDataDSL.g:3363:3: ( rule__OpOther__Group_6_1_0__0 )
+                    // InternalDataDSL.g:3611:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+                    // InternalDataDSL.g:3612:3: ( rule__OpOther__Group_6_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
                     }
-                    // InternalDataDSL.g:3364:3: ( rule__OpOther__Group_6_1_0__0 )
-                    // InternalDataDSL.g:3364:4: rule__OpOther__Group_6_1_0__0
+                    // InternalDataDSL.g:3613:3: ( rule__OpOther__Group_6_1_0__0 )
+                    // InternalDataDSL.g:3613:4: rule__OpOther__Group_6_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__OpOther__Group_6_1_0__0();
@@ -11976,10 +12991,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3368:2: ( '<' )
+                    // InternalDataDSL.g:3617:2: ( '<' )
                     {
-                    // InternalDataDSL.g:3368:2: ( '<' )
-                    // InternalDataDSL.g:3369:3: '<'
+                    // InternalDataDSL.g:3617:2: ( '<' )
+                    // InternalDataDSL.g:3618:3: '<'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
@@ -11995,10 +13010,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3374:2: ( '=>' )
+                    // InternalDataDSL.g:3623:2: ( '=>' )
                     {
-                    // InternalDataDSL.g:3374:2: ( '=>' )
-                    // InternalDataDSL.g:3375:3: '=>'
+                    // InternalDataDSL.g:3623:2: ( '=>' )
+                    // InternalDataDSL.g:3624:3: '=>'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpOtherAccess().getEqualsSignGreaterThanSignKeyword_6_1_2()); 
@@ -12031,35 +13046,35 @@
 
 
     // $ANTLR start "rule__OpAdd__Alternatives"
-    // InternalDataDSL.g:3384:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
+    // InternalDataDSL.g:3633:1: rule__OpAdd__Alternatives : ( ( '+' ) | ( '-' ) );
     public final void rule__OpAdd__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3388:1: ( ( '+' ) | ( '-' ) )
-            int alt21=2;
-            int LA21_0 = input.LA(1);
+            // InternalDataDSL.g:3637:1: ( ( '+' ) | ( '-' ) )
+            int alt24=2;
+            int LA24_0 = input.LA(1);
 
-            if ( (LA21_0==34) ) {
-                alt21=1;
+            if ( (LA24_0==34) ) {
+                alt24=1;
             }
-            else if ( (LA21_0==35) ) {
-                alt21=2;
+            else if ( (LA24_0==35) ) {
+                alt24=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 21, 0, input);
+                    new NoViableAltException("", 24, 0, input);
 
                 throw nvae;
             }
-            switch (alt21) {
+            switch (alt24) {
                 case 1 :
-                    // InternalDataDSL.g:3389:2: ( '+' )
+                    // InternalDataDSL.g:3638:2: ( '+' )
                     {
-                    // InternalDataDSL.g:3389:2: ( '+' )
-                    // InternalDataDSL.g:3390:3: '+'
+                    // InternalDataDSL.g:3638:2: ( '+' )
+                    // InternalDataDSL.g:3639:3: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpAddAccess().getPlusSignKeyword_0()); 
@@ -12075,10 +13090,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3395:2: ( '-' )
+                    // InternalDataDSL.g:3644:2: ( '-' )
                     {
-                    // InternalDataDSL.g:3395:2: ( '-' )
-                    // InternalDataDSL.g:3396:3: '-'
+                    // InternalDataDSL.g:3644:2: ( '-' )
+                    // InternalDataDSL.g:3645:3: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpAddAccess().getHyphenMinusKeyword_1()); 
@@ -12111,49 +13126,49 @@
 
 
     // $ANTLR start "rule__OpMulti__Alternatives"
-    // InternalDataDSL.g:3405:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
+    // InternalDataDSL.g:3654:1: rule__OpMulti__Alternatives : ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) );
     public final void rule__OpMulti__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3409:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
-            int alt22=4;
+            // InternalDataDSL.g:3658:1: ( ( '*' ) | ( '**' ) | ( '/' ) | ( '%' ) )
+            int alt25=4;
             switch ( input.LA(1) ) {
             case 36:
                 {
-                alt22=1;
+                alt25=1;
                 }
                 break;
             case 37:
                 {
-                alt22=2;
+                alt25=2;
                 }
                 break;
             case 38:
                 {
-                alt22=3;
+                alt25=3;
                 }
                 break;
             case 39:
                 {
-                alt22=4;
+                alt25=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 22, 0, input);
+                    new NoViableAltException("", 25, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt22) {
+            switch (alt25) {
                 case 1 :
-                    // InternalDataDSL.g:3410:2: ( '*' )
+                    // InternalDataDSL.g:3659:2: ( '*' )
                     {
-                    // InternalDataDSL.g:3410:2: ( '*' )
-                    // InternalDataDSL.g:3411:3: '*'
+                    // InternalDataDSL.g:3659:2: ( '*' )
+                    // InternalDataDSL.g:3660:3: '*'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getAsteriskKeyword_0()); 
@@ -12169,10 +13184,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3416:2: ( '**' )
+                    // InternalDataDSL.g:3665:2: ( '**' )
                     {
-                    // InternalDataDSL.g:3416:2: ( '**' )
-                    // InternalDataDSL.g:3417:3: '**'
+                    // InternalDataDSL.g:3665:2: ( '**' )
+                    // InternalDataDSL.g:3666:3: '**'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getAsteriskAsteriskKeyword_1()); 
@@ -12188,10 +13203,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3422:2: ( '/' )
+                    // InternalDataDSL.g:3671:2: ( '/' )
                     {
-                    // InternalDataDSL.g:3422:2: ( '/' )
-                    // InternalDataDSL.g:3423:3: '/'
+                    // InternalDataDSL.g:3671:2: ( '/' )
+                    // InternalDataDSL.g:3672:3: '/'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getSolidusKeyword_2()); 
@@ -12207,10 +13222,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3428:2: ( '%' )
+                    // InternalDataDSL.g:3677:2: ( '%' )
                     {
-                    // InternalDataDSL.g:3428:2: ( '%' )
-                    // InternalDataDSL.g:3429:3: '%'
+                    // InternalDataDSL.g:3677:2: ( '%' )
+                    // InternalDataDSL.g:3678:3: '%'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpMultiAccess().getPercentSignKeyword_3()); 
@@ -12243,41 +13258,41 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Alternatives"
-    // InternalDataDSL.g:3438:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
+    // InternalDataDSL.g:3687:1: rule__XUnaryOperation__Alternatives : ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) );
     public final void rule__XUnaryOperation__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3442:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
-            int alt23=2;
-            int LA23_0 = input.LA(1);
+            // InternalDataDSL.g:3691:1: ( ( ( rule__XUnaryOperation__Group_0__0 ) ) | ( ruleXCastedExpression ) )
+            int alt26=2;
+            int LA26_0 = input.LA(1);
 
-            if ( ((LA23_0>=34 && LA23_0<=35)||LA23_0==40) ) {
-                alt23=1;
+            if ( ((LA26_0>=34 && LA26_0<=35)||LA26_0==40) ) {
+                alt26=1;
             }
-            else if ( ((LA23_0>=RULE_STRING && LA23_0<=RULE_DECIMAL)||LA23_0==27||(LA23_0>=45 && LA23_0<=50)||LA23_0==74||LA23_0==101||LA23_0==122||(LA23_0>=126 && LA23_0<=127)||LA23_0==129||LA23_0==131||(LA23_0>=135 && LA23_0<=142)||LA23_0==144||LA23_0==166) ) {
-                alt23=2;
+            else if ( ((LA26_0>=RULE_STRING && LA26_0<=RULE_DECIMAL)||LA26_0==27||(LA26_0>=45 && LA26_0<=50)||LA26_0==74||LA26_0==103||LA26_0==128||(LA26_0>=132 && LA26_0<=133)||LA26_0==135||LA26_0==137||(LA26_0>=141 && LA26_0<=148)||LA26_0==150||LA26_0==179) ) {
+                alt26=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 23, 0, input);
+                    new NoViableAltException("", 26, 0, input);
 
                 throw nvae;
             }
-            switch (alt23) {
+            switch (alt26) {
                 case 1 :
-                    // InternalDataDSL.g:3443:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    // InternalDataDSL.g:3692:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
                     {
-                    // InternalDataDSL.g:3443:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
-                    // InternalDataDSL.g:3444:3: ( rule__XUnaryOperation__Group_0__0 )
+                    // InternalDataDSL.g:3692:2: ( ( rule__XUnaryOperation__Group_0__0 ) )
+                    // InternalDataDSL.g:3693:3: ( rule__XUnaryOperation__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXUnaryOperationAccess().getGroup_0()); 
                     }
-                    // InternalDataDSL.g:3445:3: ( rule__XUnaryOperation__Group_0__0 )
-                    // InternalDataDSL.g:3445:4: rule__XUnaryOperation__Group_0__0
+                    // InternalDataDSL.g:3694:3: ( rule__XUnaryOperation__Group_0__0 )
+                    // InternalDataDSL.g:3694:4: rule__XUnaryOperation__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XUnaryOperation__Group_0__0();
@@ -12297,10 +13312,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3449:2: ( ruleXCastedExpression )
+                    // InternalDataDSL.g:3698:2: ( ruleXCastedExpression )
                     {
-                    // InternalDataDSL.g:3449:2: ( ruleXCastedExpression )
-                    // InternalDataDSL.g:3450:3: ruleXCastedExpression
+                    // InternalDataDSL.g:3698:2: ( ruleXCastedExpression )
+                    // InternalDataDSL.g:3699:3: ruleXCastedExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXUnaryOperationAccess().getXCastedExpressionParserRuleCall_1()); 
@@ -12337,44 +13352,44 @@
 
 
     // $ANTLR start "rule__OpUnary__Alternatives"
-    // InternalDataDSL.g:3459:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
+    // InternalDataDSL.g:3708:1: rule__OpUnary__Alternatives : ( ( '!' ) | ( '-' ) | ( '+' ) );
     public final void rule__OpUnary__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3463:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
-            int alt24=3;
+            // InternalDataDSL.g:3712:1: ( ( '!' ) | ( '-' ) | ( '+' ) )
+            int alt27=3;
             switch ( input.LA(1) ) {
             case 40:
                 {
-                alt24=1;
+                alt27=1;
                 }
                 break;
             case 35:
                 {
-                alt24=2;
+                alt27=2;
                 }
                 break;
             case 34:
                 {
-                alt24=3;
+                alt27=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 24, 0, input);
+                    new NoViableAltException("", 27, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt24) {
+            switch (alt27) {
                 case 1 :
-                    // InternalDataDSL.g:3464:2: ( '!' )
+                    // InternalDataDSL.g:3713:2: ( '!' )
                     {
-                    // InternalDataDSL.g:3464:2: ( '!' )
-                    // InternalDataDSL.g:3465:3: '!'
+                    // InternalDataDSL.g:3713:2: ( '!' )
+                    // InternalDataDSL.g:3714:3: '!'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getExclamationMarkKeyword_0()); 
@@ -12390,10 +13405,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3470:2: ( '-' )
+                    // InternalDataDSL.g:3719:2: ( '-' )
                     {
-                    // InternalDataDSL.g:3470:2: ( '-' )
-                    // InternalDataDSL.g:3471:3: '-'
+                    // InternalDataDSL.g:3719:2: ( '-' )
+                    // InternalDataDSL.g:3720:3: '-'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getHyphenMinusKeyword_1()); 
@@ -12409,10 +13424,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3476:2: ( '+' )
+                    // InternalDataDSL.g:3725:2: ( '+' )
                     {
-                    // InternalDataDSL.g:3476:2: ( '+' )
-                    // InternalDataDSL.g:3477:3: '+'
+                    // InternalDataDSL.g:3725:2: ( '+' )
+                    // InternalDataDSL.g:3726:3: '+'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpUnaryAccess().getPlusSignKeyword_2()); 
@@ -12445,35 +13460,35 @@
 
 
     // $ANTLR start "rule__OpPostfix__Alternatives"
-    // InternalDataDSL.g:3486:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
+    // InternalDataDSL.g:3735:1: rule__OpPostfix__Alternatives : ( ( '++' ) | ( '--' ) );
     public final void rule__OpPostfix__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3490:1: ( ( '++' ) | ( '--' ) )
-            int alt25=2;
-            int LA25_0 = input.LA(1);
+            // InternalDataDSL.g:3739:1: ( ( '++' ) | ( '--' ) )
+            int alt28=2;
+            int LA28_0 = input.LA(1);
 
-            if ( (LA25_0==41) ) {
-                alt25=1;
+            if ( (LA28_0==41) ) {
+                alt28=1;
             }
-            else if ( (LA25_0==42) ) {
-                alt25=2;
+            else if ( (LA28_0==42) ) {
+                alt28=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 25, 0, input);
+                    new NoViableAltException("", 28, 0, input);
 
                 throw nvae;
             }
-            switch (alt25) {
+            switch (alt28) {
                 case 1 :
-                    // InternalDataDSL.g:3491:2: ( '++' )
+                    // InternalDataDSL.g:3740:2: ( '++' )
                     {
-                    // InternalDataDSL.g:3491:2: ( '++' )
-                    // InternalDataDSL.g:3492:3: '++'
+                    // InternalDataDSL.g:3740:2: ( '++' )
+                    // InternalDataDSL.g:3741:3: '++'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpPostfixAccess().getPlusSignPlusSignKeyword_0()); 
@@ -12489,10 +13504,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3497:2: ( '--' )
+                    // InternalDataDSL.g:3746:2: ( '--' )
                     {
-                    // InternalDataDSL.g:3497:2: ( '--' )
-                    // InternalDataDSL.g:3498:3: '--'
+                    // InternalDataDSL.g:3746:2: ( '--' )
+                    // InternalDataDSL.g:3747:3: '--'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getOpPostfixAccess().getHyphenMinusHyphenMinusKeyword_1()); 
@@ -12525,27 +13540,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1"
-    // InternalDataDSL.g:3507:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
+    // InternalDataDSL.g:3756:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3511:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
-            int alt26=2;
-            alt26 = dfa26.predict(input);
-            switch (alt26) {
+            // InternalDataDSL.g:3760:1: ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) )
+            int alt29=2;
+            alt29 = dfa29.predict(input);
+            switch (alt29) {
                 case 1 :
-                    // InternalDataDSL.g:3512:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    // InternalDataDSL.g:3761:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
                     {
-                    // InternalDataDSL.g:3512:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
-                    // InternalDataDSL.g:3513:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    // InternalDataDSL.g:3761:2: ( ( rule__XMemberFeatureCall__Group_1_0__0 ) )
+                    // InternalDataDSL.g:3762:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0()); 
                     }
-                    // InternalDataDSL.g:3514:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
-                    // InternalDataDSL.g:3514:4: rule__XMemberFeatureCall__Group_1_0__0
+                    // InternalDataDSL.g:3763:3: ( rule__XMemberFeatureCall__Group_1_0__0 )
+                    // InternalDataDSL.g:3763:4: rule__XMemberFeatureCall__Group_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_0__0();
@@ -12565,16 +13580,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3518:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    // InternalDataDSL.g:3767:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
                     {
-                    // InternalDataDSL.g:3518:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
-                    // InternalDataDSL.g:3519:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    // InternalDataDSL.g:3767:2: ( ( rule__XMemberFeatureCall__Group_1_1__0 ) )
+                    // InternalDataDSL.g:3768:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1()); 
                     }
-                    // InternalDataDSL.g:3520:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
-                    // InternalDataDSL.g:3520:4: rule__XMemberFeatureCall__Group_1_1__0
+                    // InternalDataDSL.g:3769:3: ( rule__XMemberFeatureCall__Group_1_1__0 )
+                    // InternalDataDSL.g:3769:4: rule__XMemberFeatureCall__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1__0();
@@ -12611,35 +13626,35 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_0_0_0_1"
-    // InternalDataDSL.g:3528:1: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) );
+    // InternalDataDSL.g:3777:1: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_0_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3532:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
-            int alt27=2;
-            int LA27_0 = input.LA(1);
+            // InternalDataDSL.g:3781:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) ) )
+            int alt30=2;
+            int LA30_0 = input.LA(1);
 
-            if ( (LA27_0==43) ) {
-                alt27=1;
+            if ( (LA30_0==43) ) {
+                alt30=1;
             }
-            else if ( (LA27_0==162) ) {
-                alt27=2;
+            else if ( (LA30_0==175) ) {
+                alt30=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 27, 0, input);
+                    new NoViableAltException("", 30, 0, input);
 
                 throw nvae;
             }
-            switch (alt27) {
+            switch (alt30) {
                 case 1 :
-                    // InternalDataDSL.g:3533:2: ( '.' )
+                    // InternalDataDSL.g:3782:2: ( '.' )
                     {
-                    // InternalDataDSL.g:3533:2: ( '.' )
-                    // InternalDataDSL.g:3534:3: '.'
+                    // InternalDataDSL.g:3782:2: ( '.' )
+                    // InternalDataDSL.g:3783:3: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0()); 
@@ -12655,16 +13670,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3539:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    // InternalDataDSL.g:3788:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
                     {
-                    // InternalDataDSL.g:3539:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
-                    // InternalDataDSL.g:3540:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    // InternalDataDSL.g:3788:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 ) )
+                    // InternalDataDSL.g:3789:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_0_0_0_1_1()); 
                     }
-                    // InternalDataDSL.g:3541:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
-                    // InternalDataDSL.g:3541:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
+                    // InternalDataDSL.g:3790:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 )
+                    // InternalDataDSL.g:3790:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1();
@@ -12701,44 +13716,44 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_0_0_1"
-    // InternalDataDSL.g:3549:1: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) );
+    // InternalDataDSL.g:3798:1: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 : ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3553:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
-            int alt28=3;
+            // InternalDataDSL.g:3802:1: ( ( '.' ) | ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) ) | ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) ) )
+            int alt31=3;
             switch ( input.LA(1) ) {
             case 43:
                 {
-                alt28=1;
+                alt31=1;
                 }
                 break;
-            case 163:
+            case 176:
                 {
-                alt28=2;
+                alt31=2;
                 }
                 break;
-            case 162:
+            case 175:
                 {
-                alt28=3;
+                alt31=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 28, 0, input);
+                    new NoViableAltException("", 31, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt28) {
+            switch (alt31) {
                 case 1 :
-                    // InternalDataDSL.g:3554:2: ( '.' )
+                    // InternalDataDSL.g:3803:2: ( '.' )
                     {
-                    // InternalDataDSL.g:3554:2: ( '.' )
-                    // InternalDataDSL.g:3555:3: '.'
+                    // InternalDataDSL.g:3803:2: ( '.' )
+                    // InternalDataDSL.g:3804:3: '.'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0()); 
@@ -12754,16 +13769,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3560:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    // InternalDataDSL.g:3809:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
                     {
-                    // InternalDataDSL.g:3560:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
-                    // InternalDataDSL.g:3561:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    // InternalDataDSL.g:3809:2: ( ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 ) )
+                    // InternalDataDSL.g:3810:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeAssignment_1_1_0_0_1_1()); 
                     }
-                    // InternalDataDSL.g:3562:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
-                    // InternalDataDSL.g:3562:4: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
+                    // InternalDataDSL.g:3811:3: ( rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 )
+                    // InternalDataDSL.g:3811:4: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1();
@@ -12783,16 +13798,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3566:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    // InternalDataDSL.g:3815:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
                     {
-                    // InternalDataDSL.g:3566:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
-                    // InternalDataDSL.g:3567:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    // InternalDataDSL.g:3815:2: ( ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 ) )
+                    // InternalDataDSL.g:3816:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticAssignment_1_1_0_0_1_2()); 
                     }
-                    // InternalDataDSL.g:3568:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
-                    // InternalDataDSL.g:3568:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
+                    // InternalDataDSL.g:3817:3: ( rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 )
+                    // InternalDataDSL.g:3817:4: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2();
@@ -12829,27 +13844,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Alternatives_1_1_3_1"
-    // InternalDataDSL.g:3576:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );
+    // InternalDataDSL.g:3825:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );
     public final void rule__XMemberFeatureCall__Alternatives_1_1_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3580:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) )
-            int alt29=2;
-            alt29 = dfa29.predict(input);
-            switch (alt29) {
+            // InternalDataDSL.g:3829:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) )
+            int alt32=2;
+            alt32 = dfa32.predict(input);
+            switch (alt32) {
                 case 1 :
-                    // InternalDataDSL.g:3581:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    // InternalDataDSL.g:3830:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
                     {
-                    // InternalDataDSL.g:3581:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
-                    // InternalDataDSL.g:3582:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    // InternalDataDSL.g:3830:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+                    // InternalDataDSL.g:3831:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
                     }
-                    // InternalDataDSL.g:3583:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
-                    // InternalDataDSL.g:3583:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+                    // InternalDataDSL.g:3832:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+                    // InternalDataDSL.g:3832:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
@@ -12869,16 +13884,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3587:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    // InternalDataDSL.g:3836:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
                     {
-                    // InternalDataDSL.g:3587:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
-                    // InternalDataDSL.g:3588:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    // InternalDataDSL.g:3836:2: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) )
+                    // InternalDataDSL.g:3837:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1()); 
                     }
-                    // InternalDataDSL.g:3589:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
-                    // InternalDataDSL.g:3589:4: rule__XMemberFeatureCall__Group_1_1_3_1_1__0
+                    // InternalDataDSL.g:3838:3: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 )
+                    // InternalDataDSL.g:3838:4: rule__XMemberFeatureCall__Group_1_1_3_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_3_1_1__0();
@@ -12915,21 +13930,21 @@
 
 
     // $ANTLR start "rule__XPrimaryExpression__Alternatives"
-    // InternalDataDSL.g:3597:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );
+    // InternalDataDSL.g:3846:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );
     public final void rule__XPrimaryExpression__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3601:1: ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) )
-            int alt30=15;
-            alt30 = dfa30.predict(input);
-            switch (alt30) {
+            // InternalDataDSL.g:3850:1: ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) )
+            int alt33=15;
+            alt33 = dfa33.predict(input);
+            switch (alt33) {
                 case 1 :
-                    // InternalDataDSL.g:3602:2: ( ruleXConstructorCall )
+                    // InternalDataDSL.g:3851:2: ( ruleXConstructorCall )
                     {
-                    // InternalDataDSL.g:3602:2: ( ruleXConstructorCall )
-                    // InternalDataDSL.g:3603:3: ruleXConstructorCall
+                    // InternalDataDSL.g:3851:2: ( ruleXConstructorCall )
+                    // InternalDataDSL.g:3852:3: ruleXConstructorCall
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXConstructorCallParserRuleCall_0()); 
@@ -12949,10 +13964,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3608:2: ( ruleXBlockExpression )
+                    // InternalDataDSL.g:3857:2: ( ruleXBlockExpression )
                     {
-                    // InternalDataDSL.g:3608:2: ( ruleXBlockExpression )
-                    // InternalDataDSL.g:3609:3: ruleXBlockExpression
+                    // InternalDataDSL.g:3857:2: ( ruleXBlockExpression )
+                    // InternalDataDSL.g:3858:3: ruleXBlockExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXBlockExpressionParserRuleCall_1()); 
@@ -12972,10 +13987,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3614:2: ( ruleXSwitchExpression )
+                    // InternalDataDSL.g:3863:2: ( ruleXSwitchExpression )
                     {
-                    // InternalDataDSL.g:3614:2: ( ruleXSwitchExpression )
-                    // InternalDataDSL.g:3615:3: ruleXSwitchExpression
+                    // InternalDataDSL.g:3863:2: ( ruleXSwitchExpression )
+                    // InternalDataDSL.g:3864:3: ruleXSwitchExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXSwitchExpressionParserRuleCall_2()); 
@@ -12995,16 +14010,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3620:2: ( ( ruleXSynchronizedExpression ) )
+                    // InternalDataDSL.g:3869:2: ( ( ruleXSynchronizedExpression ) )
                     {
-                    // InternalDataDSL.g:3620:2: ( ( ruleXSynchronizedExpression ) )
-                    // InternalDataDSL.g:3621:3: ( ruleXSynchronizedExpression )
+                    // InternalDataDSL.g:3869:2: ( ( ruleXSynchronizedExpression ) )
+                    // InternalDataDSL.g:3870:3: ( ruleXSynchronizedExpression )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXSynchronizedExpressionParserRuleCall_3()); 
                     }
-                    // InternalDataDSL.g:3622:3: ( ruleXSynchronizedExpression )
-                    // InternalDataDSL.g:3622:4: ruleXSynchronizedExpression
+                    // InternalDataDSL.g:3871:3: ( ruleXSynchronizedExpression )
+                    // InternalDataDSL.g:3871:4: ruleXSynchronizedExpression
                     {
                     pushFollow(FOLLOW_2);
                     ruleXSynchronizedExpression();
@@ -13024,10 +14039,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3626:2: ( ruleXFeatureCall )
+                    // InternalDataDSL.g:3875:2: ( ruleXFeatureCall )
                     {
-                    // InternalDataDSL.g:3626:2: ( ruleXFeatureCall )
-                    // InternalDataDSL.g:3627:3: ruleXFeatureCall
+                    // InternalDataDSL.g:3875:2: ( ruleXFeatureCall )
+                    // InternalDataDSL.g:3876:3: ruleXFeatureCall
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXFeatureCallParserRuleCall_4()); 
@@ -13047,10 +14062,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:3632:2: ( ruleXLiteral )
+                    // InternalDataDSL.g:3881:2: ( ruleXLiteral )
                     {
-                    // InternalDataDSL.g:3632:2: ( ruleXLiteral )
-                    // InternalDataDSL.g:3633:3: ruleXLiteral
+                    // InternalDataDSL.g:3881:2: ( ruleXLiteral )
+                    // InternalDataDSL.g:3882:3: ruleXLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXLiteralParserRuleCall_5()); 
@@ -13070,10 +14085,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:3638:2: ( ruleXIfExpression )
+                    // InternalDataDSL.g:3887:2: ( ruleXIfExpression )
                     {
-                    // InternalDataDSL.g:3638:2: ( ruleXIfExpression )
-                    // InternalDataDSL.g:3639:3: ruleXIfExpression
+                    // InternalDataDSL.g:3887:2: ( ruleXIfExpression )
+                    // InternalDataDSL.g:3888:3: ruleXIfExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXIfExpressionParserRuleCall_6()); 
@@ -13093,16 +14108,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:3644:2: ( ( ruleXForLoopExpression ) )
+                    // InternalDataDSL.g:3893:2: ( ( ruleXForLoopExpression ) )
                     {
-                    // InternalDataDSL.g:3644:2: ( ( ruleXForLoopExpression ) )
-                    // InternalDataDSL.g:3645:3: ( ruleXForLoopExpression )
+                    // InternalDataDSL.g:3893:2: ( ( ruleXForLoopExpression ) )
+                    // InternalDataDSL.g:3894:3: ( ruleXForLoopExpression )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
                     }
-                    // InternalDataDSL.g:3646:3: ( ruleXForLoopExpression )
-                    // InternalDataDSL.g:3646:4: ruleXForLoopExpression
+                    // InternalDataDSL.g:3895:3: ( ruleXForLoopExpression )
+                    // InternalDataDSL.g:3895:4: ruleXForLoopExpression
                     {
                     pushFollow(FOLLOW_2);
                     ruleXForLoopExpression();
@@ -13122,10 +14137,10 @@
                     }
                     break;
                 case 9 :
-                    // InternalDataDSL.g:3650:2: ( ruleXBasicForLoopExpression )
+                    // InternalDataDSL.g:3899:2: ( ruleXBasicForLoopExpression )
                     {
-                    // InternalDataDSL.g:3650:2: ( ruleXBasicForLoopExpression )
-                    // InternalDataDSL.g:3651:3: ruleXBasicForLoopExpression
+                    // InternalDataDSL.g:3899:2: ( ruleXBasicForLoopExpression )
+                    // InternalDataDSL.g:3900:3: ruleXBasicForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
@@ -13145,10 +14160,10 @@
                     }
                     break;
                 case 10 :
-                    // InternalDataDSL.g:3656:2: ( ruleXWhileExpression )
+                    // InternalDataDSL.g:3905:2: ( ruleXWhileExpression )
                     {
-                    // InternalDataDSL.g:3656:2: ( ruleXWhileExpression )
-                    // InternalDataDSL.g:3657:3: ruleXWhileExpression
+                    // InternalDataDSL.g:3905:2: ( ruleXWhileExpression )
+                    // InternalDataDSL.g:3906:3: ruleXWhileExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXWhileExpressionParserRuleCall_9()); 
@@ -13168,10 +14183,10 @@
                     }
                     break;
                 case 11 :
-                    // InternalDataDSL.g:3662:2: ( ruleXDoWhileExpression )
+                    // InternalDataDSL.g:3911:2: ( ruleXDoWhileExpression )
                     {
-                    // InternalDataDSL.g:3662:2: ( ruleXDoWhileExpression )
-                    // InternalDataDSL.g:3663:3: ruleXDoWhileExpression
+                    // InternalDataDSL.g:3911:2: ( ruleXDoWhileExpression )
+                    // InternalDataDSL.g:3912:3: ruleXDoWhileExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXDoWhileExpressionParserRuleCall_10()); 
@@ -13191,10 +14206,10 @@
                     }
                     break;
                 case 12 :
-                    // InternalDataDSL.g:3668:2: ( ruleXThrowExpression )
+                    // InternalDataDSL.g:3917:2: ( ruleXThrowExpression )
                     {
-                    // InternalDataDSL.g:3668:2: ( ruleXThrowExpression )
-                    // InternalDataDSL.g:3669:3: ruleXThrowExpression
+                    // InternalDataDSL.g:3917:2: ( ruleXThrowExpression )
+                    // InternalDataDSL.g:3918:3: ruleXThrowExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXThrowExpressionParserRuleCall_11()); 
@@ -13214,10 +14229,10 @@
                     }
                     break;
                 case 13 :
-                    // InternalDataDSL.g:3674:2: ( ruleXReturnExpression )
+                    // InternalDataDSL.g:3923:2: ( ruleXReturnExpression )
                     {
-                    // InternalDataDSL.g:3674:2: ( ruleXReturnExpression )
-                    // InternalDataDSL.g:3675:3: ruleXReturnExpression
+                    // InternalDataDSL.g:3923:2: ( ruleXReturnExpression )
+                    // InternalDataDSL.g:3924:3: ruleXReturnExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXReturnExpressionParserRuleCall_12()); 
@@ -13237,10 +14252,10 @@
                     }
                     break;
                 case 14 :
-                    // InternalDataDSL.g:3680:2: ( ruleXTryCatchFinallyExpression )
+                    // InternalDataDSL.g:3929:2: ( ruleXTryCatchFinallyExpression )
                     {
-                    // InternalDataDSL.g:3680:2: ( ruleXTryCatchFinallyExpression )
-                    // InternalDataDSL.g:3681:3: ruleXTryCatchFinallyExpression
+                    // InternalDataDSL.g:3929:2: ( ruleXTryCatchFinallyExpression )
+                    // InternalDataDSL.g:3930:3: ruleXTryCatchFinallyExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXTryCatchFinallyExpressionParserRuleCall_13()); 
@@ -13260,10 +14275,10 @@
                     }
                     break;
                 case 15 :
-                    // InternalDataDSL.g:3686:2: ( ruleXParenthesizedExpression )
+                    // InternalDataDSL.g:3935:2: ( ruleXParenthesizedExpression )
                     {
-                    // InternalDataDSL.g:3686:2: ( ruleXParenthesizedExpression )
-                    // InternalDataDSL.g:3687:3: ruleXParenthesizedExpression
+                    // InternalDataDSL.g:3935:2: ( ruleXParenthesizedExpression )
+                    // InternalDataDSL.g:3936:3: ruleXParenthesizedExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXPrimaryExpressionAccess().getXParenthesizedExpressionParserRuleCall_14()); 
@@ -13300,67 +14315,67 @@
 
 
     // $ANTLR start "rule__XLiteral__Alternatives"
-    // InternalDataDSL.g:3696:1: rule__XLiteral__Alternatives : ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) );
+    // InternalDataDSL.g:3945:1: rule__XLiteral__Alternatives : ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) );
     public final void rule__XLiteral__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3700:1: ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) )
-            int alt31=7;
+            // InternalDataDSL.g:3949:1: ( ( ruleXCollectionLiteral ) | ( ( ruleXClosure ) ) | ( ruleXBooleanLiteral ) | ( ruleXNumberLiteral ) | ( ruleXNullLiteral ) | ( ruleXStringLiteral ) | ( ruleXTypeLiteral ) )
+            int alt34=7;
             switch ( input.LA(1) ) {
-            case 126:
+            case 132:
                 {
-                alt31=1;
+                alt34=1;
                 }
                 break;
-            case 127:
+            case 133:
                 {
-                alt31=2;
+                alt34=2;
                 }
                 break;
             case 50:
-            case 166:
+            case 179:
                 {
-                alt31=3;
+                alt34=3;
                 }
                 break;
             case RULE_HEX:
             case RULE_INT:
             case RULE_DECIMAL:
                 {
-                alt31=4;
+                alt34=4;
                 }
                 break;
-            case 138:
+            case 144:
                 {
-                alt31=5;
+                alt34=5;
                 }
                 break;
             case RULE_STRING:
                 {
-                alt31=6;
+                alt34=6;
                 }
                 break;
-            case 139:
+            case 145:
                 {
-                alt31=7;
+                alt34=7;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 31, 0, input);
+                    new NoViableAltException("", 34, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt31) {
+            switch (alt34) {
                 case 1 :
-                    // InternalDataDSL.g:3701:2: ( ruleXCollectionLiteral )
+                    // InternalDataDSL.g:3950:2: ( ruleXCollectionLiteral )
                     {
-                    // InternalDataDSL.g:3701:2: ( ruleXCollectionLiteral )
-                    // InternalDataDSL.g:3702:3: ruleXCollectionLiteral
+                    // InternalDataDSL.g:3950:2: ( ruleXCollectionLiteral )
+                    // InternalDataDSL.g:3951:3: ruleXCollectionLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXCollectionLiteralParserRuleCall_0()); 
@@ -13380,16 +14395,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3707:2: ( ( ruleXClosure ) )
+                    // InternalDataDSL.g:3956:2: ( ( ruleXClosure ) )
                     {
-                    // InternalDataDSL.g:3707:2: ( ( ruleXClosure ) )
-                    // InternalDataDSL.g:3708:3: ( ruleXClosure )
+                    // InternalDataDSL.g:3956:2: ( ( ruleXClosure ) )
+                    // InternalDataDSL.g:3957:3: ( ruleXClosure )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXClosureParserRuleCall_1()); 
                     }
-                    // InternalDataDSL.g:3709:3: ( ruleXClosure )
-                    // InternalDataDSL.g:3709:4: ruleXClosure
+                    // InternalDataDSL.g:3958:3: ( ruleXClosure )
+                    // InternalDataDSL.g:3958:4: ruleXClosure
                     {
                     pushFollow(FOLLOW_2);
                     ruleXClosure();
@@ -13409,10 +14424,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3713:2: ( ruleXBooleanLiteral )
+                    // InternalDataDSL.g:3962:2: ( ruleXBooleanLiteral )
                     {
-                    // InternalDataDSL.g:3713:2: ( ruleXBooleanLiteral )
-                    // InternalDataDSL.g:3714:3: ruleXBooleanLiteral
+                    // InternalDataDSL.g:3962:2: ( ruleXBooleanLiteral )
+                    // InternalDataDSL.g:3963:3: ruleXBooleanLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXBooleanLiteralParserRuleCall_2()); 
@@ -13432,10 +14447,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3719:2: ( ruleXNumberLiteral )
+                    // InternalDataDSL.g:3968:2: ( ruleXNumberLiteral )
                     {
-                    // InternalDataDSL.g:3719:2: ( ruleXNumberLiteral )
-                    // InternalDataDSL.g:3720:3: ruleXNumberLiteral
+                    // InternalDataDSL.g:3968:2: ( ruleXNumberLiteral )
+                    // InternalDataDSL.g:3969:3: ruleXNumberLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXNumberLiteralParserRuleCall_3()); 
@@ -13455,10 +14470,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3725:2: ( ruleXNullLiteral )
+                    // InternalDataDSL.g:3974:2: ( ruleXNullLiteral )
                     {
-                    // InternalDataDSL.g:3725:2: ( ruleXNullLiteral )
-                    // InternalDataDSL.g:3726:3: ruleXNullLiteral
+                    // InternalDataDSL.g:3974:2: ( ruleXNullLiteral )
+                    // InternalDataDSL.g:3975:3: ruleXNullLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXNullLiteralParserRuleCall_4()); 
@@ -13478,10 +14493,10 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:3731:2: ( ruleXStringLiteral )
+                    // InternalDataDSL.g:3980:2: ( ruleXStringLiteral )
                     {
-                    // InternalDataDSL.g:3731:2: ( ruleXStringLiteral )
-                    // InternalDataDSL.g:3732:3: ruleXStringLiteral
+                    // InternalDataDSL.g:3980:2: ( ruleXStringLiteral )
+                    // InternalDataDSL.g:3981:3: ruleXStringLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXStringLiteralParserRuleCall_5()); 
@@ -13501,10 +14516,10 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:3737:2: ( ruleXTypeLiteral )
+                    // InternalDataDSL.g:3986:2: ( ruleXTypeLiteral )
                     {
-                    // InternalDataDSL.g:3737:2: ( ruleXTypeLiteral )
-                    // InternalDataDSL.g:3738:3: ruleXTypeLiteral
+                    // InternalDataDSL.g:3986:2: ( ruleXTypeLiteral )
+                    // InternalDataDSL.g:3987:3: ruleXTypeLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXLiteralAccess().getXTypeLiteralParserRuleCall_6()); 
@@ -13541,29 +14556,29 @@
 
 
     // $ANTLR start "rule__XCollectionLiteral__Alternatives"
-    // InternalDataDSL.g:3747:1: rule__XCollectionLiteral__Alternatives : ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) );
+    // InternalDataDSL.g:3996:1: rule__XCollectionLiteral__Alternatives : ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) );
     public final void rule__XCollectionLiteral__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3751:1: ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) )
-            int alt32=2;
-            int LA32_0 = input.LA(1);
+            // InternalDataDSL.g:4000:1: ( ( ruleXSetLiteral ) | ( ruleXListLiteral ) )
+            int alt35=2;
+            int LA35_0 = input.LA(1);
 
-            if ( (LA32_0==126) ) {
-                int LA32_1 = input.LA(2);
+            if ( (LA35_0==132) ) {
+                int LA35_1 = input.LA(2);
 
-                if ( (LA32_1==127) ) {
-                    alt32=2;
+                if ( (LA35_1==74) ) {
+                    alt35=1;
                 }
-                else if ( (LA32_1==74) ) {
-                    alt32=1;
+                else if ( (LA35_1==133) ) {
+                    alt35=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 32, 1, input);
+                        new NoViableAltException("", 35, 1, input);
 
                     throw nvae;
                 }
@@ -13571,16 +14586,16 @@
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 32, 0, input);
+                    new NoViableAltException("", 35, 0, input);
 
                 throw nvae;
             }
-            switch (alt32) {
+            switch (alt35) {
                 case 1 :
-                    // InternalDataDSL.g:3752:2: ( ruleXSetLiteral )
+                    // InternalDataDSL.g:4001:2: ( ruleXSetLiteral )
                     {
-                    // InternalDataDSL.g:3752:2: ( ruleXSetLiteral )
-                    // InternalDataDSL.g:3753:3: ruleXSetLiteral
+                    // InternalDataDSL.g:4001:2: ( ruleXSetLiteral )
+                    // InternalDataDSL.g:4002:3: ruleXSetLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCollectionLiteralAccess().getXSetLiteralParserRuleCall_0()); 
@@ -13600,10 +14615,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3758:2: ( ruleXListLiteral )
+                    // InternalDataDSL.g:4007:2: ( ruleXListLiteral )
                     {
-                    // InternalDataDSL.g:3758:2: ( ruleXListLiteral )
-                    // InternalDataDSL.g:3759:3: ruleXListLiteral
+                    // InternalDataDSL.g:4007:2: ( ruleXListLiteral )
+                    // InternalDataDSL.g:4008:3: ruleXListLiteral
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCollectionLiteralAccess().getXListLiteralParserRuleCall_1()); 
@@ -13640,27 +14655,27 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Alternatives_2"
-    // InternalDataDSL.g:3768:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );
+    // InternalDataDSL.g:4017:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );
     public final void rule__XSwitchExpression__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3772:1: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) )
-            int alt33=2;
-            alt33 = dfa33.predict(input);
-            switch (alt33) {
+            // InternalDataDSL.g:4021:1: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) )
+            int alt36=2;
+            alt36 = dfa36.predict(input);
+            switch (alt36) {
                 case 1 :
-                    // InternalDataDSL.g:3773:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4022:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
                     {
-                    // InternalDataDSL.g:3773:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
-                    // InternalDataDSL.g:3774:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    // InternalDataDSL.g:4022:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4023:3: ( rule__XSwitchExpression__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
                     }
-                    // InternalDataDSL.g:3775:3: ( rule__XSwitchExpression__Group_2_0__0 )
-                    // InternalDataDSL.g:3775:4: rule__XSwitchExpression__Group_2_0__0
+                    // InternalDataDSL.g:4024:3: ( rule__XSwitchExpression__Group_2_0__0 )
+                    // InternalDataDSL.g:4024:4: rule__XSwitchExpression__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_0__0();
@@ -13680,16 +14695,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3779:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    // InternalDataDSL.g:4028:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
                     {
-                    // InternalDataDSL.g:3779:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
-                    // InternalDataDSL.g:3780:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    // InternalDataDSL.g:4028:2: ( ( rule__XSwitchExpression__Group_2_1__0 ) )
+                    // InternalDataDSL.g:4029:3: ( rule__XSwitchExpression__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1()); 
                     }
-                    // InternalDataDSL.g:3781:3: ( rule__XSwitchExpression__Group_2_1__0 )
-                    // InternalDataDSL.g:3781:4: rule__XSwitchExpression__Group_2_1__0
+                    // InternalDataDSL.g:4030:3: ( rule__XSwitchExpression__Group_2_1__0 )
+                    // InternalDataDSL.g:4030:4: rule__XSwitchExpression__Group_2_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_1__0();
@@ -13726,41 +14741,41 @@
 
 
     // $ANTLR start "rule__XCasePart__Alternatives_3"
-    // InternalDataDSL.g:3789:1: rule__XCasePart__Alternatives_3 : ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) );
+    // InternalDataDSL.g:4038:1: rule__XCasePart__Alternatives_3 : ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) );
     public final void rule__XCasePart__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3793:1: ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) )
-            int alt34=2;
-            int LA34_0 = input.LA(1);
+            // InternalDataDSL.g:4042:1: ( ( ( rule__XCasePart__Group_3_0__0 ) ) | ( ( rule__XCasePart__FallThroughAssignment_3_1 ) ) )
+            int alt37=2;
+            int LA37_0 = input.LA(1);
 
-            if ( (LA34_0==132) ) {
-                alt34=1;
+            if ( (LA37_0==138) ) {
+                alt37=1;
             }
-            else if ( (LA34_0==124) ) {
-                alt34=2;
+            else if ( (LA37_0==130) ) {
+                alt37=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 34, 0, input);
+                    new NoViableAltException("", 37, 0, input);
 
                 throw nvae;
             }
-            switch (alt34) {
+            switch (alt37) {
                 case 1 :
-                    // InternalDataDSL.g:3794:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    // InternalDataDSL.g:4043:2: ( ( rule__XCasePart__Group_3_0__0 ) )
                     {
-                    // InternalDataDSL.g:3794:2: ( ( rule__XCasePart__Group_3_0__0 ) )
-                    // InternalDataDSL.g:3795:3: ( rule__XCasePart__Group_3_0__0 )
+                    // InternalDataDSL.g:4043:2: ( ( rule__XCasePart__Group_3_0__0 ) )
+                    // InternalDataDSL.g:4044:3: ( rule__XCasePart__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCasePartAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:3796:3: ( rule__XCasePart__Group_3_0__0 )
-                    // InternalDataDSL.g:3796:4: rule__XCasePart__Group_3_0__0
+                    // InternalDataDSL.g:4045:3: ( rule__XCasePart__Group_3_0__0 )
+                    // InternalDataDSL.g:4045:4: rule__XCasePart__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__Group_3_0__0();
@@ -13780,16 +14795,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3800:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    // InternalDataDSL.g:4049:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
                     {
-                    // InternalDataDSL.g:3800:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
-                    // InternalDataDSL.g:3801:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    // InternalDataDSL.g:4049:2: ( ( rule__XCasePart__FallThroughAssignment_3_1 ) )
+                    // InternalDataDSL.g:4050:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXCasePartAccess().getFallThroughAssignment_3_1()); 
                     }
-                    // InternalDataDSL.g:3802:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
-                    // InternalDataDSL.g:3802:4: rule__XCasePart__FallThroughAssignment_3_1
+                    // InternalDataDSL.g:4051:3: ( rule__XCasePart__FallThroughAssignment_3_1 )
+                    // InternalDataDSL.g:4051:4: rule__XCasePart__FallThroughAssignment_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__FallThroughAssignment_3_1();
@@ -13826,35 +14841,35 @@
 
 
     // $ANTLR start "rule__XExpressionOrVarDeclaration__Alternatives"
-    // InternalDataDSL.g:3810:1: rule__XExpressionOrVarDeclaration__Alternatives : ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) );
+    // InternalDataDSL.g:4059:1: rule__XExpressionOrVarDeclaration__Alternatives : ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) );
     public final void rule__XExpressionOrVarDeclaration__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3814:1: ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) )
-            int alt35=2;
-            int LA35_0 = input.LA(1);
+            // InternalDataDSL.g:4063:1: ( ( ruleXVariableDeclaration ) | ( ruleXExpression ) )
+            int alt38=2;
+            int LA38_0 = input.LA(1);
 
-            if ( (LA35_0==44||LA35_0==165) ) {
-                alt35=1;
+            if ( (LA38_0==44||LA38_0==178) ) {
+                alt38=1;
             }
-            else if ( ((LA35_0>=RULE_STRING && LA35_0<=RULE_DECIMAL)||LA35_0==27||(LA35_0>=34 && LA35_0<=35)||LA35_0==40||(LA35_0>=45 && LA35_0<=50)||LA35_0==74||LA35_0==101||LA35_0==122||(LA35_0>=126 && LA35_0<=127)||LA35_0==129||LA35_0==131||(LA35_0>=135 && LA35_0<=142)||LA35_0==144||LA35_0==166) ) {
-                alt35=2;
+            else if ( ((LA38_0>=RULE_STRING && LA38_0<=RULE_DECIMAL)||LA38_0==27||(LA38_0>=34 && LA38_0<=35)||LA38_0==40||(LA38_0>=45 && LA38_0<=50)||LA38_0==74||LA38_0==103||LA38_0==128||(LA38_0>=132 && LA38_0<=133)||LA38_0==135||LA38_0==137||(LA38_0>=141 && LA38_0<=148)||LA38_0==150||LA38_0==179) ) {
+                alt38=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 35, 0, input);
+                    new NoViableAltException("", 38, 0, input);
 
                 throw nvae;
             }
-            switch (alt35) {
+            switch (alt38) {
                 case 1 :
-                    // InternalDataDSL.g:3815:2: ( ruleXVariableDeclaration )
+                    // InternalDataDSL.g:4064:2: ( ruleXVariableDeclaration )
                     {
-                    // InternalDataDSL.g:3815:2: ( ruleXVariableDeclaration )
-                    // InternalDataDSL.g:3816:3: ruleXVariableDeclaration
+                    // InternalDataDSL.g:4064:2: ( ruleXVariableDeclaration )
+                    // InternalDataDSL.g:4065:3: ruleXVariableDeclaration
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXVariableDeclarationParserRuleCall_0()); 
@@ -13874,10 +14889,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3821:2: ( ruleXExpression )
+                    // InternalDataDSL.g:4070:2: ( ruleXExpression )
                     {
-                    // InternalDataDSL.g:3821:2: ( ruleXExpression )
-                    // InternalDataDSL.g:3822:3: ruleXExpression
+                    // InternalDataDSL.g:4070:2: ( ruleXExpression )
+                    // InternalDataDSL.g:4071:3: ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXExpressionOrVarDeclarationAccess().getXExpressionParserRuleCall_1()); 
@@ -13914,41 +14929,41 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Alternatives_1"
-    // InternalDataDSL.g:3831:1: rule__XVariableDeclaration__Alternatives_1 : ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) );
+    // InternalDataDSL.g:4080:1: rule__XVariableDeclaration__Alternatives_1 : ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) );
     public final void rule__XVariableDeclaration__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3835:1: ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) )
-            int alt36=2;
-            int LA36_0 = input.LA(1);
+            // InternalDataDSL.g:4084:1: ( ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) ) | ( 'val' ) )
+            int alt39=2;
+            int LA39_0 = input.LA(1);
 
-            if ( (LA36_0==165) ) {
-                alt36=1;
+            if ( (LA39_0==178) ) {
+                alt39=1;
             }
-            else if ( (LA36_0==44) ) {
-                alt36=2;
+            else if ( (LA39_0==44) ) {
+                alt39=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 36, 0, input);
+                    new NoViableAltException("", 39, 0, input);
 
                 throw nvae;
             }
-            switch (alt36) {
+            switch (alt39) {
                 case 1 :
-                    // InternalDataDSL.g:3836:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    // InternalDataDSL.g:4085:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
                     {
-                    // InternalDataDSL.g:3836:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
-                    // InternalDataDSL.g:3837:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    // InternalDataDSL.g:4085:2: ( ( rule__XVariableDeclaration__WriteableAssignment_1_0 ) )
+                    // InternalDataDSL.g:4086:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getWriteableAssignment_1_0()); 
                     }
-                    // InternalDataDSL.g:3838:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
-                    // InternalDataDSL.g:3838:4: rule__XVariableDeclaration__WriteableAssignment_1_0
+                    // InternalDataDSL.g:4087:3: ( rule__XVariableDeclaration__WriteableAssignment_1_0 )
+                    // InternalDataDSL.g:4087:4: rule__XVariableDeclaration__WriteableAssignment_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__WriteableAssignment_1_0();
@@ -13968,10 +14983,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3842:2: ( 'val' )
+                    // InternalDataDSL.g:4091:2: ( 'val' )
                     {
-                    // InternalDataDSL.g:3842:2: ( 'val' )
-                    // InternalDataDSL.g:3843:3: 'val'
+                    // InternalDataDSL.g:4091:2: ( 'val' )
+                    // InternalDataDSL.g:4092:3: 'val'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1()); 
@@ -14004,55 +15019,55 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Alternatives_2"
-    // InternalDataDSL.g:3852:1: rule__XVariableDeclaration__Alternatives_2 : ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) );
+    // InternalDataDSL.g:4101:1: rule__XVariableDeclaration__Alternatives_2 : ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) );
     public final void rule__XVariableDeclaration__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3856:1: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) )
-            int alt37=2;
-            int LA37_0 = input.LA(1);
+            // InternalDataDSL.g:4105:1: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) | ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) ) )
+            int alt40=2;
+            int LA40_0 = input.LA(1);
 
-            if ( (LA37_0==RULE_ID) ) {
-                int LA37_1 = input.LA(2);
+            if ( (LA40_0==RULE_ID) ) {
+                int LA40_1 = input.LA(2);
 
-                if ( (synpred79_InternalDataDSL()) ) {
-                    alt37=1;
+                if ( (synpred88_InternalDataDSL()) ) {
+                    alt40=1;
                 }
                 else if ( (true) ) {
-                    alt37=2;
+                    alt40=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return ;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 37, 1, input);
+                        new NoViableAltException("", 40, 1, input);
 
                     throw nvae;
                 }
             }
-            else if ( (LA37_0==31||LA37_0==122) ) {
-                alt37=1;
+            else if ( (LA40_0==31||LA40_0==128) ) {
+                alt40=1;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 37, 0, input);
+                    new NoViableAltException("", 40, 0, input);
 
                 throw nvae;
             }
-            switch (alt37) {
+            switch (alt40) {
                 case 1 :
-                    // InternalDataDSL.g:3857:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4106:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
                     {
-                    // InternalDataDSL.g:3857:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
-                    // InternalDataDSL.g:3858:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    // InternalDataDSL.g:4106:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4107:3: ( rule__XVariableDeclaration__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
                     }
-                    // InternalDataDSL.g:3859:3: ( rule__XVariableDeclaration__Group_2_0__0 )
-                    // InternalDataDSL.g:3859:4: rule__XVariableDeclaration__Group_2_0__0
+                    // InternalDataDSL.g:4108:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+                    // InternalDataDSL.g:4108:4: rule__XVariableDeclaration__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__Group_2_0__0();
@@ -14072,16 +15087,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3863:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    // InternalDataDSL.g:4112:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
                     {
-                    // InternalDataDSL.g:3863:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
-                    // InternalDataDSL.g:3864:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    // InternalDataDSL.g:4112:2: ( ( rule__XVariableDeclaration__NameAssignment_2_1 ) )
+                    // InternalDataDSL.g:4113:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_1()); 
                     }
-                    // InternalDataDSL.g:3865:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
-                    // InternalDataDSL.g:3865:4: rule__XVariableDeclaration__NameAssignment_2_1
+                    // InternalDataDSL.g:4114:3: ( rule__XVariableDeclaration__NameAssignment_2_1 )
+                    // InternalDataDSL.g:4114:4: rule__XVariableDeclaration__NameAssignment_2_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__NameAssignment_2_1();
@@ -14118,27 +15133,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Alternatives_3_1"
-    // InternalDataDSL.g:3873:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );
+    // InternalDataDSL.g:4122:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );
     public final void rule__XFeatureCall__Alternatives_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3877:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) )
-            int alt38=2;
-            alt38 = dfa38.predict(input);
-            switch (alt38) {
+            // InternalDataDSL.g:4126:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) )
+            int alt41=2;
+            alt41 = dfa41.predict(input);
+            switch (alt41) {
                 case 1 :
-                    // InternalDataDSL.g:3878:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    // InternalDataDSL.g:4127:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
                     {
-                    // InternalDataDSL.g:3878:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
-                    // InternalDataDSL.g:3879:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    // InternalDataDSL.g:4127:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+                    // InternalDataDSL.g:4128:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
                     }
-                    // InternalDataDSL.g:3880:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
-                    // InternalDataDSL.g:3880:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+                    // InternalDataDSL.g:4129:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+                    // InternalDataDSL.g:4129:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
@@ -14158,16 +15173,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3884:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    // InternalDataDSL.g:4133:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
                     {
-                    // InternalDataDSL.g:3884:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
-                    // InternalDataDSL.g:3885:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    // InternalDataDSL.g:4133:2: ( ( rule__XFeatureCall__Group_3_1_1__0 ) )
+                    // InternalDataDSL.g:4134:3: ( rule__XFeatureCall__Group_3_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1()); 
                     }
-                    // InternalDataDSL.g:3886:3: ( rule__XFeatureCall__Group_3_1_1__0 )
-                    // InternalDataDSL.g:3886:4: rule__XFeatureCall__Group_3_1_1__0
+                    // InternalDataDSL.g:4135:3: ( rule__XFeatureCall__Group_3_1_1__0 )
+                    // InternalDataDSL.g:4135:4: rule__XFeatureCall__Group_3_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_3_1_1__0();
@@ -14204,54 +15219,54 @@
 
 
     // $ANTLR start "rule__FeatureCallID__Alternatives"
-    // InternalDataDSL.g:3894:1: rule__FeatureCallID__Alternatives : ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) );
+    // InternalDataDSL.g:4143:1: rule__FeatureCallID__Alternatives : ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) );
     public final void rule__FeatureCallID__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3898:1: ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) )
-            int alt39=5;
+            // InternalDataDSL.g:4147:1: ( ( ruleValidID ) | ( 'extends' ) | ( 'static' ) | ( 'import' ) | ( 'extension' ) )
+            int alt42=5;
             switch ( input.LA(1) ) {
             case RULE_ID:
                 {
-                alt39=1;
+                alt42=1;
                 }
                 break;
             case 45:
                 {
-                alt39=2;
+                alt42=2;
                 }
                 break;
             case 46:
                 {
-                alt39=3;
+                alt42=3;
                 }
                 break;
             case 47:
                 {
-                alt39=4;
+                alt42=4;
                 }
                 break;
             case 48:
                 {
-                alt39=5;
+                alt42=5;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 39, 0, input);
+                    new NoViableAltException("", 42, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt39) {
+            switch (alt42) {
                 case 1 :
-                    // InternalDataDSL.g:3899:2: ( ruleValidID )
+                    // InternalDataDSL.g:4148:2: ( ruleValidID )
                     {
-                    // InternalDataDSL.g:3899:2: ( ruleValidID )
-                    // InternalDataDSL.g:3900:3: ruleValidID
+                    // InternalDataDSL.g:4148:2: ( ruleValidID )
+                    // InternalDataDSL.g:4149:3: ruleValidID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getValidIDParserRuleCall_0()); 
@@ -14271,10 +15286,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3905:2: ( 'extends' )
+                    // InternalDataDSL.g:4154:2: ( 'extends' )
                     {
-                    // InternalDataDSL.g:3905:2: ( 'extends' )
-                    // InternalDataDSL.g:3906:3: 'extends'
+                    // InternalDataDSL.g:4154:2: ( 'extends' )
+                    // InternalDataDSL.g:4155:3: 'extends'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getExtendsKeyword_1()); 
@@ -14290,10 +15305,10 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3911:2: ( 'static' )
+                    // InternalDataDSL.g:4160:2: ( 'static' )
                     {
-                    // InternalDataDSL.g:3911:2: ( 'static' )
-                    // InternalDataDSL.g:3912:3: 'static'
+                    // InternalDataDSL.g:4160:2: ( 'static' )
+                    // InternalDataDSL.g:4161:3: 'static'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getStaticKeyword_2()); 
@@ -14309,10 +15324,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3917:2: ( 'import' )
+                    // InternalDataDSL.g:4166:2: ( 'import' )
                     {
-                    // InternalDataDSL.g:3917:2: ( 'import' )
-                    // InternalDataDSL.g:3918:3: 'import'
+                    // InternalDataDSL.g:4166:2: ( 'import' )
+                    // InternalDataDSL.g:4167:3: 'import'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getImportKeyword_3()); 
@@ -14328,10 +15343,10 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3923:2: ( 'extension' )
+                    // InternalDataDSL.g:4172:2: ( 'extension' )
                     {
-                    // InternalDataDSL.g:3923:2: ( 'extension' )
-                    // InternalDataDSL.g:3924:3: 'extension'
+                    // InternalDataDSL.g:4172:2: ( 'extension' )
+                    // InternalDataDSL.g:4173:3: 'extension'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getFeatureCallIDAccess().getExtensionKeyword_4()); 
@@ -14364,35 +15379,35 @@
 
 
     // $ANTLR start "rule__IdOrSuper__Alternatives"
-    // InternalDataDSL.g:3933:1: rule__IdOrSuper__Alternatives : ( ( ruleFeatureCallID ) | ( 'super' ) );
+    // InternalDataDSL.g:4182:1: rule__IdOrSuper__Alternatives : ( ( ruleFeatureCallID ) | ( 'super' ) );
     public final void rule__IdOrSuper__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3937:1: ( ( ruleFeatureCallID ) | ( 'super' ) )
-            int alt40=2;
-            int LA40_0 = input.LA(1);
+            // InternalDataDSL.g:4186:1: ( ( ruleFeatureCallID ) | ( 'super' ) )
+            int alt43=2;
+            int LA43_0 = input.LA(1);
 
-            if ( (LA40_0==RULE_ID||(LA40_0>=45 && LA40_0<=48)) ) {
-                alt40=1;
+            if ( (LA43_0==RULE_ID||(LA43_0>=45 && LA43_0<=48)) ) {
+                alt43=1;
             }
-            else if ( (LA40_0==49) ) {
-                alt40=2;
+            else if ( (LA43_0==49) ) {
+                alt43=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 40, 0, input);
+                    new NoViableAltException("", 43, 0, input);
 
                 throw nvae;
             }
-            switch (alt40) {
+            switch (alt43) {
                 case 1 :
-                    // InternalDataDSL.g:3938:2: ( ruleFeatureCallID )
+                    // InternalDataDSL.g:4187:2: ( ruleFeatureCallID )
                     {
-                    // InternalDataDSL.g:3938:2: ( ruleFeatureCallID )
-                    // InternalDataDSL.g:3939:3: ruleFeatureCallID
+                    // InternalDataDSL.g:4187:2: ( ruleFeatureCallID )
+                    // InternalDataDSL.g:4188:3: ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdOrSuperAccess().getFeatureCallIDParserRuleCall_0()); 
@@ -14412,10 +15427,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3944:2: ( 'super' )
+                    // InternalDataDSL.g:4193:2: ( 'super' )
                     {
-                    // InternalDataDSL.g:3944:2: ( 'super' )
-                    // InternalDataDSL.g:3945:3: 'super'
+                    // InternalDataDSL.g:4193:2: ( 'super' )
+                    // InternalDataDSL.g:4194:3: 'super'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getIdOrSuperAccess().getSuperKeyword_1()); 
@@ -14448,27 +15463,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Alternatives_4_1"
-    // InternalDataDSL.g:3954:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );
+    // InternalDataDSL.g:4203:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );
     public final void rule__XConstructorCall__Alternatives_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3958:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) )
-            int alt41=2;
-            alt41 = dfa41.predict(input);
-            switch (alt41) {
+            // InternalDataDSL.g:4207:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) )
+            int alt44=2;
+            alt44 = dfa44.predict(input);
+            switch (alt44) {
                 case 1 :
-                    // InternalDataDSL.g:3959:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    // InternalDataDSL.g:4208:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
                     {
-                    // InternalDataDSL.g:3959:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
-                    // InternalDataDSL.g:3960:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    // InternalDataDSL.g:4208:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+                    // InternalDataDSL.g:4209:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
                     }
-                    // InternalDataDSL.g:3961:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
-                    // InternalDataDSL.g:3961:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+                    // InternalDataDSL.g:4210:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+                    // InternalDataDSL.g:4210:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__ArgumentsAssignment_4_1_0();
@@ -14488,16 +15503,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3965:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    // InternalDataDSL.g:4214:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
                     {
-                    // InternalDataDSL.g:3965:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
-                    // InternalDataDSL.g:3966:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    // InternalDataDSL.g:4214:2: ( ( rule__XConstructorCall__Group_4_1_1__0 ) )
+                    // InternalDataDSL.g:4215:3: ( rule__XConstructorCall__Group_4_1_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1()); 
                     }
-                    // InternalDataDSL.g:3967:3: ( rule__XConstructorCall__Group_4_1_1__0 )
-                    // InternalDataDSL.g:3967:4: rule__XConstructorCall__Group_4_1_1__0
+                    // InternalDataDSL.g:4216:3: ( rule__XConstructorCall__Group_4_1_1__0 )
+                    // InternalDataDSL.g:4216:4: rule__XConstructorCall__Group_4_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_4_1_1__0();
@@ -14534,35 +15549,35 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Alternatives_1"
-    // InternalDataDSL.g:3975:1: rule__XBooleanLiteral__Alternatives_1 : ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) );
+    // InternalDataDSL.g:4224:1: rule__XBooleanLiteral__Alternatives_1 : ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) );
     public final void rule__XBooleanLiteral__Alternatives_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:3979:1: ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) )
-            int alt42=2;
-            int LA42_0 = input.LA(1);
+            // InternalDataDSL.g:4228:1: ( ( 'false' ) | ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) ) )
+            int alt45=2;
+            int LA45_0 = input.LA(1);
 
-            if ( (LA42_0==50) ) {
-                alt42=1;
+            if ( (LA45_0==50) ) {
+                alt45=1;
             }
-            else if ( (LA42_0==166) ) {
-                alt42=2;
+            else if ( (LA45_0==179) ) {
+                alt45=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 42, 0, input);
+                    new NoViableAltException("", 45, 0, input);
 
                 throw nvae;
             }
-            switch (alt42) {
+            switch (alt45) {
                 case 1 :
-                    // InternalDataDSL.g:3980:2: ( 'false' )
+                    // InternalDataDSL.g:4229:2: ( 'false' )
                     {
-                    // InternalDataDSL.g:3980:2: ( 'false' )
-                    // InternalDataDSL.g:3981:3: 'false'
+                    // InternalDataDSL.g:4229:2: ( 'false' )
+                    // InternalDataDSL.g:4230:3: 'false'
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0()); 
@@ -14578,16 +15593,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3986:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    // InternalDataDSL.g:4235:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
                     {
-                    // InternalDataDSL.g:3986:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
-                    // InternalDataDSL.g:3987:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    // InternalDataDSL.g:4235:2: ( ( rule__XBooleanLiteral__IsTrueAssignment_1_1 ) )
+                    // InternalDataDSL.g:4236:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXBooleanLiteralAccess().getIsTrueAssignment_1_1()); 
                     }
-                    // InternalDataDSL.g:3988:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
-                    // InternalDataDSL.g:3988:4: rule__XBooleanLiteral__IsTrueAssignment_1_1
+                    // InternalDataDSL.g:4237:3: ( rule__XBooleanLiteral__IsTrueAssignment_1_1 )
+                    // InternalDataDSL.g:4237:4: rule__XBooleanLiteral__IsTrueAssignment_1_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBooleanLiteral__IsTrueAssignment_1_1();
@@ -14624,41 +15639,41 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Alternatives_3"
-    // InternalDataDSL.g:3996:1: rule__XTryCatchFinallyExpression__Alternatives_3 : ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) );
+    // InternalDataDSL.g:4245:1: rule__XTryCatchFinallyExpression__Alternatives_3 : ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) );
     public final void rule__XTryCatchFinallyExpression__Alternatives_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4000:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) )
-            int alt43=2;
-            int LA43_0 = input.LA(1);
+            // InternalDataDSL.g:4249:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) ) | ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) ) )
+            int alt46=2;
+            int LA46_0 = input.LA(1);
 
-            if ( (LA43_0==145) ) {
-                alt43=1;
+            if ( (LA46_0==151) ) {
+                alt46=1;
             }
-            else if ( (LA43_0==143) ) {
-                alt43=2;
+            else if ( (LA46_0==149) ) {
+                alt46=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 43, 0, input);
+                    new NoViableAltException("", 46, 0, input);
 
                 throw nvae;
             }
-            switch (alt43) {
+            switch (alt46) {
                 case 1 :
-                    // InternalDataDSL.g:4001:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    // InternalDataDSL.g:4250:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
                     {
-                    // InternalDataDSL.g:4001:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
-                    // InternalDataDSL.g:4002:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    // InternalDataDSL.g:4250:2: ( ( rule__XTryCatchFinallyExpression__Group_3_0__0 ) )
+                    // InternalDataDSL.g:4251:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:4003:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
-                    // InternalDataDSL.g:4003:4: rule__XTryCatchFinallyExpression__Group_3_0__0
+                    // InternalDataDSL.g:4252:3: ( rule__XTryCatchFinallyExpression__Group_3_0__0 )
+                    // InternalDataDSL.g:4252:4: rule__XTryCatchFinallyExpression__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_0__0();
@@ -14678,16 +15693,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4007:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    // InternalDataDSL.g:4256:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
                     {
-                    // InternalDataDSL.g:4007:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
-                    // InternalDataDSL.g:4008:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    // InternalDataDSL.g:4256:2: ( ( rule__XTryCatchFinallyExpression__Group_3_1__0 ) )
+                    // InternalDataDSL.g:4257:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:4009:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
-                    // InternalDataDSL.g:4009:4: rule__XTryCatchFinallyExpression__Group_3_1__0
+                    // InternalDataDSL.g:4258:3: ( rule__XTryCatchFinallyExpression__Group_3_1__0 )
+                    // InternalDataDSL.g:4258:4: rule__XTryCatchFinallyExpression__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_1__0();
@@ -14724,35 +15739,35 @@
 
 
     // $ANTLR start "rule__Number__Alternatives"
-    // InternalDataDSL.g:4017:1: rule__Number__Alternatives : ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) );
+    // InternalDataDSL.g:4266:1: rule__Number__Alternatives : ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) );
     public final void rule__Number__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4021:1: ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) )
-            int alt44=2;
-            int LA44_0 = input.LA(1);
+            // InternalDataDSL.g:4270:1: ( ( RULE_HEX ) | ( ( rule__Number__Group_1__0 ) ) )
+            int alt47=2;
+            int LA47_0 = input.LA(1);
 
-            if ( (LA44_0==RULE_HEX) ) {
-                alt44=1;
+            if ( (LA47_0==RULE_HEX) ) {
+                alt47=1;
             }
-            else if ( ((LA44_0>=RULE_INT && LA44_0<=RULE_DECIMAL)) ) {
-                alt44=2;
+            else if ( ((LA47_0>=RULE_INT && LA47_0<=RULE_DECIMAL)) ) {
+                alt47=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 44, 0, input);
+                    new NoViableAltException("", 47, 0, input);
 
                 throw nvae;
             }
-            switch (alt44) {
+            switch (alt47) {
                 case 1 :
-                    // InternalDataDSL.g:4022:2: ( RULE_HEX )
+                    // InternalDataDSL.g:4271:2: ( RULE_HEX )
                     {
-                    // InternalDataDSL.g:4022:2: ( RULE_HEX )
-                    // InternalDataDSL.g:4023:3: RULE_HEX
+                    // InternalDataDSL.g:4271:2: ( RULE_HEX )
+                    // InternalDataDSL.g:4272:3: RULE_HEX
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getHEXTerminalRuleCall_0()); 
@@ -14768,16 +15783,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4028:2: ( ( rule__Number__Group_1__0 ) )
+                    // InternalDataDSL.g:4277:2: ( ( rule__Number__Group_1__0 ) )
                     {
-                    // InternalDataDSL.g:4028:2: ( ( rule__Number__Group_1__0 ) )
-                    // InternalDataDSL.g:4029:3: ( rule__Number__Group_1__0 )
+                    // InternalDataDSL.g:4277:2: ( ( rule__Number__Group_1__0 ) )
+                    // InternalDataDSL.g:4278:3: ( rule__Number__Group_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getGroup_1()); 
                     }
-                    // InternalDataDSL.g:4030:3: ( rule__Number__Group_1__0 )
-                    // InternalDataDSL.g:4030:4: rule__Number__Group_1__0
+                    // InternalDataDSL.g:4279:3: ( rule__Number__Group_1__0 )
+                    // InternalDataDSL.g:4279:4: rule__Number__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Number__Group_1__0();
@@ -14814,35 +15829,35 @@
 
 
     // $ANTLR start "rule__Number__Alternatives_1_0"
-    // InternalDataDSL.g:4038:1: rule__Number__Alternatives_1_0 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    // InternalDataDSL.g:4287:1: rule__Number__Alternatives_1_0 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
     public final void rule__Number__Alternatives_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4042:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
-            int alt45=2;
-            int LA45_0 = input.LA(1);
+            // InternalDataDSL.g:4291:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            int alt48=2;
+            int LA48_0 = input.LA(1);
 
-            if ( (LA45_0==RULE_INT) ) {
-                alt45=1;
+            if ( (LA48_0==RULE_INT) ) {
+                alt48=1;
             }
-            else if ( (LA45_0==RULE_DECIMAL) ) {
-                alt45=2;
+            else if ( (LA48_0==RULE_DECIMAL) ) {
+                alt48=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 45, 0, input);
+                    new NoViableAltException("", 48, 0, input);
 
                 throw nvae;
             }
-            switch (alt45) {
+            switch (alt48) {
                 case 1 :
-                    // InternalDataDSL.g:4043:2: ( RULE_INT )
+                    // InternalDataDSL.g:4292:2: ( RULE_INT )
                     {
-                    // InternalDataDSL.g:4043:2: ( RULE_INT )
-                    // InternalDataDSL.g:4044:3: RULE_INT
+                    // InternalDataDSL.g:4292:2: ( RULE_INT )
+                    // InternalDataDSL.g:4293:3: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_0_0()); 
@@ -14858,10 +15873,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4049:2: ( RULE_DECIMAL )
+                    // InternalDataDSL.g:4298:2: ( RULE_DECIMAL )
                     {
-                    // InternalDataDSL.g:4049:2: ( RULE_DECIMAL )
-                    // InternalDataDSL.g:4050:3: RULE_DECIMAL
+                    // InternalDataDSL.g:4298:2: ( RULE_DECIMAL )
+                    // InternalDataDSL.g:4299:3: RULE_DECIMAL
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_0_1()); 
@@ -14894,35 +15909,35 @@
 
 
     // $ANTLR start "rule__Number__Alternatives_1_1_1"
-    // InternalDataDSL.g:4059:1: rule__Number__Alternatives_1_1_1 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
+    // InternalDataDSL.g:4308:1: rule__Number__Alternatives_1_1_1 : ( ( RULE_INT ) | ( RULE_DECIMAL ) );
     public final void rule__Number__Alternatives_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4063:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
-            int alt46=2;
-            int LA46_0 = input.LA(1);
+            // InternalDataDSL.g:4312:1: ( ( RULE_INT ) | ( RULE_DECIMAL ) )
+            int alt49=2;
+            int LA49_0 = input.LA(1);
 
-            if ( (LA46_0==RULE_INT) ) {
-                alt46=1;
+            if ( (LA49_0==RULE_INT) ) {
+                alt49=1;
             }
-            else if ( (LA46_0==RULE_DECIMAL) ) {
-                alt46=2;
+            else if ( (LA49_0==RULE_DECIMAL) ) {
+                alt49=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 46, 0, input);
+                    new NoViableAltException("", 49, 0, input);
 
                 throw nvae;
             }
-            switch (alt46) {
+            switch (alt49) {
                 case 1 :
-                    // InternalDataDSL.g:4064:2: ( RULE_INT )
+                    // InternalDataDSL.g:4313:2: ( RULE_INT )
                     {
-                    // InternalDataDSL.g:4064:2: ( RULE_INT )
-                    // InternalDataDSL.g:4065:3: RULE_INT
+                    // InternalDataDSL.g:4313:2: ( RULE_INT )
+                    // InternalDataDSL.g:4314:3: RULE_INT
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getINTTerminalRuleCall_1_1_1_0()); 
@@ -14938,10 +15953,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4070:2: ( RULE_DECIMAL )
+                    // InternalDataDSL.g:4319:2: ( RULE_DECIMAL )
                     {
-                    // InternalDataDSL.g:4070:2: ( RULE_DECIMAL )
-                    // InternalDataDSL.g:4071:3: RULE_DECIMAL
+                    // InternalDataDSL.g:4319:2: ( RULE_DECIMAL )
+                    // InternalDataDSL.g:4320:3: RULE_DECIMAL
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getNumberAccess().getDECIMALTerminalRuleCall_1_1_1_1()); 
@@ -14974,41 +15989,41 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Alternatives"
-    // InternalDataDSL.g:4080:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
+    // InternalDataDSL.g:4329:1: rule__JvmTypeReference__Alternatives : ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) );
     public final void rule__JvmTypeReference__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4084:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
-            int alt47=2;
-            int LA47_0 = input.LA(1);
+            // InternalDataDSL.g:4333:1: ( ( ( rule__JvmTypeReference__Group_0__0 ) ) | ( ruleXFunctionTypeRef ) )
+            int alt50=2;
+            int LA50_0 = input.LA(1);
 
-            if ( (LA47_0==RULE_ID) ) {
-                alt47=1;
+            if ( (LA50_0==RULE_ID) ) {
+                alt50=1;
             }
-            else if ( (LA47_0==31||LA47_0==122) ) {
-                alt47=2;
+            else if ( (LA50_0==31||LA50_0==128) ) {
+                alt50=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 47, 0, input);
+                    new NoViableAltException("", 50, 0, input);
 
                 throw nvae;
             }
-            switch (alt47) {
+            switch (alt50) {
                 case 1 :
-                    // InternalDataDSL.g:4085:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalDataDSL.g:4334:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
                     {
-                    // InternalDataDSL.g:4085:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
-                    // InternalDataDSL.g:4086:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalDataDSL.g:4334:2: ( ( rule__JvmTypeReference__Group_0__0 ) )
+                    // InternalDataDSL.g:4335:3: ( rule__JvmTypeReference__Group_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0()); 
                     }
-                    // InternalDataDSL.g:4087:3: ( rule__JvmTypeReference__Group_0__0 )
-                    // InternalDataDSL.g:4087:4: rule__JvmTypeReference__Group_0__0
+                    // InternalDataDSL.g:4336:3: ( rule__JvmTypeReference__Group_0__0 )
+                    // InternalDataDSL.g:4336:4: rule__JvmTypeReference__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmTypeReference__Group_0__0();
@@ -15028,10 +16043,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4091:2: ( ruleXFunctionTypeRef )
+                    // InternalDataDSL.g:4340:2: ( ruleXFunctionTypeRef )
                     {
-                    // InternalDataDSL.g:4091:2: ( ruleXFunctionTypeRef )
-                    // InternalDataDSL.g:4092:3: ruleXFunctionTypeRef
+                    // InternalDataDSL.g:4340:2: ( ruleXFunctionTypeRef )
+                    // InternalDataDSL.g:4341:3: ruleXFunctionTypeRef
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmTypeReferenceAccess().getXFunctionTypeRefParserRuleCall_1()); 
@@ -15068,35 +16083,35 @@
 
 
     // $ANTLR start "rule__JvmArgumentTypeReference__Alternatives"
-    // InternalDataDSL.g:4101:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
+    // InternalDataDSL.g:4350:1: rule__JvmArgumentTypeReference__Alternatives : ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) );
     public final void rule__JvmArgumentTypeReference__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4105:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
-            int alt48=2;
-            int LA48_0 = input.LA(1);
+            // InternalDataDSL.g:4354:1: ( ( ruleJvmTypeReference ) | ( ruleJvmWildcardTypeReference ) )
+            int alt51=2;
+            int LA51_0 = input.LA(1);
 
-            if ( (LA48_0==RULE_ID||LA48_0==31||LA48_0==122) ) {
-                alt48=1;
+            if ( (LA51_0==RULE_ID||LA51_0==31||LA51_0==128) ) {
+                alt51=1;
             }
-            else if ( (LA48_0==146) ) {
-                alt48=2;
+            else if ( (LA51_0==152) ) {
+                alt51=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 48, 0, input);
+                    new NoViableAltException("", 51, 0, input);
 
                 throw nvae;
             }
-            switch (alt48) {
+            switch (alt51) {
                 case 1 :
-                    // InternalDataDSL.g:4106:2: ( ruleJvmTypeReference )
+                    // InternalDataDSL.g:4355:2: ( ruleJvmTypeReference )
                     {
-                    // InternalDataDSL.g:4106:2: ( ruleJvmTypeReference )
-                    // InternalDataDSL.g:4107:3: ruleJvmTypeReference
+                    // InternalDataDSL.g:4355:2: ( ruleJvmTypeReference )
+                    // InternalDataDSL.g:4356:3: ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmTypeReferenceParserRuleCall_0()); 
@@ -15116,10 +16131,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4112:2: ( ruleJvmWildcardTypeReference )
+                    // InternalDataDSL.g:4361:2: ( ruleJvmWildcardTypeReference )
                     {
-                    // InternalDataDSL.g:4112:2: ( ruleJvmWildcardTypeReference )
-                    // InternalDataDSL.g:4113:3: ruleJvmWildcardTypeReference
+                    // InternalDataDSL.g:4361:2: ( ruleJvmWildcardTypeReference )
+                    // InternalDataDSL.g:4362:3: ruleJvmWildcardTypeReference
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmArgumentTypeReferenceAccess().getJvmWildcardTypeReferenceParserRuleCall_1()); 
@@ -15156,41 +16171,41 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Alternatives_2"
-    // InternalDataDSL.g:4122:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
+    // InternalDataDSL.g:4371:1: rule__JvmWildcardTypeReference__Alternatives_2 : ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) );
     public final void rule__JvmWildcardTypeReference__Alternatives_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4126:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
-            int alt49=2;
-            int LA49_0 = input.LA(1);
+            // InternalDataDSL.g:4375:1: ( ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) ) | ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) ) )
+            int alt52=2;
+            int LA52_0 = input.LA(1);
 
-            if ( (LA49_0==45) ) {
-                alt49=1;
+            if ( (LA52_0==45) ) {
+                alt52=1;
             }
-            else if ( (LA49_0==49) ) {
-                alt49=2;
+            else if ( (LA52_0==49) ) {
+                alt52=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 49, 0, input);
+                    new NoViableAltException("", 52, 0, input);
 
                 throw nvae;
             }
-            switch (alt49) {
+            switch (alt52) {
                 case 1 :
-                    // InternalDataDSL.g:4127:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4376:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
                     {
-                    // InternalDataDSL.g:4127:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
-                    // InternalDataDSL.g:4128:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalDataDSL.g:4376:2: ( ( rule__JvmWildcardTypeReference__Group_2_0__0 ) )
+                    // InternalDataDSL.g:4377:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_0()); 
                     }
-                    // InternalDataDSL.g:4129:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
-                    // InternalDataDSL.g:4129:4: rule__JvmWildcardTypeReference__Group_2_0__0
+                    // InternalDataDSL.g:4378:3: ( rule__JvmWildcardTypeReference__Group_2_0__0 )
+                    // InternalDataDSL.g:4378:4: rule__JvmWildcardTypeReference__Group_2_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Group_2_0__0();
@@ -15210,16 +16225,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4133:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalDataDSL.g:4382:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
                     {
-                    // InternalDataDSL.g:4133:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
-                    // InternalDataDSL.g:4134:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalDataDSL.g:4382:2: ( ( rule__JvmWildcardTypeReference__Group_2_1__0 ) )
+                    // InternalDataDSL.g:4383:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getJvmWildcardTypeReferenceAccess().getGroup_2_1()); 
                     }
-                    // InternalDataDSL.g:4135:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
-                    // InternalDataDSL.g:4135:4: rule__JvmWildcardTypeReference__Group_2_1__0
+                    // InternalDataDSL.g:4384:3: ( rule__JvmWildcardTypeReference__Group_2_1__0 )
+                    // InternalDataDSL.g:4384:4: rule__JvmWildcardTypeReference__Group_2_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Group_2_1__0();
@@ -15256,65 +16271,65 @@
 
 
     // $ANTLR start "rule__PredefinedBlobMimeTypeEnum__Alternatives"
-    // InternalDataDSL.g:4143:1: rule__PredefinedBlobMimeTypeEnum__Alternatives : ( ( ( 'plain' ) ) | ( ( 'jpg' ) ) | ( ( 'png' ) ) | ( ( 'mpeg' ) ) | ( ( 'octet-stream' ) ) | ( ( 'pdf' ) ) );
+    // InternalDataDSL.g:4392:1: rule__PredefinedBlobMimeTypeEnum__Alternatives : ( ( ( 'plain' ) ) | ( ( 'jpg' ) ) | ( ( 'png' ) ) | ( ( 'mpeg' ) ) | ( ( 'octet-stream' ) ) | ( ( 'pdf' ) ) );
     public final void rule__PredefinedBlobMimeTypeEnum__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4147:1: ( ( ( 'plain' ) ) | ( ( 'jpg' ) ) | ( ( 'png' ) ) | ( ( 'mpeg' ) ) | ( ( 'octet-stream' ) ) | ( ( 'pdf' ) ) )
-            int alt50=6;
+            // InternalDataDSL.g:4396:1: ( ( ( 'plain' ) ) | ( ( 'jpg' ) ) | ( ( 'png' ) ) | ( ( 'mpeg' ) ) | ( ( 'octet-stream' ) ) | ( ( 'pdf' ) ) )
+            int alt53=6;
             switch ( input.LA(1) ) {
             case 51:
                 {
-                alt50=1;
+                alt53=1;
                 }
                 break;
             case 52:
                 {
-                alt50=2;
+                alt53=2;
                 }
                 break;
             case 53:
                 {
-                alt50=3;
+                alt53=3;
                 }
                 break;
             case 54:
                 {
-                alt50=4;
+                alt53=4;
                 }
                 break;
             case 55:
                 {
-                alt50=5;
+                alt53=5;
                 }
                 break;
             case 56:
                 {
-                alt50=6;
+                alt53=6;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 50, 0, input);
+                    new NoViableAltException("", 53, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt50) {
+            switch (alt53) {
                 case 1 :
-                    // InternalDataDSL.g:4148:2: ( ( 'plain' ) )
+                    // InternalDataDSL.g:4397:2: ( ( 'plain' ) )
                     {
-                    // InternalDataDSL.g:4148:2: ( ( 'plain' ) )
-                    // InternalDataDSL.g:4149:3: ( 'plain' )
+                    // InternalDataDSL.g:4397:2: ( ( 'plain' ) )
+                    // InternalDataDSL.g:4398:3: ( 'plain' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPlainEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4150:3: ( 'plain' )
-                    // InternalDataDSL.g:4150:4: 'plain'
+                    // InternalDataDSL.g:4399:3: ( 'plain' )
+                    // InternalDataDSL.g:4399:4: 'plain'
                     {
                     match(input,51,FOLLOW_2); if (state.failed) return ;
 
@@ -15330,16 +16345,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4154:2: ( ( 'jpg' ) )
+                    // InternalDataDSL.g:4403:2: ( ( 'jpg' ) )
                     {
-                    // InternalDataDSL.g:4154:2: ( ( 'jpg' ) )
-                    // InternalDataDSL.g:4155:3: ( 'jpg' )
+                    // InternalDataDSL.g:4403:2: ( ( 'jpg' ) )
+                    // InternalDataDSL.g:4404:3: ( 'jpg' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getJpgEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4156:3: ( 'jpg' )
-                    // InternalDataDSL.g:4156:4: 'jpg'
+                    // InternalDataDSL.g:4405:3: ( 'jpg' )
+                    // InternalDataDSL.g:4405:4: 'jpg'
                     {
                     match(input,52,FOLLOW_2); if (state.failed) return ;
 
@@ -15355,16 +16370,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4160:2: ( ( 'png' ) )
+                    // InternalDataDSL.g:4409:2: ( ( 'png' ) )
                     {
-                    // InternalDataDSL.g:4160:2: ( ( 'png' ) )
-                    // InternalDataDSL.g:4161:3: ( 'png' )
+                    // InternalDataDSL.g:4409:2: ( ( 'png' ) )
+                    // InternalDataDSL.g:4410:3: ( 'png' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPngEnumLiteralDeclaration_2()); 
                     }
-                    // InternalDataDSL.g:4162:3: ( 'png' )
-                    // InternalDataDSL.g:4162:4: 'png'
+                    // InternalDataDSL.g:4411:3: ( 'png' )
+                    // InternalDataDSL.g:4411:4: 'png'
                     {
                     match(input,53,FOLLOW_2); if (state.failed) return ;
 
@@ -15380,16 +16395,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4166:2: ( ( 'mpeg' ) )
+                    // InternalDataDSL.g:4415:2: ( ( 'mpeg' ) )
                     {
-                    // InternalDataDSL.g:4166:2: ( ( 'mpeg' ) )
-                    // InternalDataDSL.g:4167:3: ( 'mpeg' )
+                    // InternalDataDSL.g:4415:2: ( ( 'mpeg' ) )
+                    // InternalDataDSL.g:4416:3: ( 'mpeg' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getMpegEnumLiteralDeclaration_3()); 
                     }
-                    // InternalDataDSL.g:4168:3: ( 'mpeg' )
-                    // InternalDataDSL.g:4168:4: 'mpeg'
+                    // InternalDataDSL.g:4417:3: ( 'mpeg' )
+                    // InternalDataDSL.g:4417:4: 'mpeg'
                     {
                     match(input,54,FOLLOW_2); if (state.failed) return ;
 
@@ -15405,16 +16420,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:4172:2: ( ( 'octet-stream' ) )
+                    // InternalDataDSL.g:4421:2: ( ( 'octet-stream' ) )
                     {
-                    // InternalDataDSL.g:4172:2: ( ( 'octet-stream' ) )
-                    // InternalDataDSL.g:4173:3: ( 'octet-stream' )
+                    // InternalDataDSL.g:4421:2: ( ( 'octet-stream' ) )
+                    // InternalDataDSL.g:4422:3: ( 'octet-stream' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getOctetstreamEnumLiteralDeclaration_4()); 
                     }
-                    // InternalDataDSL.g:4174:3: ( 'octet-stream' )
-                    // InternalDataDSL.g:4174:4: 'octet-stream'
+                    // InternalDataDSL.g:4423:3: ( 'octet-stream' )
+                    // InternalDataDSL.g:4423:4: 'octet-stream'
                     {
                     match(input,55,FOLLOW_2); if (state.failed) return ;
 
@@ -15430,16 +16445,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:4178:2: ( ( 'pdf' ) )
+                    // InternalDataDSL.g:4427:2: ( ( 'pdf' ) )
                     {
-                    // InternalDataDSL.g:4178:2: ( ( 'pdf' ) )
-                    // InternalDataDSL.g:4179:3: ( 'pdf' )
+                    // InternalDataDSL.g:4427:2: ( ( 'pdf' ) )
+                    // InternalDataDSL.g:4428:3: ( 'pdf' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPdfEnumLiteralDeclaration_5()); 
                     }
-                    // InternalDataDSL.g:4180:3: ( 'pdf' )
-                    // InternalDataDSL.g:4180:4: 'pdf'
+                    // InternalDataDSL.g:4429:3: ( 'pdf' )
+                    // InternalDataDSL.g:4429:4: 'pdf'
                     {
                     match(input,56,FOLLOW_2); if (state.failed) return ;
 
@@ -15472,50 +16487,50 @@
 
 
     // $ANTLR start "rule__PredefinedBeanEnum__Alternatives"
-    // InternalDataDSL.g:4188:1: rule__PredefinedBeanEnum__Alternatives : ( ( ( 'NowDate' ) ) | ( ( 'StartDate' ) ) | ( ( 'UniversallyUniqueIdentifier' ) ) );
+    // InternalDataDSL.g:4437:1: rule__PredefinedBeanEnum__Alternatives : ( ( ( 'NowDate' ) ) | ( ( 'StartDate' ) ) | ( ( 'UniversallyUniqueIdentifier' ) ) );
     public final void rule__PredefinedBeanEnum__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4192:1: ( ( ( 'NowDate' ) ) | ( ( 'StartDate' ) ) | ( ( 'UniversallyUniqueIdentifier' ) ) )
-            int alt51=3;
+            // InternalDataDSL.g:4441:1: ( ( ( 'NowDate' ) ) | ( ( 'StartDate' ) ) | ( ( 'UniversallyUniqueIdentifier' ) ) )
+            int alt54=3;
             switch ( input.LA(1) ) {
             case 57:
                 {
-                alt51=1;
+                alt54=1;
                 }
                 break;
             case 58:
                 {
-                alt51=2;
+                alt54=2;
                 }
                 break;
             case 59:
                 {
-                alt51=3;
+                alt54=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 51, 0, input);
+                    new NoViableAltException("", 54, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt51) {
+            switch (alt54) {
                 case 1 :
-                    // InternalDataDSL.g:4193:2: ( ( 'NowDate' ) )
+                    // InternalDataDSL.g:4442:2: ( ( 'NowDate' ) )
                     {
-                    // InternalDataDSL.g:4193:2: ( ( 'NowDate' ) )
-                    // InternalDataDSL.g:4194:3: ( 'NowDate' )
+                    // InternalDataDSL.g:4442:2: ( ( 'NowDate' ) )
+                    // InternalDataDSL.g:4443:3: ( 'NowDate' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanEnumAccess().getNowEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4195:3: ( 'NowDate' )
-                    // InternalDataDSL.g:4195:4: 'NowDate'
+                    // InternalDataDSL.g:4444:3: ( 'NowDate' )
+                    // InternalDataDSL.g:4444:4: 'NowDate'
                     {
                     match(input,57,FOLLOW_2); if (state.failed) return ;
 
@@ -15531,16 +16546,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4199:2: ( ( 'StartDate' ) )
+                    // InternalDataDSL.g:4448:2: ( ( 'StartDate' ) )
                     {
-                    // InternalDataDSL.g:4199:2: ( ( 'StartDate' ) )
-                    // InternalDataDSL.g:4200:3: ( 'StartDate' )
+                    // InternalDataDSL.g:4448:2: ( ( 'StartDate' ) )
+                    // InternalDataDSL.g:4449:3: ( 'StartDate' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanEnumAccess().getStartEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4201:3: ( 'StartDate' )
-                    // InternalDataDSL.g:4201:4: 'StartDate'
+                    // InternalDataDSL.g:4450:3: ( 'StartDate' )
+                    // InternalDataDSL.g:4450:4: 'StartDate'
                     {
                     match(input,58,FOLLOW_2); if (state.failed) return ;
 
@@ -15556,16 +16571,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4205:2: ( ( 'UniversallyUniqueIdentifier' ) )
+                    // InternalDataDSL.g:4454:2: ( ( 'UniversallyUniqueIdentifier' ) )
                     {
-                    // InternalDataDSL.g:4205:2: ( ( 'UniversallyUniqueIdentifier' ) )
-                    // InternalDataDSL.g:4206:3: ( 'UniversallyUniqueIdentifier' )
+                    // InternalDataDSL.g:4454:2: ( ( 'UniversallyUniqueIdentifier' ) )
+                    // InternalDataDSL.g:4455:3: ( 'UniversallyUniqueIdentifier' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanEnumAccess().getUUIDEnumLiteralDeclaration_2()); 
                     }
-                    // InternalDataDSL.g:4207:3: ( 'UniversallyUniqueIdentifier' )
-                    // InternalDataDSL.g:4207:4: 'UniversallyUniqueIdentifier'
+                    // InternalDataDSL.g:4456:3: ( 'UniversallyUniqueIdentifier' )
+                    // InternalDataDSL.g:4456:4: 'UniversallyUniqueIdentifier'
                     {
                     match(input,59,FOLLOW_2); if (state.failed) return ;
 
@@ -15598,60 +16613,60 @@
 
 
     // $ANTLR start "rule__PredefinedBeanTypeEnum__Alternatives"
-    // InternalDataDSL.g:4215:1: rule__PredefinedBeanTypeEnum__Alternatives : ( ( ( 'Date' ) ) | ( ( 'Milliseconds' ) ) | ( ( 'Nanoseconds' ) ) | ( ( 'Random' ) ) | ( ( 'ExecuteContext' ) ) );
+    // InternalDataDSL.g:4464:1: rule__PredefinedBeanTypeEnum__Alternatives : ( ( ( 'Date' ) ) | ( ( 'Milliseconds' ) ) | ( ( 'Nanoseconds' ) ) | ( ( 'Random' ) ) | ( ( 'ExecuteContext' ) ) );
     public final void rule__PredefinedBeanTypeEnum__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4219:1: ( ( ( 'Date' ) ) | ( ( 'Milliseconds' ) ) | ( ( 'Nanoseconds' ) ) | ( ( 'Random' ) ) | ( ( 'ExecuteContext' ) ) )
-            int alt52=5;
+            // InternalDataDSL.g:4468:1: ( ( ( 'Date' ) ) | ( ( 'Milliseconds' ) ) | ( ( 'Nanoseconds' ) ) | ( ( 'Random' ) ) | ( ( 'ExecuteContext' ) ) )
+            int alt55=5;
             switch ( input.LA(1) ) {
             case 60:
                 {
-                alt52=1;
+                alt55=1;
                 }
                 break;
             case 61:
                 {
-                alt52=2;
+                alt55=2;
                 }
                 break;
             case 62:
                 {
-                alt52=3;
+                alt55=3;
                 }
                 break;
             case 63:
                 {
-                alt52=4;
+                alt55=4;
                 }
                 break;
             case 64:
                 {
-                alt52=5;
+                alt55=5;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 52, 0, input);
+                    new NoViableAltException("", 55, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt52) {
+            switch (alt55) {
                 case 1 :
-                    // InternalDataDSL.g:4220:2: ( ( 'Date' ) )
+                    // InternalDataDSL.g:4469:2: ( ( 'Date' ) )
                     {
-                    // InternalDataDSL.g:4220:2: ( ( 'Date' ) )
-                    // InternalDataDSL.g:4221:3: ( 'Date' )
+                    // InternalDataDSL.g:4469:2: ( ( 'Date' ) )
+                    // InternalDataDSL.g:4470:3: ( 'Date' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanTypeEnumAccess().getDateEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4222:3: ( 'Date' )
-                    // InternalDataDSL.g:4222:4: 'Date'
+                    // InternalDataDSL.g:4471:3: ( 'Date' )
+                    // InternalDataDSL.g:4471:4: 'Date'
                     {
                     match(input,60,FOLLOW_2); if (state.failed) return ;
 
@@ -15667,16 +16682,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4226:2: ( ( 'Milliseconds' ) )
+                    // InternalDataDSL.g:4475:2: ( ( 'Milliseconds' ) )
                     {
-                    // InternalDataDSL.g:4226:2: ( ( 'Milliseconds' ) )
-                    // InternalDataDSL.g:4227:3: ( 'Milliseconds' )
+                    // InternalDataDSL.g:4475:2: ( ( 'Milliseconds' ) )
+                    // InternalDataDSL.g:4476:3: ( 'Milliseconds' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanTypeEnumAccess().getMillisEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4228:3: ( 'Milliseconds' )
-                    // InternalDataDSL.g:4228:4: 'Milliseconds'
+                    // InternalDataDSL.g:4477:3: ( 'Milliseconds' )
+                    // InternalDataDSL.g:4477:4: 'Milliseconds'
                     {
                     match(input,61,FOLLOW_2); if (state.failed) return ;
 
@@ -15692,16 +16707,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4232:2: ( ( 'Nanoseconds' ) )
+                    // InternalDataDSL.g:4481:2: ( ( 'Nanoseconds' ) )
                     {
-                    // InternalDataDSL.g:4232:2: ( ( 'Nanoseconds' ) )
-                    // InternalDataDSL.g:4233:3: ( 'Nanoseconds' )
+                    // InternalDataDSL.g:4481:2: ( ( 'Nanoseconds' ) )
+                    // InternalDataDSL.g:4482:3: ( 'Nanoseconds' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanTypeEnumAccess().getNanosEnumLiteralDeclaration_2()); 
                     }
-                    // InternalDataDSL.g:4234:3: ( 'Nanoseconds' )
-                    // InternalDataDSL.g:4234:4: 'Nanoseconds'
+                    // InternalDataDSL.g:4483:3: ( 'Nanoseconds' )
+                    // InternalDataDSL.g:4483:4: 'Nanoseconds'
                     {
                     match(input,62,FOLLOW_2); if (state.failed) return ;
 
@@ -15717,16 +16732,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4238:2: ( ( 'Random' ) )
+                    // InternalDataDSL.g:4487:2: ( ( 'Random' ) )
                     {
-                    // InternalDataDSL.g:4238:2: ( ( 'Random' ) )
-                    // InternalDataDSL.g:4239:3: ( 'Random' )
+                    // InternalDataDSL.g:4487:2: ( ( 'Random' ) )
+                    // InternalDataDSL.g:4488:3: ( 'Random' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanTypeEnumAccess().getRandomEnumLiteralDeclaration_3()); 
                     }
-                    // InternalDataDSL.g:4240:3: ( 'Random' )
-                    // InternalDataDSL.g:4240:4: 'Random'
+                    // InternalDataDSL.g:4489:3: ( 'Random' )
+                    // InternalDataDSL.g:4489:4: 'Random'
                     {
                     match(input,63,FOLLOW_2); if (state.failed) return ;
 
@@ -15742,16 +16757,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:4244:2: ( ( 'ExecuteContext' ) )
+                    // InternalDataDSL.g:4493:2: ( ( 'ExecuteContext' ) )
                     {
-                    // InternalDataDSL.g:4244:2: ( ( 'ExecuteContext' ) )
-                    // InternalDataDSL.g:4245:3: ( 'ExecuteContext' )
+                    // InternalDataDSL.g:4493:2: ( ( 'ExecuteContext' ) )
+                    // InternalDataDSL.g:4494:3: ( 'ExecuteContext' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getPredefinedBeanTypeEnumAccess().getExecContextEnumLiteralDeclaration_4()); 
                     }
-                    // InternalDataDSL.g:4246:3: ( 'ExecuteContext' )
-                    // InternalDataDSL.g:4246:4: 'ExecuteContext'
+                    // InternalDataDSL.g:4495:3: ( 'ExecuteContext' )
+                    // InternalDataDSL.g:4495:4: 'ExecuteContext'
                     {
                     match(input,64,FOLLOW_2); if (state.failed) return ;
 
@@ -15784,50 +16799,50 @@
 
 
     // $ANTLR start "rule__EntityManagerMode__Alternatives"
-    // InternalDataDSL.g:4254:1: rule__EntityManagerMode__Alternatives : ( ( ( 'persist' ) ) | ( ( 'merge' ) ) | ( ( 'remove' ) ) );
+    // InternalDataDSL.g:4503:1: rule__EntityManagerMode__Alternatives : ( ( ( 'persist' ) ) | ( ( 'merge' ) ) | ( ( 'remove' ) ) );
     public final void rule__EntityManagerMode__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4258:1: ( ( ( 'persist' ) ) | ( ( 'merge' ) ) | ( ( 'remove' ) ) )
-            int alt53=3;
+            // InternalDataDSL.g:4507:1: ( ( ( 'persist' ) ) | ( ( 'merge' ) ) | ( ( 'remove' ) ) )
+            int alt56=3;
             switch ( input.LA(1) ) {
             case 65:
                 {
-                alt53=1;
+                alt56=1;
                 }
                 break;
             case 66:
                 {
-                alt53=2;
+                alt56=2;
                 }
                 break;
             case 67:
                 {
-                alt53=3;
+                alt56=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 53, 0, input);
+                    new NoViableAltException("", 56, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt53) {
+            switch (alt56) {
                 case 1 :
-                    // InternalDataDSL.g:4259:2: ( ( 'persist' ) )
+                    // InternalDataDSL.g:4508:2: ( ( 'persist' ) )
                     {
-                    // InternalDataDSL.g:4259:2: ( ( 'persist' ) )
-                    // InternalDataDSL.g:4260:3: ( 'persist' )
+                    // InternalDataDSL.g:4508:2: ( ( 'persist' ) )
+                    // InternalDataDSL.g:4509:3: ( 'persist' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEntityManagerModeAccess().getPersistEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4261:3: ( 'persist' )
-                    // InternalDataDSL.g:4261:4: 'persist'
+                    // InternalDataDSL.g:4510:3: ( 'persist' )
+                    // InternalDataDSL.g:4510:4: 'persist'
                     {
                     match(input,65,FOLLOW_2); if (state.failed) return ;
 
@@ -15843,16 +16858,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4265:2: ( ( 'merge' ) )
+                    // InternalDataDSL.g:4514:2: ( ( 'merge' ) )
                     {
-                    // InternalDataDSL.g:4265:2: ( ( 'merge' ) )
-                    // InternalDataDSL.g:4266:3: ( 'merge' )
+                    // InternalDataDSL.g:4514:2: ( ( 'merge' ) )
+                    // InternalDataDSL.g:4515:3: ( 'merge' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEntityManagerModeAccess().getMergeEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4267:3: ( 'merge' )
-                    // InternalDataDSL.g:4267:4: 'merge'
+                    // InternalDataDSL.g:4516:3: ( 'merge' )
+                    // InternalDataDSL.g:4516:4: 'merge'
                     {
                     match(input,66,FOLLOW_2); if (state.failed) return ;
 
@@ -15868,16 +16883,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4271:2: ( ( 'remove' ) )
+                    // InternalDataDSL.g:4520:2: ( ( 'remove' ) )
                     {
-                    // InternalDataDSL.g:4271:2: ( ( 'remove' ) )
-                    // InternalDataDSL.g:4272:3: ( 'remove' )
+                    // InternalDataDSL.g:4520:2: ( ( 'remove' ) )
+                    // InternalDataDSL.g:4521:3: ( 'remove' )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getEntityManagerModeAccess().getRemoveEnumLiteralDeclaration_2()); 
                     }
-                    // InternalDataDSL.g:4273:3: ( 'remove' )
-                    // InternalDataDSL.g:4273:4: 'remove'
+                    // InternalDataDSL.g:4522:3: ( 'remove' )
+                    // InternalDataDSL.g:4522:4: 'remove'
                     {
                     match(input,67,FOLLOW_2); if (state.failed) return ;
 
@@ -15909,83 +16924,83 @@
     // $ANTLR end "rule__EntityManagerMode__Alternatives"
 
 
-    // $ANTLR start "rule__ConditionAndOperator1__Alternatives"
-    // InternalDataDSL.g:4281:1: rule__ConditionAndOperator1__Alternatives : ( ( ( '=' ) ) | ( ( '!=' ) ) | ( ( '>' ) ) | ( ( '>=' ) ) | ( ( '<' ) ) | ( ( '<=' ) ) | ( ( 'isnull' ) ) | ( ( 'isnotnull' ) ) );
-    public final void rule__ConditionAndOperator1__Alternatives() throws RecognitionException {
+    // $ANTLR start "rule__Operator__Alternatives"
+    // InternalDataDSL.g:4530:1: rule__Operator__Alternatives : ( ( ( '=' ) ) | ( ( '!=' ) ) | ( ( '>' ) ) | ( ( '>=' ) ) | ( ( '<' ) ) | ( ( '<=' ) ) | ( ( 'isnull' ) ) | ( ( 'isnotnull' ) ) );
+    public final void rule__Operator__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4285:1: ( ( ( '=' ) ) | ( ( '!=' ) ) | ( ( '>' ) ) | ( ( '>=' ) ) | ( ( '<' ) ) | ( ( '<=' ) ) | ( ( 'isnull' ) ) | ( ( 'isnotnull' ) ) )
-            int alt54=8;
+            // InternalDataDSL.g:4534:1: ( ( ( '=' ) ) | ( ( '!=' ) ) | ( ( '>' ) ) | ( ( '>=' ) ) | ( ( '<' ) ) | ( ( '<=' ) ) | ( ( 'isnull' ) ) | ( ( 'isnotnull' ) ) )
+            int alt57=8;
             switch ( input.LA(1) ) {
             case 13:
                 {
-                alt54=1;
+                alt57=1;
                 }
                 break;
             case 22:
                 {
-                alt54=2;
+                alt57=2;
                 }
                 break;
             case 26:
                 {
-                alt54=3;
+                alt57=3;
                 }
                 break;
             case 25:
                 {
-                alt54=4;
+                alt57=4;
                 }
                 break;
             case 27:
                 {
-                alt54=5;
+                alt57=5;
                 }
                 break;
             case 68:
                 {
-                alt54=6;
+                alt57=6;
                 }
                 break;
             case 69:
                 {
-                alt54=7;
+                alt57=7;
                 }
                 break;
             case 70:
                 {
-                alt54=8;
+                alt57=8;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 54, 0, input);
+                    new NoViableAltException("", 57, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt54) {
+            switch (alt57) {
                 case 1 :
-                    // InternalDataDSL.g:4286:2: ( ( '=' ) )
+                    // InternalDataDSL.g:4535:2: ( ( '=' ) )
                     {
-                    // InternalDataDSL.g:4286:2: ( ( '=' ) )
-                    // InternalDataDSL.g:4287:3: ( '=' )
+                    // InternalDataDSL.g:4535:2: ( ( '=' ) )
+                    // InternalDataDSL.g:4536:3: ( '=' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0()); 
+                       before(grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4288:3: ( '=' )
-                    // InternalDataDSL.g:4288:4: '='
+                    // InternalDataDSL.g:4537:3: ( '=' )
+                    // InternalDataDSL.g:4537:4: '='
                     {
                     match(input,13,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0()); 
+                       after(grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0()); 
                     }
 
                     }
@@ -15994,23 +17009,23 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4292:2: ( ( '!=' ) )
+                    // InternalDataDSL.g:4541:2: ( ( '!=' ) )
                     {
-                    // InternalDataDSL.g:4292:2: ( ( '!=' ) )
-                    // InternalDataDSL.g:4293:3: ( '!=' )
+                    // InternalDataDSL.g:4541:2: ( ( '!=' ) )
+                    // InternalDataDSL.g:4542:3: ( '!=' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1()); 
+                       before(grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4294:3: ( '!=' )
-                    // InternalDataDSL.g:4294:4: '!='
+                    // InternalDataDSL.g:4543:3: ( '!=' )
+                    // InternalDataDSL.g:4543:4: '!='
                     {
                     match(input,22,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1()); 
+                       after(grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1()); 
                     }
 
                     }
@@ -16019,23 +17034,23 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4298:2: ( ( '>' ) )
+                    // InternalDataDSL.g:4547:2: ( ( '>' ) )
                     {
-                    // InternalDataDSL.g:4298:2: ( ( '>' ) )
-                    // InternalDataDSL.g:4299:3: ( '>' )
+                    // InternalDataDSL.g:4547:2: ( ( '>' ) )
+                    // InternalDataDSL.g:4548:3: ( '>' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2()); 
+                       before(grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2()); 
                     }
-                    // InternalDataDSL.g:4300:3: ( '>' )
-                    // InternalDataDSL.g:4300:4: '>'
+                    // InternalDataDSL.g:4549:3: ( '>' )
+                    // InternalDataDSL.g:4549:4: '>'
                     {
                     match(input,26,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2()); 
+                       after(grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2()); 
                     }
 
                     }
@@ -16044,23 +17059,23 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4304:2: ( ( '>=' ) )
+                    // InternalDataDSL.g:4553:2: ( ( '>=' ) )
                     {
-                    // InternalDataDSL.g:4304:2: ( ( '>=' ) )
-                    // InternalDataDSL.g:4305:3: ( '>=' )
+                    // InternalDataDSL.g:4553:2: ( ( '>=' ) )
+                    // InternalDataDSL.g:4554:3: ( '>=' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3()); 
+                       before(grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3()); 
                     }
-                    // InternalDataDSL.g:4306:3: ( '>=' )
-                    // InternalDataDSL.g:4306:4: '>='
+                    // InternalDataDSL.g:4555:3: ( '>=' )
+                    // InternalDataDSL.g:4555:4: '>='
                     {
                     match(input,25,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3()); 
+                       after(grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3()); 
                     }
 
                     }
@@ -16069,23 +17084,23 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:4310:2: ( ( '<' ) )
+                    // InternalDataDSL.g:4559:2: ( ( '<' ) )
                     {
-                    // InternalDataDSL.g:4310:2: ( ( '<' ) )
-                    // InternalDataDSL.g:4311:3: ( '<' )
+                    // InternalDataDSL.g:4559:2: ( ( '<' ) )
+                    // InternalDataDSL.g:4560:3: ( '<' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4()); 
+                       before(grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4()); 
                     }
-                    // InternalDataDSL.g:4312:3: ( '<' )
-                    // InternalDataDSL.g:4312:4: '<'
+                    // InternalDataDSL.g:4561:3: ( '<' )
+                    // InternalDataDSL.g:4561:4: '<'
                     {
                     match(input,27,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4()); 
+                       after(grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4()); 
                     }
 
                     }
@@ -16094,23 +17109,23 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:4316:2: ( ( '<=' ) )
+                    // InternalDataDSL.g:4565:2: ( ( '<=' ) )
                     {
-                    // InternalDataDSL.g:4316:2: ( ( '<=' ) )
-                    // InternalDataDSL.g:4317:3: ( '<=' )
+                    // InternalDataDSL.g:4565:2: ( ( '<=' ) )
+                    // InternalDataDSL.g:4566:3: ( '<=' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5()); 
+                       before(grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5()); 
                     }
-                    // InternalDataDSL.g:4318:3: ( '<=' )
-                    // InternalDataDSL.g:4318:4: '<='
+                    // InternalDataDSL.g:4567:3: ( '<=' )
+                    // InternalDataDSL.g:4567:4: '<='
                     {
                     match(input,68,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5()); 
+                       after(grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5()); 
                     }
 
                     }
@@ -16119,23 +17134,23 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:4322:2: ( ( 'isnull' ) )
+                    // InternalDataDSL.g:4571:2: ( ( 'isnull' ) )
                     {
-                    // InternalDataDSL.g:4322:2: ( ( 'isnull' ) )
-                    // InternalDataDSL.g:4323:3: ( 'isnull' )
+                    // InternalDataDSL.g:4571:2: ( ( 'isnull' ) )
+                    // InternalDataDSL.g:4572:3: ( 'isnull' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6()); 
+                       before(grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6()); 
                     }
-                    // InternalDataDSL.g:4324:3: ( 'isnull' )
-                    // InternalDataDSL.g:4324:4: 'isnull'
+                    // InternalDataDSL.g:4573:3: ( 'isnull' )
+                    // InternalDataDSL.g:4573:4: 'isnull'
                     {
                     match(input,69,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6()); 
+                       after(grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6()); 
                     }
 
                     }
@@ -16144,23 +17159,23 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:4328:2: ( ( 'isnotnull' ) )
+                    // InternalDataDSL.g:4577:2: ( ( 'isnotnull' ) )
                     {
-                    // InternalDataDSL.g:4328:2: ( ( 'isnotnull' ) )
-                    // InternalDataDSL.g:4329:3: ( 'isnotnull' )
+                    // InternalDataDSL.g:4577:2: ( ( 'isnotnull' ) )
+                    // InternalDataDSL.g:4578:3: ( 'isnotnull' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7()); 
+                       before(grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7()); 
                     }
-                    // InternalDataDSL.g:4330:3: ( 'isnotnull' )
-                    // InternalDataDSL.g:4330:4: 'isnotnull'
+                    // InternalDataDSL.g:4579:3: ( 'isnotnull' )
+                    // InternalDataDSL.g:4579:4: 'isnotnull'
                     {
                     match(input,70,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7()); 
+                       after(grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7()); 
                     }
 
                     }
@@ -16182,52 +17197,52 @@
         }
         return ;
     }
-    // $ANTLR end "rule__ConditionAndOperator1__Alternatives"
+    // $ANTLR end "rule__Operator__Alternatives"
 
 
-    // $ANTLR start "rule__ConditionAndOperator2__Alternatives"
-    // InternalDataDSL.g:4338:1: rule__ConditionAndOperator2__Alternatives : ( ( ( 'and' ) ) | ( ( 'or' ) ) );
-    public final void rule__ConditionAndOperator2__Alternatives() throws RecognitionException {
+    // $ANTLR start "rule__Junction__Alternatives"
+    // InternalDataDSL.g:4587:1: rule__Junction__Alternatives : ( ( ( 'and' ) ) | ( ( 'or' ) ) );
+    public final void rule__Junction__Alternatives() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4342:1: ( ( ( 'and' ) ) | ( ( 'or' ) ) )
-            int alt55=2;
-            int LA55_0 = input.LA(1);
+            // InternalDataDSL.g:4591:1: ( ( ( 'and' ) ) | ( ( 'or' ) ) )
+            int alt58=2;
+            int LA58_0 = input.LA(1);
 
-            if ( (LA55_0==71) ) {
-                alt55=1;
+            if ( (LA58_0==71) ) {
+                alt58=1;
             }
-            else if ( (LA55_0==72) ) {
-                alt55=2;
+            else if ( (LA58_0==72) ) {
+                alt58=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 55, 0, input);
+                    new NoViableAltException("", 58, 0, input);
 
                 throw nvae;
             }
-            switch (alt55) {
+            switch (alt58) {
                 case 1 :
-                    // InternalDataDSL.g:4343:2: ( ( 'and' ) )
+                    // InternalDataDSL.g:4592:2: ( ( 'and' ) )
                     {
-                    // InternalDataDSL.g:4343:2: ( ( 'and' ) )
-                    // InternalDataDSL.g:4344:3: ( 'and' )
+                    // InternalDataDSL.g:4592:2: ( ( 'and' ) )
+                    // InternalDataDSL.g:4593:3: ( 'and' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0()); 
+                       before(grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0()); 
                     }
-                    // InternalDataDSL.g:4345:3: ( 'and' )
-                    // InternalDataDSL.g:4345:4: 'and'
+                    // InternalDataDSL.g:4594:3: ( 'and' )
+                    // InternalDataDSL.g:4594:4: 'and'
                     {
                     match(input,71,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0()); 
+                       after(grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0()); 
                     }
 
                     }
@@ -16236,23 +17251,23 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4349:2: ( ( 'or' ) )
+                    // InternalDataDSL.g:4598:2: ( ( 'or' ) )
                     {
-                    // InternalDataDSL.g:4349:2: ( ( 'or' ) )
-                    // InternalDataDSL.g:4350:3: ( 'or' )
+                    // InternalDataDSL.g:4598:2: ( ( 'or' ) )
+                    // InternalDataDSL.g:4599:3: ( 'or' )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1()); 
+                       before(grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1()); 
                     }
-                    // InternalDataDSL.g:4351:3: ( 'or' )
-                    // InternalDataDSL.g:4351:4: 'or'
+                    // InternalDataDSL.g:4600:3: ( 'or' )
+                    // InternalDataDSL.g:4600:4: 'or'
                     {
                     match(input,72,FOLLOW_2); if (state.failed) return ;
 
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1()); 
+                       after(grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1()); 
                     }
 
                     }
@@ -16274,18 +17289,18 @@
         }
         return ;
     }
-    // $ANTLR end "rule__ConditionAndOperator2__Alternatives"
+    // $ANTLR end "rule__Junction__Alternatives"
 
 
     // $ANTLR start "rule__DataInterchangeModel__Group__0"
-    // InternalDataDSL.g:4359:1: rule__DataInterchangeModel__Group__0 : rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1 ;
+    // InternalDataDSL.g:4608:1: rule__DataInterchangeModel__Group__0 : rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1 ;
     public final void rule__DataInterchangeModel__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4363:1: ( rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1 )
-            // InternalDataDSL.g:4364:2: rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1
+            // InternalDataDSL.g:4612:1: ( rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1 )
+            // InternalDataDSL.g:4613:2: rule__DataInterchangeModel__Group__0__Impl rule__DataInterchangeModel__Group__1
             {
             pushFollow(FOLLOW_5);
             rule__DataInterchangeModel__Group__0__Impl();
@@ -16316,31 +17331,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeModel__Group__0__Impl"
-    // InternalDataDSL.g:4371:1: rule__DataInterchangeModel__Group__0__Impl : ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? ) ;
+    // InternalDataDSL.g:4620:1: rule__DataInterchangeModel__Group__0__Impl : ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? ) ;
     public final void rule__DataInterchangeModel__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4375:1: ( ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? ) )
-            // InternalDataDSL.g:4376:1: ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? )
+            // InternalDataDSL.g:4624:1: ( ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? ) )
+            // InternalDataDSL.g:4625:1: ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? )
             {
-            // InternalDataDSL.g:4376:1: ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? )
-            // InternalDataDSL.g:4377:2: ( rule__DataInterchangeModel__ImportSectionAssignment_0 )?
+            // InternalDataDSL.g:4625:1: ( ( rule__DataInterchangeModel__ImportSectionAssignment_0 )? )
+            // InternalDataDSL.g:4626:2: ( rule__DataInterchangeModel__ImportSectionAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeModelAccess().getImportSectionAssignment_0()); 
             }
-            // InternalDataDSL.g:4378:2: ( rule__DataInterchangeModel__ImportSectionAssignment_0 )?
-            int alt56=2;
-            int LA56_0 = input.LA(1);
+            // InternalDataDSL.g:4627:2: ( rule__DataInterchangeModel__ImportSectionAssignment_0 )?
+            int alt59=2;
+            int LA59_0 = input.LA(1);
 
-            if ( (LA56_0==47) ) {
-                alt56=1;
+            if ( (LA59_0==47) ) {
+                alt59=1;
             }
-            switch (alt56) {
+            switch (alt59) {
                 case 1 :
-                    // InternalDataDSL.g:4378:3: rule__DataInterchangeModel__ImportSectionAssignment_0
+                    // InternalDataDSL.g:4627:3: rule__DataInterchangeModel__ImportSectionAssignment_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeModel__ImportSectionAssignment_0();
@@ -16378,14 +17393,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeModel__Group__1"
-    // InternalDataDSL.g:4386:1: rule__DataInterchangeModel__Group__1 : rule__DataInterchangeModel__Group__1__Impl ;
+    // InternalDataDSL.g:4635:1: rule__DataInterchangeModel__Group__1 : rule__DataInterchangeModel__Group__1__Impl ;
     public final void rule__DataInterchangeModel__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4390:1: ( rule__DataInterchangeModel__Group__1__Impl )
-            // InternalDataDSL.g:4391:2: rule__DataInterchangeModel__Group__1__Impl
+            // InternalDataDSL.g:4639:1: ( rule__DataInterchangeModel__Group__1__Impl )
+            // InternalDataDSL.g:4640:2: rule__DataInterchangeModel__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeModel__Group__1__Impl();
@@ -16411,35 +17426,35 @@
 
 
     // $ANTLR start "rule__DataInterchangeModel__Group__1__Impl"
-    // InternalDataDSL.g:4397:1: rule__DataInterchangeModel__Group__1__Impl : ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* ) ;
+    // InternalDataDSL.g:4646:1: rule__DataInterchangeModel__Group__1__Impl : ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* ) ;
     public final void rule__DataInterchangeModel__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4401:1: ( ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* ) )
-            // InternalDataDSL.g:4402:1: ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* )
+            // InternalDataDSL.g:4650:1: ( ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* ) )
+            // InternalDataDSL.g:4651:1: ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* )
             {
-            // InternalDataDSL.g:4402:1: ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* )
-            // InternalDataDSL.g:4403:2: ( rule__DataInterchangeModel__PackagesAssignment_1 )*
+            // InternalDataDSL.g:4651:1: ( ( rule__DataInterchangeModel__PackagesAssignment_1 )* )
+            // InternalDataDSL.g:4652:2: ( rule__DataInterchangeModel__PackagesAssignment_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeModelAccess().getPackagesAssignment_1()); 
             }
-            // InternalDataDSL.g:4404:2: ( rule__DataInterchangeModel__PackagesAssignment_1 )*
-            loop57:
+            // InternalDataDSL.g:4653:2: ( rule__DataInterchangeModel__PackagesAssignment_1 )*
+            loop60:
             do {
-                int alt57=2;
-                int LA57_0 = input.LA(1);
+                int alt60=2;
+                int LA60_0 = input.LA(1);
 
-                if ( (LA57_0==73) ) {
-                    alt57=1;
+                if ( (LA60_0==73) ) {
+                    alt60=1;
                 }
 
 
-                switch (alt57) {
+                switch (alt60) {
             	case 1 :
-            	    // InternalDataDSL.g:4404:3: rule__DataInterchangeModel__PackagesAssignment_1
+            	    // InternalDataDSL.g:4653:3: rule__DataInterchangeModel__PackagesAssignment_1
             	    {
             	    pushFollow(FOLLOW_6);
             	    rule__DataInterchangeModel__PackagesAssignment_1();
@@ -16451,7 +17466,7 @@
             	    break;
 
             	default :
-            	    break loop57;
+            	    break loop60;
                 }
             } while (true);
 
@@ -16480,14 +17495,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__0"
-    // InternalDataDSL.g:4413:1: rule__DataInterchangePackage__Group__0 : rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1 ;
+    // InternalDataDSL.g:4662:1: rule__DataInterchangePackage__Group__0 : rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1 ;
     public final void rule__DataInterchangePackage__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4417:1: ( rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1 )
-            // InternalDataDSL.g:4418:2: rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1
+            // InternalDataDSL.g:4666:1: ( rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1 )
+            // InternalDataDSL.g:4667:2: rule__DataInterchangePackage__Group__0__Impl rule__DataInterchangePackage__Group__1
             {
             pushFollow(FOLLOW_5);
             rule__DataInterchangePackage__Group__0__Impl();
@@ -16518,23 +17533,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__0__Impl"
-    // InternalDataDSL.g:4425:1: rule__DataInterchangePackage__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:4674:1: rule__DataInterchangePackage__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangePackage__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4429:1: ( ( () ) )
-            // InternalDataDSL.g:4430:1: ( () )
+            // InternalDataDSL.g:4678:1: ( ( () ) )
+            // InternalDataDSL.g:4679:1: ( () )
             {
-            // InternalDataDSL.g:4430:1: ( () )
-            // InternalDataDSL.g:4431:2: ()
+            // InternalDataDSL.g:4679:1: ( () )
+            // InternalDataDSL.g:4680:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getDataInterchangePackageAction_0()); 
             }
-            // InternalDataDSL.g:4432:2: ()
-            // InternalDataDSL.g:4432:3: 
+            // InternalDataDSL.g:4681:2: ()
+            // InternalDataDSL.g:4681:3: 
             {
             }
 
@@ -16559,14 +17574,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__1"
-    // InternalDataDSL.g:4440:1: rule__DataInterchangePackage__Group__1 : rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2 ;
+    // InternalDataDSL.g:4689:1: rule__DataInterchangePackage__Group__1 : rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2 ;
     public final void rule__DataInterchangePackage__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4444:1: ( rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2 )
-            // InternalDataDSL.g:4445:2: rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2
+            // InternalDataDSL.g:4693:1: ( rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2 )
+            // InternalDataDSL.g:4694:2: rule__DataInterchangePackage__Group__1__Impl rule__DataInterchangePackage__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangePackage__Group__1__Impl();
@@ -16597,17 +17612,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__1__Impl"
-    // InternalDataDSL.g:4452:1: rule__DataInterchangePackage__Group__1__Impl : ( 'package' ) ;
+    // InternalDataDSL.g:4701:1: rule__DataInterchangePackage__Group__1__Impl : ( 'package' ) ;
     public final void rule__DataInterchangePackage__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4456:1: ( ( 'package' ) )
-            // InternalDataDSL.g:4457:1: ( 'package' )
+            // InternalDataDSL.g:4705:1: ( ( 'package' ) )
+            // InternalDataDSL.g:4706:1: ( 'package' )
             {
-            // InternalDataDSL.g:4457:1: ( 'package' )
-            // InternalDataDSL.g:4458:2: 'package'
+            // InternalDataDSL.g:4706:1: ( 'package' )
+            // InternalDataDSL.g:4707:2: 'package'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getPackageKeyword_1()); 
@@ -16638,14 +17653,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__2"
-    // InternalDataDSL.g:4467:1: rule__DataInterchangePackage__Group__2 : rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3 ;
+    // InternalDataDSL.g:4716:1: rule__DataInterchangePackage__Group__2 : rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3 ;
     public final void rule__DataInterchangePackage__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4471:1: ( rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3 )
-            // InternalDataDSL.g:4472:2: rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3
+            // InternalDataDSL.g:4720:1: ( rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3 )
+            // InternalDataDSL.g:4721:2: rule__DataInterchangePackage__Group__2__Impl rule__DataInterchangePackage__Group__3
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchangePackage__Group__2__Impl();
@@ -16676,23 +17691,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__2__Impl"
-    // InternalDataDSL.g:4479:1: rule__DataInterchangePackage__Group__2__Impl : ( ( rule__DataInterchangePackage__NameAssignment_2 ) ) ;
+    // InternalDataDSL.g:4728:1: rule__DataInterchangePackage__Group__2__Impl : ( ( rule__DataInterchangePackage__NameAssignment_2 ) ) ;
     public final void rule__DataInterchangePackage__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4483:1: ( ( ( rule__DataInterchangePackage__NameAssignment_2 ) ) )
-            // InternalDataDSL.g:4484:1: ( ( rule__DataInterchangePackage__NameAssignment_2 ) )
+            // InternalDataDSL.g:4732:1: ( ( ( rule__DataInterchangePackage__NameAssignment_2 ) ) )
+            // InternalDataDSL.g:4733:1: ( ( rule__DataInterchangePackage__NameAssignment_2 ) )
             {
-            // InternalDataDSL.g:4484:1: ( ( rule__DataInterchangePackage__NameAssignment_2 ) )
-            // InternalDataDSL.g:4485:2: ( rule__DataInterchangePackage__NameAssignment_2 )
+            // InternalDataDSL.g:4733:1: ( ( rule__DataInterchangePackage__NameAssignment_2 ) )
+            // InternalDataDSL.g:4734:2: ( rule__DataInterchangePackage__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getNameAssignment_2()); 
             }
-            // InternalDataDSL.g:4486:2: ( rule__DataInterchangePackage__NameAssignment_2 )
-            // InternalDataDSL.g:4486:3: rule__DataInterchangePackage__NameAssignment_2
+            // InternalDataDSL.g:4735:2: ( rule__DataInterchangePackage__NameAssignment_2 )
+            // InternalDataDSL.g:4735:3: rule__DataInterchangePackage__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePackage__NameAssignment_2();
@@ -16727,14 +17742,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__3"
-    // InternalDataDSL.g:4494:1: rule__DataInterchangePackage__Group__3 : rule__DataInterchangePackage__Group__3__Impl ;
+    // InternalDataDSL.g:4743:1: rule__DataInterchangePackage__Group__3 : rule__DataInterchangePackage__Group__3__Impl ;
     public final void rule__DataInterchangePackage__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4498:1: ( rule__DataInterchangePackage__Group__3__Impl )
-            // InternalDataDSL.g:4499:2: rule__DataInterchangePackage__Group__3__Impl
+            // InternalDataDSL.g:4747:1: ( rule__DataInterchangePackage__Group__3__Impl )
+            // InternalDataDSL.g:4748:2: rule__DataInterchangePackage__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePackage__Group__3__Impl();
@@ -16760,31 +17775,31 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group__3__Impl"
-    // InternalDataDSL.g:4505:1: rule__DataInterchangePackage__Group__3__Impl : ( ( rule__DataInterchangePackage__Group_3__0 )? ) ;
+    // InternalDataDSL.g:4754:1: rule__DataInterchangePackage__Group__3__Impl : ( ( rule__DataInterchangePackage__Group_3__0 )? ) ;
     public final void rule__DataInterchangePackage__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4509:1: ( ( ( rule__DataInterchangePackage__Group_3__0 )? ) )
-            // InternalDataDSL.g:4510:1: ( ( rule__DataInterchangePackage__Group_3__0 )? )
+            // InternalDataDSL.g:4758:1: ( ( ( rule__DataInterchangePackage__Group_3__0 )? ) )
+            // InternalDataDSL.g:4759:1: ( ( rule__DataInterchangePackage__Group_3__0 )? )
             {
-            // InternalDataDSL.g:4510:1: ( ( rule__DataInterchangePackage__Group_3__0 )? )
-            // InternalDataDSL.g:4511:2: ( rule__DataInterchangePackage__Group_3__0 )?
+            // InternalDataDSL.g:4759:1: ( ( rule__DataInterchangePackage__Group_3__0 )? )
+            // InternalDataDSL.g:4760:2: ( rule__DataInterchangePackage__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:4512:2: ( rule__DataInterchangePackage__Group_3__0 )?
-            int alt58=2;
-            int LA58_0 = input.LA(1);
+            // InternalDataDSL.g:4761:2: ( rule__DataInterchangePackage__Group_3__0 )?
+            int alt61=2;
+            int LA61_0 = input.LA(1);
 
-            if ( (LA58_0==74) ) {
-                alt58=1;
+            if ( (LA61_0==74) ) {
+                alt61=1;
             }
-            switch (alt58) {
+            switch (alt61) {
                 case 1 :
-                    // InternalDataDSL.g:4512:3: rule__DataInterchangePackage__Group_3__0
+                    // InternalDataDSL.g:4761:3: rule__DataInterchangePackage__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangePackage__Group_3__0();
@@ -16822,14 +17837,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__0"
-    // InternalDataDSL.g:4521:1: rule__DataInterchangePackage__Group_3__0 : rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1 ;
+    // InternalDataDSL.g:4770:1: rule__DataInterchangePackage__Group_3__0 : rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1 ;
     public final void rule__DataInterchangePackage__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4525:1: ( rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1 )
-            // InternalDataDSL.g:4526:2: rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1
+            // InternalDataDSL.g:4774:1: ( rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1 )
+            // InternalDataDSL.g:4775:2: rule__DataInterchangePackage__Group_3__0__Impl rule__DataInterchangePackage__Group_3__1
             {
             pushFollow(FOLLOW_9);
             rule__DataInterchangePackage__Group_3__0__Impl();
@@ -16860,17 +17875,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__0__Impl"
-    // InternalDataDSL.g:4533:1: rule__DataInterchangePackage__Group_3__0__Impl : ( '{' ) ;
+    // InternalDataDSL.g:4782:1: rule__DataInterchangePackage__Group_3__0__Impl : ( '{' ) ;
     public final void rule__DataInterchangePackage__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4537:1: ( ( '{' ) )
-            // InternalDataDSL.g:4538:1: ( '{' )
+            // InternalDataDSL.g:4786:1: ( ( '{' ) )
+            // InternalDataDSL.g:4787:1: ( '{' )
             {
-            // InternalDataDSL.g:4538:1: ( '{' )
-            // InternalDataDSL.g:4539:2: '{'
+            // InternalDataDSL.g:4787:1: ( '{' )
+            // InternalDataDSL.g:4788:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getLeftCurlyBracketKeyword_3_0()); 
@@ -16901,14 +17916,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__1"
-    // InternalDataDSL.g:4548:1: rule__DataInterchangePackage__Group_3__1 : rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2 ;
+    // InternalDataDSL.g:4797:1: rule__DataInterchangePackage__Group_3__1 : rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2 ;
     public final void rule__DataInterchangePackage__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4552:1: ( rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2 )
-            // InternalDataDSL.g:4553:2: rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2
+            // InternalDataDSL.g:4801:1: ( rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2 )
+            // InternalDataDSL.g:4802:2: rule__DataInterchangePackage__Group_3__1__Impl rule__DataInterchangePackage__Group_3__2
             {
             pushFollow(FOLLOW_9);
             rule__DataInterchangePackage__Group_3__1__Impl();
@@ -16939,35 +17954,35 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__1__Impl"
-    // InternalDataDSL.g:4560:1: rule__DataInterchangePackage__Group_3__1__Impl : ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* ) ;
+    // InternalDataDSL.g:4809:1: rule__DataInterchangePackage__Group_3__1__Impl : ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* ) ;
     public final void rule__DataInterchangePackage__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4564:1: ( ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* ) )
-            // InternalDataDSL.g:4565:1: ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* )
+            // InternalDataDSL.g:4813:1: ( ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* ) )
+            // InternalDataDSL.g:4814:1: ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* )
             {
-            // InternalDataDSL.g:4565:1: ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* )
-            // InternalDataDSL.g:4566:2: ( rule__DataInterchangePackage__GroupsAssignment_3_1 )*
+            // InternalDataDSL.g:4814:1: ( ( rule__DataInterchangePackage__GroupsAssignment_3_1 )* )
+            // InternalDataDSL.g:4815:2: ( rule__DataInterchangePackage__GroupsAssignment_3_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getGroupsAssignment_3_1()); 
             }
-            // InternalDataDSL.g:4567:2: ( rule__DataInterchangePackage__GroupsAssignment_3_1 )*
-            loop59:
+            // InternalDataDSL.g:4816:2: ( rule__DataInterchangePackage__GroupsAssignment_3_1 )*
+            loop62:
             do {
-                int alt59=2;
-                int LA59_0 = input.LA(1);
+                int alt62=2;
+                int LA62_0 = input.LA(1);
 
-                if ( (LA59_0==76) ) {
-                    alt59=1;
+                if ( (LA62_0==76) ) {
+                    alt62=1;
                 }
 
 
-                switch (alt59) {
+                switch (alt62) {
             	case 1 :
-            	    // InternalDataDSL.g:4567:3: rule__DataInterchangePackage__GroupsAssignment_3_1
+            	    // InternalDataDSL.g:4816:3: rule__DataInterchangePackage__GroupsAssignment_3_1
             	    {
             	    pushFollow(FOLLOW_10);
             	    rule__DataInterchangePackage__GroupsAssignment_3_1();
@@ -16979,7 +17994,7 @@
             	    break;
 
             	default :
-            	    break loop59;
+            	    break loop62;
                 }
             } while (true);
 
@@ -17008,14 +18023,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__2"
-    // InternalDataDSL.g:4575:1: rule__DataInterchangePackage__Group_3__2 : rule__DataInterchangePackage__Group_3__2__Impl ;
+    // InternalDataDSL.g:4824:1: rule__DataInterchangePackage__Group_3__2 : rule__DataInterchangePackage__Group_3__2__Impl ;
     public final void rule__DataInterchangePackage__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4579:1: ( rule__DataInterchangePackage__Group_3__2__Impl )
-            // InternalDataDSL.g:4580:2: rule__DataInterchangePackage__Group_3__2__Impl
+            // InternalDataDSL.g:4828:1: ( rule__DataInterchangePackage__Group_3__2__Impl )
+            // InternalDataDSL.g:4829:2: rule__DataInterchangePackage__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePackage__Group_3__2__Impl();
@@ -17041,17 +18056,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__Group_3__2__Impl"
-    // InternalDataDSL.g:4586:1: rule__DataInterchangePackage__Group_3__2__Impl : ( '}' ) ;
+    // InternalDataDSL.g:4835:1: rule__DataInterchangePackage__Group_3__2__Impl : ( '}' ) ;
     public final void rule__DataInterchangePackage__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4590:1: ( ( '}' ) )
-            // InternalDataDSL.g:4591:1: ( '}' )
+            // InternalDataDSL.g:4839:1: ( ( '}' ) )
+            // InternalDataDSL.g:4840:1: ( '}' )
             {
-            // InternalDataDSL.g:4591:1: ( '}' )
-            // InternalDataDSL.g:4592:2: '}'
+            // InternalDataDSL.g:4840:1: ( '}' )
+            // InternalDataDSL.g:4841:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getRightCurlyBracketKeyword_3_2()); 
@@ -17082,14 +18097,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__0"
-    // InternalDataDSL.g:4602:1: rule__DataInterchangeGroup__Group__0 : rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1 ;
+    // InternalDataDSL.g:4851:1: rule__DataInterchangeGroup__Group__0 : rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1 ;
     public final void rule__DataInterchangeGroup__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4606:1: ( rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1 )
-            // InternalDataDSL.g:4607:2: rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1
+            // InternalDataDSL.g:4855:1: ( rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1 )
+            // InternalDataDSL.g:4856:2: rule__DataInterchangeGroup__Group__0__Impl rule__DataInterchangeGroup__Group__1
             {
             pushFollow(FOLLOW_11);
             rule__DataInterchangeGroup__Group__0__Impl();
@@ -17120,23 +18135,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__0__Impl"
-    // InternalDataDSL.g:4614:1: rule__DataInterchangeGroup__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:4863:1: rule__DataInterchangeGroup__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeGroup__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4618:1: ( ( () ) )
-            // InternalDataDSL.g:4619:1: ( () )
+            // InternalDataDSL.g:4867:1: ( ( () ) )
+            // InternalDataDSL.g:4868:1: ( () )
             {
-            // InternalDataDSL.g:4619:1: ( () )
-            // InternalDataDSL.g:4620:2: ()
+            // InternalDataDSL.g:4868:1: ( () )
+            // InternalDataDSL.g:4869:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getDataInterchangeGroupAction_0()); 
             }
-            // InternalDataDSL.g:4621:2: ()
-            // InternalDataDSL.g:4621:3: 
+            // InternalDataDSL.g:4870:2: ()
+            // InternalDataDSL.g:4870:3: 
             {
             }
 
@@ -17161,14 +18176,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__1"
-    // InternalDataDSL.g:4629:1: rule__DataInterchangeGroup__Group__1 : rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2 ;
+    // InternalDataDSL.g:4878:1: rule__DataInterchangeGroup__Group__1 : rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2 ;
     public final void rule__DataInterchangeGroup__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4633:1: ( rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2 )
-            // InternalDataDSL.g:4634:2: rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2
+            // InternalDataDSL.g:4882:1: ( rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2 )
+            // InternalDataDSL.g:4883:2: rule__DataInterchangeGroup__Group__1__Impl rule__DataInterchangeGroup__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeGroup__Group__1__Impl();
@@ -17199,17 +18214,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__1__Impl"
-    // InternalDataDSL.g:4641:1: rule__DataInterchangeGroup__Group__1__Impl : ( 'group' ) ;
+    // InternalDataDSL.g:4890:1: rule__DataInterchangeGroup__Group__1__Impl : ( 'group' ) ;
     public final void rule__DataInterchangeGroup__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4645:1: ( ( 'group' ) )
-            // InternalDataDSL.g:4646:1: ( 'group' )
+            // InternalDataDSL.g:4894:1: ( ( 'group' ) )
+            // InternalDataDSL.g:4895:1: ( 'group' )
             {
-            // InternalDataDSL.g:4646:1: ( 'group' )
-            // InternalDataDSL.g:4647:2: 'group'
+            // InternalDataDSL.g:4895:1: ( 'group' )
+            // InternalDataDSL.g:4896:2: 'group'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getGroupKeyword_1()); 
@@ -17240,14 +18255,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__2"
-    // InternalDataDSL.g:4656:1: rule__DataInterchangeGroup__Group__2 : rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3 ;
+    // InternalDataDSL.g:4905:1: rule__DataInterchangeGroup__Group__2 : rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3 ;
     public final void rule__DataInterchangeGroup__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4660:1: ( rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3 )
-            // InternalDataDSL.g:4661:2: rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3
+            // InternalDataDSL.g:4909:1: ( rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3 )
+            // InternalDataDSL.g:4910:2: rule__DataInterchangeGroup__Group__2__Impl rule__DataInterchangeGroup__Group__3
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchangeGroup__Group__2__Impl();
@@ -17278,23 +18293,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__2__Impl"
-    // InternalDataDSL.g:4668:1: rule__DataInterchangeGroup__Group__2__Impl : ( ( rule__DataInterchangeGroup__NameAssignment_2 ) ) ;
+    // InternalDataDSL.g:4917:1: rule__DataInterchangeGroup__Group__2__Impl : ( ( rule__DataInterchangeGroup__NameAssignment_2 ) ) ;
     public final void rule__DataInterchangeGroup__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4672:1: ( ( ( rule__DataInterchangeGroup__NameAssignment_2 ) ) )
-            // InternalDataDSL.g:4673:1: ( ( rule__DataInterchangeGroup__NameAssignment_2 ) )
+            // InternalDataDSL.g:4921:1: ( ( ( rule__DataInterchangeGroup__NameAssignment_2 ) ) )
+            // InternalDataDSL.g:4922:1: ( ( rule__DataInterchangeGroup__NameAssignment_2 ) )
             {
-            // InternalDataDSL.g:4673:1: ( ( rule__DataInterchangeGroup__NameAssignment_2 ) )
-            // InternalDataDSL.g:4674:2: ( rule__DataInterchangeGroup__NameAssignment_2 )
+            // InternalDataDSL.g:4922:1: ( ( rule__DataInterchangeGroup__NameAssignment_2 ) )
+            // InternalDataDSL.g:4923:2: ( rule__DataInterchangeGroup__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getNameAssignment_2()); 
             }
-            // InternalDataDSL.g:4675:2: ( rule__DataInterchangeGroup__NameAssignment_2 )
-            // InternalDataDSL.g:4675:3: rule__DataInterchangeGroup__NameAssignment_2
+            // InternalDataDSL.g:4924:2: ( rule__DataInterchangeGroup__NameAssignment_2 )
+            // InternalDataDSL.g:4924:3: rule__DataInterchangeGroup__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeGroup__NameAssignment_2();
@@ -17329,14 +18344,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__3"
-    // InternalDataDSL.g:4683:1: rule__DataInterchangeGroup__Group__3 : rule__DataInterchangeGroup__Group__3__Impl ;
+    // InternalDataDSL.g:4932:1: rule__DataInterchangeGroup__Group__3 : rule__DataInterchangeGroup__Group__3__Impl ;
     public final void rule__DataInterchangeGroup__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4687:1: ( rule__DataInterchangeGroup__Group__3__Impl )
-            // InternalDataDSL.g:4688:2: rule__DataInterchangeGroup__Group__3__Impl
+            // InternalDataDSL.g:4936:1: ( rule__DataInterchangeGroup__Group__3__Impl )
+            // InternalDataDSL.g:4937:2: rule__DataInterchangeGroup__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeGroup__Group__3__Impl();
@@ -17362,31 +18377,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group__3__Impl"
-    // InternalDataDSL.g:4694:1: rule__DataInterchangeGroup__Group__3__Impl : ( ( rule__DataInterchangeGroup__Group_3__0 )? ) ;
+    // InternalDataDSL.g:4943:1: rule__DataInterchangeGroup__Group__3__Impl : ( ( rule__DataInterchangeGroup__Group_3__0 )? ) ;
     public final void rule__DataInterchangeGroup__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4698:1: ( ( ( rule__DataInterchangeGroup__Group_3__0 )? ) )
-            // InternalDataDSL.g:4699:1: ( ( rule__DataInterchangeGroup__Group_3__0 )? )
+            // InternalDataDSL.g:4947:1: ( ( ( rule__DataInterchangeGroup__Group_3__0 )? ) )
+            // InternalDataDSL.g:4948:1: ( ( rule__DataInterchangeGroup__Group_3__0 )? )
             {
-            // InternalDataDSL.g:4699:1: ( ( rule__DataInterchangeGroup__Group_3__0 )? )
-            // InternalDataDSL.g:4700:2: ( rule__DataInterchangeGroup__Group_3__0 )?
+            // InternalDataDSL.g:4948:1: ( ( rule__DataInterchangeGroup__Group_3__0 )? )
+            // InternalDataDSL.g:4949:2: ( rule__DataInterchangeGroup__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:4701:2: ( rule__DataInterchangeGroup__Group_3__0 )?
-            int alt60=2;
-            int LA60_0 = input.LA(1);
+            // InternalDataDSL.g:4950:2: ( rule__DataInterchangeGroup__Group_3__0 )?
+            int alt63=2;
+            int LA63_0 = input.LA(1);
 
-            if ( (LA60_0==74) ) {
-                alt60=1;
+            if ( (LA63_0==74) ) {
+                alt63=1;
             }
-            switch (alt60) {
+            switch (alt63) {
                 case 1 :
-                    // InternalDataDSL.g:4701:3: rule__DataInterchangeGroup__Group_3__0
+                    // InternalDataDSL.g:4950:3: rule__DataInterchangeGroup__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeGroup__Group_3__0();
@@ -17424,14 +18439,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__0"
-    // InternalDataDSL.g:4710:1: rule__DataInterchangeGroup__Group_3__0 : rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1 ;
+    // InternalDataDSL.g:4959:1: rule__DataInterchangeGroup__Group_3__0 : rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1 ;
     public final void rule__DataInterchangeGroup__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4714:1: ( rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1 )
-            // InternalDataDSL.g:4715:2: rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1
+            // InternalDataDSL.g:4963:1: ( rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1 )
+            // InternalDataDSL.g:4964:2: rule__DataInterchangeGroup__Group_3__0__Impl rule__DataInterchangeGroup__Group_3__1
             {
             pushFollow(FOLLOW_12);
             rule__DataInterchangeGroup__Group_3__0__Impl();
@@ -17462,17 +18477,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__0__Impl"
-    // InternalDataDSL.g:4722:1: rule__DataInterchangeGroup__Group_3__0__Impl : ( '{' ) ;
+    // InternalDataDSL.g:4971:1: rule__DataInterchangeGroup__Group_3__0__Impl : ( '{' ) ;
     public final void rule__DataInterchangeGroup__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4726:1: ( ( '{' ) )
-            // InternalDataDSL.g:4727:1: ( '{' )
+            // InternalDataDSL.g:4975:1: ( ( '{' ) )
+            // InternalDataDSL.g:4976:1: ( '{' )
             {
-            // InternalDataDSL.g:4727:1: ( '{' )
-            // InternalDataDSL.g:4728:2: '{'
+            // InternalDataDSL.g:4976:1: ( '{' )
+            // InternalDataDSL.g:4977:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getLeftCurlyBracketKeyword_3_0()); 
@@ -17503,14 +18518,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__1"
-    // InternalDataDSL.g:4737:1: rule__DataInterchangeGroup__Group_3__1 : rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2 ;
+    // InternalDataDSL.g:4986:1: rule__DataInterchangeGroup__Group_3__1 : rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2 ;
     public final void rule__DataInterchangeGroup__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4741:1: ( rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2 )
-            // InternalDataDSL.g:4742:2: rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2
+            // InternalDataDSL.g:4990:1: ( rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2 )
+            // InternalDataDSL.g:4991:2: rule__DataInterchangeGroup__Group_3__1__Impl rule__DataInterchangeGroup__Group_3__2
             {
             pushFollow(FOLLOW_12);
             rule__DataInterchangeGroup__Group_3__1__Impl();
@@ -17541,35 +18556,35 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__1__Impl"
-    // InternalDataDSL.g:4749:1: rule__DataInterchangeGroup__Group_3__1__Impl : ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* ) ;
+    // InternalDataDSL.g:4998:1: rule__DataInterchangeGroup__Group_3__1__Impl : ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* ) ;
     public final void rule__DataInterchangeGroup__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4753:1: ( ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* ) )
-            // InternalDataDSL.g:4754:1: ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* )
+            // InternalDataDSL.g:5002:1: ( ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* ) )
+            // InternalDataDSL.g:5003:1: ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* )
             {
-            // InternalDataDSL.g:4754:1: ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* )
-            // InternalDataDSL.g:4755:2: ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )*
+            // InternalDataDSL.g:5003:1: ( ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )* )
+            // InternalDataDSL.g:5004:2: ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getDatIntsAssignment_3_1()); 
             }
-            // InternalDataDSL.g:4756:2: ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )*
-            loop61:
+            // InternalDataDSL.g:5005:2: ( rule__DataInterchangeGroup__DatIntsAssignment_3_1 )*
+            loop64:
             do {
-                int alt61=2;
-                int LA61_0 = input.LA(1);
+                int alt64=2;
+                int LA64_0 = input.LA(1);
 
-                if ( (LA61_0==77) ) {
-                    alt61=1;
+                if ( (LA64_0==77) ) {
+                    alt64=1;
                 }
 
 
-                switch (alt61) {
+                switch (alt64) {
             	case 1 :
-            	    // InternalDataDSL.g:4756:3: rule__DataInterchangeGroup__DatIntsAssignment_3_1
+            	    // InternalDataDSL.g:5005:3: rule__DataInterchangeGroup__DatIntsAssignment_3_1
             	    {
             	    pushFollow(FOLLOW_13);
             	    rule__DataInterchangeGroup__DatIntsAssignment_3_1();
@@ -17581,7 +18596,7 @@
             	    break;
 
             	default :
-            	    break loop61;
+            	    break loop64;
                 }
             } while (true);
 
@@ -17610,14 +18625,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__2"
-    // InternalDataDSL.g:4764:1: rule__DataInterchangeGroup__Group_3__2 : rule__DataInterchangeGroup__Group_3__2__Impl ;
+    // InternalDataDSL.g:5013:1: rule__DataInterchangeGroup__Group_3__2 : rule__DataInterchangeGroup__Group_3__2__Impl ;
     public final void rule__DataInterchangeGroup__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4768:1: ( rule__DataInterchangeGroup__Group_3__2__Impl )
-            // InternalDataDSL.g:4769:2: rule__DataInterchangeGroup__Group_3__2__Impl
+            // InternalDataDSL.g:5017:1: ( rule__DataInterchangeGroup__Group_3__2__Impl )
+            // InternalDataDSL.g:5018:2: rule__DataInterchangeGroup__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeGroup__Group_3__2__Impl();
@@ -17643,17 +18658,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__Group_3__2__Impl"
-    // InternalDataDSL.g:4775:1: rule__DataInterchangeGroup__Group_3__2__Impl : ( '}' ) ;
+    // InternalDataDSL.g:5024:1: rule__DataInterchangeGroup__Group_3__2__Impl : ( '}' ) ;
     public final void rule__DataInterchangeGroup__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4779:1: ( ( '}' ) )
-            // InternalDataDSL.g:4780:1: ( '}' )
+            // InternalDataDSL.g:5028:1: ( ( '}' ) )
+            // InternalDataDSL.g:5029:1: ( '}' )
             {
-            // InternalDataDSL.g:4780:1: ( '}' )
-            // InternalDataDSL.g:4781:2: '}'
+            // InternalDataDSL.g:5029:1: ( '}' )
+            // InternalDataDSL.g:5030:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getRightCurlyBracketKeyword_3_2()); 
@@ -17684,14 +18699,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__0"
-    // InternalDataDSL.g:4791:1: rule__DataInterchange__Group__0 : rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1 ;
+    // InternalDataDSL.g:5040:1: rule__DataInterchange__Group__0 : rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1 ;
     public final void rule__DataInterchange__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4795:1: ( rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1 )
-            // InternalDataDSL.g:4796:2: rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1
+            // InternalDataDSL.g:5044:1: ( rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1 )
+            // InternalDataDSL.g:5045:2: rule__DataInterchange__Group__0__Impl rule__DataInterchange__Group__1
             {
             pushFollow(FOLLOW_14);
             rule__DataInterchange__Group__0__Impl();
@@ -17722,23 +18737,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__0__Impl"
-    // InternalDataDSL.g:4803:1: rule__DataInterchange__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:5052:1: rule__DataInterchange__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchange__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4807:1: ( ( () ) )
-            // InternalDataDSL.g:4808:1: ( () )
+            // InternalDataDSL.g:5056:1: ( ( () ) )
+            // InternalDataDSL.g:5057:1: ( () )
             {
-            // InternalDataDSL.g:4808:1: ( () )
-            // InternalDataDSL.g:4809:2: ()
+            // InternalDataDSL.g:5057:1: ( () )
+            // InternalDataDSL.g:5058:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDataInterchangeAction_0()); 
             }
-            // InternalDataDSL.g:4810:2: ()
-            // InternalDataDSL.g:4810:3: 
+            // InternalDataDSL.g:5059:2: ()
+            // InternalDataDSL.g:5059:3: 
             {
             }
 
@@ -17763,14 +18778,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__1"
-    // InternalDataDSL.g:4818:1: rule__DataInterchange__Group__1 : rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2 ;
+    // InternalDataDSL.g:5067:1: rule__DataInterchange__Group__1 : rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2 ;
     public final void rule__DataInterchange__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4822:1: ( rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2 )
-            // InternalDataDSL.g:4823:2: rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2
+            // InternalDataDSL.g:5071:1: ( rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2 )
+            // InternalDataDSL.g:5072:2: rule__DataInterchange__Group__1__Impl rule__DataInterchange__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchange__Group__1__Impl();
@@ -17801,17 +18816,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__1__Impl"
-    // InternalDataDSL.g:4830:1: rule__DataInterchange__Group__1__Impl : ( 'interchange' ) ;
+    // InternalDataDSL.g:5079:1: rule__DataInterchange__Group__1__Impl : ( 'interchange' ) ;
     public final void rule__DataInterchange__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4834:1: ( ( 'interchange' ) )
-            // InternalDataDSL.g:4835:1: ( 'interchange' )
+            // InternalDataDSL.g:5083:1: ( ( 'interchange' ) )
+            // InternalDataDSL.g:5084:1: ( 'interchange' )
             {
-            // InternalDataDSL.g:4835:1: ( 'interchange' )
-            // InternalDataDSL.g:4836:2: 'interchange'
+            // InternalDataDSL.g:5084:1: ( 'interchange' )
+            // InternalDataDSL.g:5085:2: 'interchange'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getInterchangeKeyword_1()); 
@@ -17842,14 +18857,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__2"
-    // InternalDataDSL.g:4845:1: rule__DataInterchange__Group__2 : rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3 ;
+    // InternalDataDSL.g:5094:1: rule__DataInterchange__Group__2 : rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3 ;
     public final void rule__DataInterchange__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4849:1: ( rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3 )
-            // InternalDataDSL.g:4850:2: rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3
+            // InternalDataDSL.g:5098:1: ( rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3 )
+            // InternalDataDSL.g:5099:2: rule__DataInterchange__Group__2__Impl rule__DataInterchange__Group__3
             {
             pushFollow(FOLLOW_15);
             rule__DataInterchange__Group__2__Impl();
@@ -17880,23 +18895,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__2__Impl"
-    // InternalDataDSL.g:4857:1: rule__DataInterchange__Group__2__Impl : ( ( rule__DataInterchange__NameAssignment_2 ) ) ;
+    // InternalDataDSL.g:5106:1: rule__DataInterchange__Group__2__Impl : ( ( rule__DataInterchange__NameAssignment_2 ) ) ;
     public final void rule__DataInterchange__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4861:1: ( ( ( rule__DataInterchange__NameAssignment_2 ) ) )
-            // InternalDataDSL.g:4862:1: ( ( rule__DataInterchange__NameAssignment_2 ) )
+            // InternalDataDSL.g:5110:1: ( ( ( rule__DataInterchange__NameAssignment_2 ) ) )
+            // InternalDataDSL.g:5111:1: ( ( rule__DataInterchange__NameAssignment_2 ) )
             {
-            // InternalDataDSL.g:4862:1: ( ( rule__DataInterchange__NameAssignment_2 ) )
-            // InternalDataDSL.g:4863:2: ( rule__DataInterchange__NameAssignment_2 )
+            // InternalDataDSL.g:5111:1: ( ( rule__DataInterchange__NameAssignment_2 ) )
+            // InternalDataDSL.g:5112:2: ( rule__DataInterchange__NameAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getNameAssignment_2()); 
             }
-            // InternalDataDSL.g:4864:2: ( rule__DataInterchange__NameAssignment_2 )
-            // InternalDataDSL.g:4864:3: rule__DataInterchange__NameAssignment_2
+            // InternalDataDSL.g:5113:2: ( rule__DataInterchange__NameAssignment_2 )
+            // InternalDataDSL.g:5113:3: rule__DataInterchange__NameAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__NameAssignment_2();
@@ -17931,14 +18946,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__3"
-    // InternalDataDSL.g:4872:1: rule__DataInterchange__Group__3 : rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4 ;
+    // InternalDataDSL.g:5121:1: rule__DataInterchange__Group__3 : rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4 ;
     public final void rule__DataInterchange__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4876:1: ( rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4 )
-            // InternalDataDSL.g:4877:2: rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4
+            // InternalDataDSL.g:5125:1: ( rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4 )
+            // InternalDataDSL.g:5126:2: rule__DataInterchange__Group__3__Impl rule__DataInterchange__Group__4
             {
             pushFollow(FOLLOW_15);
             rule__DataInterchange__Group__3__Impl();
@@ -17969,31 +18984,31 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__3__Impl"
-    // InternalDataDSL.g:4884:1: rule__DataInterchange__Group__3__Impl : ( ( rule__DataInterchange__Group_3__0 )? ) ;
+    // InternalDataDSL.g:5133:1: rule__DataInterchange__Group__3__Impl : ( ( rule__DataInterchange__Group_3__0 )? ) ;
     public final void rule__DataInterchange__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4888:1: ( ( ( rule__DataInterchange__Group_3__0 )? ) )
-            // InternalDataDSL.g:4889:1: ( ( rule__DataInterchange__Group_3__0 )? )
+            // InternalDataDSL.g:5137:1: ( ( ( rule__DataInterchange__Group_3__0 )? ) )
+            // InternalDataDSL.g:5138:1: ( ( rule__DataInterchange__Group_3__0 )? )
             {
-            // InternalDataDSL.g:4889:1: ( ( rule__DataInterchange__Group_3__0 )? )
-            // InternalDataDSL.g:4890:2: ( rule__DataInterchange__Group_3__0 )?
+            // InternalDataDSL.g:5138:1: ( ( rule__DataInterchange__Group_3__0 )? )
+            // InternalDataDSL.g:5139:2: ( rule__DataInterchange__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:4891:2: ( rule__DataInterchange__Group_3__0 )?
-            int alt62=2;
-            int LA62_0 = input.LA(1);
+            // InternalDataDSL.g:5140:2: ( rule__DataInterchange__Group_3__0 )?
+            int alt65=2;
+            int LA65_0 = input.LA(1);
 
-            if ( (LA62_0==148) ) {
-                alt62=1;
+            if ( (LA65_0==154) ) {
+                alt65=1;
             }
-            switch (alt62) {
+            switch (alt65) {
                 case 1 :
-                    // InternalDataDSL.g:4891:3: rule__DataInterchange__Group_3__0
+                    // InternalDataDSL.g:5140:3: rule__DataInterchange__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchange__Group_3__0();
@@ -18031,14 +19046,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__4"
-    // InternalDataDSL.g:4899:1: rule__DataInterchange__Group__4 : rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5 ;
+    // InternalDataDSL.g:5148:1: rule__DataInterchange__Group__4 : rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5 ;
     public final void rule__DataInterchange__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4903:1: ( rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5 )
-            // InternalDataDSL.g:4904:2: rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5
+            // InternalDataDSL.g:5152:1: ( rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5 )
+            // InternalDataDSL.g:5153:2: rule__DataInterchange__Group__4__Impl rule__DataInterchange__Group__5
             {
             pushFollow(FOLLOW_16);
             rule__DataInterchange__Group__4__Impl();
@@ -18069,23 +19084,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__4__Impl"
-    // InternalDataDSL.g:4911:1: rule__DataInterchange__Group__4__Impl : ( ( rule__DataInterchange__ModeAssignment_4 ) ) ;
+    // InternalDataDSL.g:5160:1: rule__DataInterchange__Group__4__Impl : ( ( rule__DataInterchange__ModeAssignment_4 ) ) ;
     public final void rule__DataInterchange__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4915:1: ( ( ( rule__DataInterchange__ModeAssignment_4 ) ) )
-            // InternalDataDSL.g:4916:1: ( ( rule__DataInterchange__ModeAssignment_4 ) )
+            // InternalDataDSL.g:5164:1: ( ( ( rule__DataInterchange__ModeAssignment_4 ) ) )
+            // InternalDataDSL.g:5165:1: ( ( rule__DataInterchange__ModeAssignment_4 ) )
             {
-            // InternalDataDSL.g:4916:1: ( ( rule__DataInterchange__ModeAssignment_4 ) )
-            // InternalDataDSL.g:4917:2: ( rule__DataInterchange__ModeAssignment_4 )
+            // InternalDataDSL.g:5165:1: ( ( rule__DataInterchange__ModeAssignment_4 ) )
+            // InternalDataDSL.g:5166:2: ( rule__DataInterchange__ModeAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getModeAssignment_4()); 
             }
-            // InternalDataDSL.g:4918:2: ( rule__DataInterchange__ModeAssignment_4 )
-            // InternalDataDSL.g:4918:3: rule__DataInterchange__ModeAssignment_4
+            // InternalDataDSL.g:5167:2: ( rule__DataInterchange__ModeAssignment_4 )
+            // InternalDataDSL.g:5167:3: rule__DataInterchange__ModeAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__ModeAssignment_4();
@@ -18120,14 +19135,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__5"
-    // InternalDataDSL.g:4926:1: rule__DataInterchange__Group__5 : rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6 ;
+    // InternalDataDSL.g:5175:1: rule__DataInterchange__Group__5 : rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6 ;
     public final void rule__DataInterchange__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4930:1: ( rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6 )
-            // InternalDataDSL.g:4931:2: rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6
+            // InternalDataDSL.g:5179:1: ( rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6 )
+            // InternalDataDSL.g:5180:2: rule__DataInterchange__Group__5__Impl rule__DataInterchange__Group__6
             {
             pushFollow(FOLLOW_16);
             rule__DataInterchange__Group__5__Impl();
@@ -18158,31 +19173,31 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__5__Impl"
-    // InternalDataDSL.g:4938:1: rule__DataInterchange__Group__5__Impl : ( ( rule__DataInterchange__Group_5__0 )? ) ;
+    // InternalDataDSL.g:5187:1: rule__DataInterchange__Group__5__Impl : ( ( rule__DataInterchange__Group_5__0 )? ) ;
     public final void rule__DataInterchange__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4942:1: ( ( ( rule__DataInterchange__Group_5__0 )? ) )
-            // InternalDataDSL.g:4943:1: ( ( rule__DataInterchange__Group_5__0 )? )
+            // InternalDataDSL.g:5191:1: ( ( ( rule__DataInterchange__Group_5__0 )? ) )
+            // InternalDataDSL.g:5192:1: ( ( rule__DataInterchange__Group_5__0 )? )
             {
-            // InternalDataDSL.g:4943:1: ( ( rule__DataInterchange__Group_5__0 )? )
-            // InternalDataDSL.g:4944:2: ( rule__DataInterchange__Group_5__0 )?
+            // InternalDataDSL.g:5192:1: ( ( rule__DataInterchange__Group_5__0 )? )
+            // InternalDataDSL.g:5193:2: ( rule__DataInterchange__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getGroup_5()); 
             }
-            // InternalDataDSL.g:4945:2: ( rule__DataInterchange__Group_5__0 )?
-            int alt63=2;
-            int LA63_0 = input.LA(1);
+            // InternalDataDSL.g:5194:2: ( rule__DataInterchange__Group_5__0 )?
+            int alt66=2;
+            int LA66_0 = input.LA(1);
 
-            if ( (LA63_0==149) ) {
-                alt63=1;
+            if ( (LA66_0==155) ) {
+                alt66=1;
             }
-            switch (alt63) {
+            switch (alt66) {
                 case 1 :
-                    // InternalDataDSL.g:4945:3: rule__DataInterchange__Group_5__0
+                    // InternalDataDSL.g:5194:3: rule__DataInterchange__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchange__Group_5__0();
@@ -18220,14 +19235,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__6"
-    // InternalDataDSL.g:4953:1: rule__DataInterchange__Group__6 : rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7 ;
+    // InternalDataDSL.g:5202:1: rule__DataInterchange__Group__6 : rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7 ;
     public final void rule__DataInterchange__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4957:1: ( rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7 )
-            // InternalDataDSL.g:4958:2: rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7
+            // InternalDataDSL.g:5206:1: ( rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7 )
+            // InternalDataDSL.g:5207:2: rule__DataInterchange__Group__6__Impl rule__DataInterchange__Group__7
             {
             pushFollow(FOLLOW_16);
             rule__DataInterchange__Group__6__Impl();
@@ -18258,31 +19273,31 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__6__Impl"
-    // InternalDataDSL.g:4965:1: rule__DataInterchange__Group__6__Impl : ( ( rule__DataInterchange__CreateReportAssignment_6 )? ) ;
+    // InternalDataDSL.g:5214:1: rule__DataInterchange__Group__6__Impl : ( ( rule__DataInterchange__CreateReportAssignment_6 )? ) ;
     public final void rule__DataInterchange__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4969:1: ( ( ( rule__DataInterchange__CreateReportAssignment_6 )? ) )
-            // InternalDataDSL.g:4970:1: ( ( rule__DataInterchange__CreateReportAssignment_6 )? )
+            // InternalDataDSL.g:5218:1: ( ( ( rule__DataInterchange__CreateReportAssignment_6 )? ) )
+            // InternalDataDSL.g:5219:1: ( ( rule__DataInterchange__CreateReportAssignment_6 )? )
             {
-            // InternalDataDSL.g:4970:1: ( ( rule__DataInterchange__CreateReportAssignment_6 )? )
-            // InternalDataDSL.g:4971:2: ( rule__DataInterchange__CreateReportAssignment_6 )?
+            // InternalDataDSL.g:5219:1: ( ( rule__DataInterchange__CreateReportAssignment_6 )? )
+            // InternalDataDSL.g:5220:2: ( rule__DataInterchange__CreateReportAssignment_6 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getCreateReportAssignment_6()); 
             }
-            // InternalDataDSL.g:4972:2: ( rule__DataInterchange__CreateReportAssignment_6 )?
-            int alt64=2;
-            int LA64_0 = input.LA(1);
+            // InternalDataDSL.g:5221:2: ( rule__DataInterchange__CreateReportAssignment_6 )?
+            int alt67=2;
+            int LA67_0 = input.LA(1);
 
-            if ( (LA64_0==150) ) {
-                alt64=1;
+            if ( (LA67_0==156) ) {
+                alt67=1;
             }
-            switch (alt64) {
+            switch (alt67) {
                 case 1 :
-                    // InternalDataDSL.g:4972:3: rule__DataInterchange__CreateReportAssignment_6
+                    // InternalDataDSL.g:5221:3: rule__DataInterchange__CreateReportAssignment_6
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchange__CreateReportAssignment_6();
@@ -18320,14 +19335,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__7"
-    // InternalDataDSL.g:4980:1: rule__DataInterchange__Group__7 : rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8 ;
+    // InternalDataDSL.g:5229:1: rule__DataInterchange__Group__7 : rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8 ;
     public final void rule__DataInterchange__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4984:1: ( rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8 )
-            // InternalDataDSL.g:4985:2: rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8
+            // InternalDataDSL.g:5233:1: ( rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8 )
+            // InternalDataDSL.g:5234:2: rule__DataInterchange__Group__7__Impl rule__DataInterchange__Group__8
             {
             pushFollow(FOLLOW_16);
             rule__DataInterchange__Group__7__Impl();
@@ -18358,31 +19373,31 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__7__Impl"
-    // InternalDataDSL.g:4992:1: rule__DataInterchange__Group__7__Impl : ( ( rule__DataInterchange__Group_7__0 )? ) ;
+    // InternalDataDSL.g:5241:1: rule__DataInterchange__Group__7__Impl : ( ( rule__DataInterchange__Group_7__0 )? ) ;
     public final void rule__DataInterchange__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:4996:1: ( ( ( rule__DataInterchange__Group_7__0 )? ) )
-            // InternalDataDSL.g:4997:1: ( ( rule__DataInterchange__Group_7__0 )? )
+            // InternalDataDSL.g:5245:1: ( ( ( rule__DataInterchange__Group_7__0 )? ) )
+            // InternalDataDSL.g:5246:1: ( ( rule__DataInterchange__Group_7__0 )? )
             {
-            // InternalDataDSL.g:4997:1: ( ( rule__DataInterchange__Group_7__0 )? )
-            // InternalDataDSL.g:4998:2: ( rule__DataInterchange__Group_7__0 )?
+            // InternalDataDSL.g:5246:1: ( ( rule__DataInterchange__Group_7__0 )? )
+            // InternalDataDSL.g:5247:2: ( rule__DataInterchange__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getGroup_7()); 
             }
-            // InternalDataDSL.g:4999:2: ( rule__DataInterchange__Group_7__0 )?
-            int alt65=2;
-            int LA65_0 = input.LA(1);
+            // InternalDataDSL.g:5248:2: ( rule__DataInterchange__Group_7__0 )?
+            int alt68=2;
+            int LA68_0 = input.LA(1);
 
-            if ( (LA65_0==80) ) {
-                alt65=1;
+            if ( (LA68_0==80) ) {
+                alt68=1;
             }
-            switch (alt65) {
+            switch (alt68) {
                 case 1 :
-                    // InternalDataDSL.g:4999:3: rule__DataInterchange__Group_7__0
+                    // InternalDataDSL.g:5248:3: rule__DataInterchange__Group_7__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchange__Group_7__0();
@@ -18420,14 +19435,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__8"
-    // InternalDataDSL.g:5007:1: rule__DataInterchange__Group__8 : rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9 ;
+    // InternalDataDSL.g:5256:1: rule__DataInterchange__Group__8 : rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9 ;
     public final void rule__DataInterchange__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5011:1: ( rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9 )
-            // InternalDataDSL.g:5012:2: rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9
+            // InternalDataDSL.g:5260:1: ( rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9 )
+            // InternalDataDSL.g:5261:2: rule__DataInterchange__Group__8__Impl rule__DataInterchange__Group__9
             {
             pushFollow(FOLLOW_16);
             rule__DataInterchange__Group__8__Impl();
@@ -18458,31 +19473,31 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__8__Impl"
-    // InternalDataDSL.g:5019:1: rule__DataInterchange__Group__8__Impl : ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? ) ;
+    // InternalDataDSL.g:5268:1: rule__DataInterchange__Group__8__Impl : ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? ) ;
     public final void rule__DataInterchange__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5023:1: ( ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? ) )
-            // InternalDataDSL.g:5024:1: ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? )
+            // InternalDataDSL.g:5272:1: ( ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? ) )
+            // InternalDataDSL.g:5273:1: ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? )
             {
-            // InternalDataDSL.g:5024:1: ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? )
-            // InternalDataDSL.g:5025:2: ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )?
+            // InternalDataDSL.g:5273:1: ( ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )? )
+            // InternalDataDSL.g:5274:2: ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDeleteFileAfterImportAssignment_8()); 
             }
-            // InternalDataDSL.g:5026:2: ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )?
-            int alt66=2;
-            int LA66_0 = input.LA(1);
+            // InternalDataDSL.g:5275:2: ( rule__DataInterchange__DeleteFileAfterImportAssignment_8 )?
+            int alt69=2;
+            int LA69_0 = input.LA(1);
 
-            if ( (LA66_0==151) ) {
-                alt66=1;
+            if ( (LA69_0==157) ) {
+                alt69=1;
             }
-            switch (alt66) {
+            switch (alt69) {
                 case 1 :
-                    // InternalDataDSL.g:5026:3: rule__DataInterchange__DeleteFileAfterImportAssignment_8
+                    // InternalDataDSL.g:5275:3: rule__DataInterchange__DeleteFileAfterImportAssignment_8
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchange__DeleteFileAfterImportAssignment_8();
@@ -18520,14 +19535,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__9"
-    // InternalDataDSL.g:5034:1: rule__DataInterchange__Group__9 : rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10 ;
+    // InternalDataDSL.g:5283:1: rule__DataInterchange__Group__9 : rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10 ;
     public final void rule__DataInterchange__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5038:1: ( rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10 )
-            // InternalDataDSL.g:5039:2: rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10
+            // InternalDataDSL.g:5287:1: ( rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10 )
+            // InternalDataDSL.g:5288:2: rule__DataInterchange__Group__9__Impl rule__DataInterchange__Group__10
             {
             pushFollow(FOLLOW_17);
             rule__DataInterchange__Group__9__Impl();
@@ -18558,17 +19573,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__9__Impl"
-    // InternalDataDSL.g:5046:1: rule__DataInterchange__Group__9__Impl : ( 'file' ) ;
+    // InternalDataDSL.g:5295:1: rule__DataInterchange__Group__9__Impl : ( 'file' ) ;
     public final void rule__DataInterchange__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5050:1: ( ( 'file' ) )
-            // InternalDataDSL.g:5051:1: ( 'file' )
+            // InternalDataDSL.g:5299:1: ( ( 'file' ) )
+            // InternalDataDSL.g:5300:1: ( 'file' )
             {
-            // InternalDataDSL.g:5051:1: ( 'file' )
-            // InternalDataDSL.g:5052:2: 'file'
+            // InternalDataDSL.g:5300:1: ( 'file' )
+            // InternalDataDSL.g:5301:2: 'file'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getFileKeyword_9()); 
@@ -18599,14 +19614,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__10"
-    // InternalDataDSL.g:5061:1: rule__DataInterchange__Group__10 : rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11 ;
+    // InternalDataDSL.g:5310:1: rule__DataInterchange__Group__10 : rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11 ;
     public final void rule__DataInterchange__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5065:1: ( rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11 )
-            // InternalDataDSL.g:5066:2: rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11
+            // InternalDataDSL.g:5314:1: ( rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11 )
+            // InternalDataDSL.g:5315:2: rule__DataInterchange__Group__10__Impl rule__DataInterchange__Group__11
             {
             pushFollow(FOLLOW_18);
             rule__DataInterchange__Group__10__Impl();
@@ -18637,23 +19652,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__10__Impl"
-    // InternalDataDSL.g:5073:1: rule__DataInterchange__Group__10__Impl : ( ( rule__DataInterchange__FileEndpointAssignment_10 ) ) ;
+    // InternalDataDSL.g:5322:1: rule__DataInterchange__Group__10__Impl : ( ( rule__DataInterchange__FileEndpointAssignment_10 ) ) ;
     public final void rule__DataInterchange__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5077:1: ( ( ( rule__DataInterchange__FileEndpointAssignment_10 ) ) )
-            // InternalDataDSL.g:5078:1: ( ( rule__DataInterchange__FileEndpointAssignment_10 ) )
+            // InternalDataDSL.g:5326:1: ( ( ( rule__DataInterchange__FileEndpointAssignment_10 ) ) )
+            // InternalDataDSL.g:5327:1: ( ( rule__DataInterchange__FileEndpointAssignment_10 ) )
             {
-            // InternalDataDSL.g:5078:1: ( ( rule__DataInterchange__FileEndpointAssignment_10 ) )
-            // InternalDataDSL.g:5079:2: ( rule__DataInterchange__FileEndpointAssignment_10 )
+            // InternalDataDSL.g:5327:1: ( ( rule__DataInterchange__FileEndpointAssignment_10 ) )
+            // InternalDataDSL.g:5328:2: ( rule__DataInterchange__FileEndpointAssignment_10 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getFileEndpointAssignment_10()); 
             }
-            // InternalDataDSL.g:5080:2: ( rule__DataInterchange__FileEndpointAssignment_10 )
-            // InternalDataDSL.g:5080:3: rule__DataInterchange__FileEndpointAssignment_10
+            // InternalDataDSL.g:5329:2: ( rule__DataInterchange__FileEndpointAssignment_10 )
+            // InternalDataDSL.g:5329:3: rule__DataInterchange__FileEndpointAssignment_10
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__FileEndpointAssignment_10();
@@ -18688,14 +19703,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__11"
-    // InternalDataDSL.g:5088:1: rule__DataInterchange__Group__11 : rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12 ;
+    // InternalDataDSL.g:5337:1: rule__DataInterchange__Group__11 : rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12 ;
     public final void rule__DataInterchange__Group__11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5092:1: ( rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12 )
-            // InternalDataDSL.g:5093:2: rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12
+            // InternalDataDSL.g:5341:1: ( rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12 )
+            // InternalDataDSL.g:5342:2: rule__DataInterchange__Group__11__Impl rule__DataInterchange__Group__12
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchange__Group__11__Impl();
@@ -18726,17 +19741,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__11__Impl"
-    // InternalDataDSL.g:5100:1: rule__DataInterchange__Group__11__Impl : ( 'path' ) ;
+    // InternalDataDSL.g:5349:1: rule__DataInterchange__Group__11__Impl : ( 'path' ) ;
     public final void rule__DataInterchange__Group__11__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5104:1: ( ( 'path' ) )
-            // InternalDataDSL.g:5105:1: ( 'path' )
+            // InternalDataDSL.g:5353:1: ( ( 'path' ) )
+            // InternalDataDSL.g:5354:1: ( 'path' )
             {
-            // InternalDataDSL.g:5105:1: ( 'path' )
-            // InternalDataDSL.g:5106:2: 'path'
+            // InternalDataDSL.g:5354:1: ( 'path' )
+            // InternalDataDSL.g:5355:2: 'path'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getPathKeyword_11()); 
@@ -18767,14 +19782,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__12"
-    // InternalDataDSL.g:5115:1: rule__DataInterchange__Group__12 : rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13 ;
+    // InternalDataDSL.g:5364:1: rule__DataInterchange__Group__12 : rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13 ;
     public final void rule__DataInterchange__Group__12() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5119:1: ( rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13 )
-            // InternalDataDSL.g:5120:2: rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13
+            // InternalDataDSL.g:5368:1: ( rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13 )
+            // InternalDataDSL.g:5369:2: rule__DataInterchange__Group__12__Impl rule__DataInterchange__Group__13
             {
             pushFollow(FOLLOW_19);
             rule__DataInterchange__Group__12__Impl();
@@ -18805,17 +19820,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__12__Impl"
-    // InternalDataDSL.g:5127:1: rule__DataInterchange__Group__12__Impl : ( '{' ) ;
+    // InternalDataDSL.g:5376:1: rule__DataInterchange__Group__12__Impl : ( '{' ) ;
     public final void rule__DataInterchange__Group__12__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5131:1: ( ( '{' ) )
-            // InternalDataDSL.g:5132:1: ( '{' )
+            // InternalDataDSL.g:5380:1: ( ( '{' ) )
+            // InternalDataDSL.g:5381:1: ( '{' )
             {
-            // InternalDataDSL.g:5132:1: ( '{' )
-            // InternalDataDSL.g:5133:2: '{'
+            // InternalDataDSL.g:5381:1: ( '{' )
+            // InternalDataDSL.g:5382:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getLeftCurlyBracketKeyword_12()); 
@@ -18846,14 +19861,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__13"
-    // InternalDataDSL.g:5142:1: rule__DataInterchange__Group__13 : rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14 ;
+    // InternalDataDSL.g:5391:1: rule__DataInterchange__Group__13 : rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14 ;
     public final void rule__DataInterchange__Group__13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5146:1: ( rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14 )
-            // InternalDataDSL.g:5147:2: rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14
+            // InternalDataDSL.g:5395:1: ( rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14 )
+            // InternalDataDSL.g:5396:2: rule__DataInterchange__Group__13__Impl rule__DataInterchange__Group__14
             {
             pushFollow(FOLLOW_19);
             rule__DataInterchange__Group__13__Impl();
@@ -18884,35 +19899,35 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__13__Impl"
-    // InternalDataDSL.g:5154:1: rule__DataInterchange__Group__13__Impl : ( ( rule__DataInterchange__PathAssignment_13 )* ) ;
+    // InternalDataDSL.g:5403:1: rule__DataInterchange__Group__13__Impl : ( ( rule__DataInterchange__PathAssignment_13 )* ) ;
     public final void rule__DataInterchange__Group__13__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5158:1: ( ( ( rule__DataInterchange__PathAssignment_13 )* ) )
-            // InternalDataDSL.g:5159:1: ( ( rule__DataInterchange__PathAssignment_13 )* )
+            // InternalDataDSL.g:5407:1: ( ( ( rule__DataInterchange__PathAssignment_13 )* ) )
+            // InternalDataDSL.g:5408:1: ( ( rule__DataInterchange__PathAssignment_13 )* )
             {
-            // InternalDataDSL.g:5159:1: ( ( rule__DataInterchange__PathAssignment_13 )* )
-            // InternalDataDSL.g:5160:2: ( rule__DataInterchange__PathAssignment_13 )*
+            // InternalDataDSL.g:5408:1: ( ( rule__DataInterchange__PathAssignment_13 )* )
+            // InternalDataDSL.g:5409:2: ( rule__DataInterchange__PathAssignment_13 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getPathAssignment_13()); 
             }
-            // InternalDataDSL.g:5161:2: ( rule__DataInterchange__PathAssignment_13 )*
-            loop67:
+            // InternalDataDSL.g:5410:2: ( rule__DataInterchange__PathAssignment_13 )*
+            loop70:
             do {
-                int alt67=2;
-                int LA67_0 = input.LA(1);
+                int alt70=2;
+                int LA70_0 = input.LA(1);
 
-                if ( (LA67_0==90) ) {
-                    alt67=1;
+                if ( (LA70_0==91) ) {
+                    alt70=1;
                 }
 
 
-                switch (alt67) {
+                switch (alt70) {
             	case 1 :
-            	    // InternalDataDSL.g:5161:3: rule__DataInterchange__PathAssignment_13
+            	    // InternalDataDSL.g:5410:3: rule__DataInterchange__PathAssignment_13
             	    {
             	    pushFollow(FOLLOW_20);
             	    rule__DataInterchange__PathAssignment_13();
@@ -18924,7 +19939,7 @@
             	    break;
 
             	default :
-            	    break loop67;
+            	    break loop70;
                 }
             } while (true);
 
@@ -18953,14 +19968,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__14"
-    // InternalDataDSL.g:5169:1: rule__DataInterchange__Group__14 : rule__DataInterchange__Group__14__Impl ;
+    // InternalDataDSL.g:5418:1: rule__DataInterchange__Group__14 : rule__DataInterchange__Group__14__Impl ;
     public final void rule__DataInterchange__Group__14() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5173:1: ( rule__DataInterchange__Group__14__Impl )
-            // InternalDataDSL.g:5174:2: rule__DataInterchange__Group__14__Impl
+            // InternalDataDSL.g:5422:1: ( rule__DataInterchange__Group__14__Impl )
+            // InternalDataDSL.g:5423:2: rule__DataInterchange__Group__14__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__Group__14__Impl();
@@ -18986,17 +20001,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group__14__Impl"
-    // InternalDataDSL.g:5180:1: rule__DataInterchange__Group__14__Impl : ( '}' ) ;
+    // InternalDataDSL.g:5429:1: rule__DataInterchange__Group__14__Impl : ( '}' ) ;
     public final void rule__DataInterchange__Group__14__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5184:1: ( ( '}' ) )
-            // InternalDataDSL.g:5185:1: ( '}' )
+            // InternalDataDSL.g:5433:1: ( ( '}' ) )
+            // InternalDataDSL.g:5434:1: ( '}' )
             {
-            // InternalDataDSL.g:5185:1: ( '}' )
-            // InternalDataDSL.g:5186:2: '}'
+            // InternalDataDSL.g:5434:1: ( '}' )
+            // InternalDataDSL.g:5435:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getRightCurlyBracketKeyword_14()); 
@@ -19027,14 +20042,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_3__0"
-    // InternalDataDSL.g:5196:1: rule__DataInterchange__Group_3__0 : rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1 ;
+    // InternalDataDSL.g:5445:1: rule__DataInterchange__Group_3__0 : rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1 ;
     public final void rule__DataInterchange__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5200:1: ( rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1 )
-            // InternalDataDSL.g:5201:2: rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1
+            // InternalDataDSL.g:5449:1: ( rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1 )
+            // InternalDataDSL.g:5450:2: rule__DataInterchange__Group_3__0__Impl rule__DataInterchange__Group_3__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchange__Group_3__0__Impl();
@@ -19065,23 +20080,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_3__0__Impl"
-    // InternalDataDSL.g:5208:1: rule__DataInterchange__Group_3__0__Impl : ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:5457:1: rule__DataInterchange__Group_3__0__Impl : ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) ) ;
     public final void rule__DataInterchange__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5212:1: ( ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) ) )
-            // InternalDataDSL.g:5213:1: ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) )
+            // InternalDataDSL.g:5461:1: ( ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) ) )
+            // InternalDataDSL.g:5462:1: ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:5213:1: ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) )
-            // InternalDataDSL.g:5214:2: ( rule__DataInterchange__DescriptionAssignment_3_0 )
+            // InternalDataDSL.g:5462:1: ( ( rule__DataInterchange__DescriptionAssignment_3_0 ) )
+            // InternalDataDSL.g:5463:2: ( rule__DataInterchange__DescriptionAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDescriptionAssignment_3_0()); 
             }
-            // InternalDataDSL.g:5215:2: ( rule__DataInterchange__DescriptionAssignment_3_0 )
-            // InternalDataDSL.g:5215:3: rule__DataInterchange__DescriptionAssignment_3_0
+            // InternalDataDSL.g:5464:2: ( rule__DataInterchange__DescriptionAssignment_3_0 )
+            // InternalDataDSL.g:5464:3: rule__DataInterchange__DescriptionAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__DescriptionAssignment_3_0();
@@ -19116,14 +20131,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_3__1"
-    // InternalDataDSL.g:5223:1: rule__DataInterchange__Group_3__1 : rule__DataInterchange__Group_3__1__Impl ;
+    // InternalDataDSL.g:5472:1: rule__DataInterchange__Group_3__1 : rule__DataInterchange__Group_3__1__Impl ;
     public final void rule__DataInterchange__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5227:1: ( rule__DataInterchange__Group_3__1__Impl )
-            // InternalDataDSL.g:5228:2: rule__DataInterchange__Group_3__1__Impl
+            // InternalDataDSL.g:5476:1: ( rule__DataInterchange__Group_3__1__Impl )
+            // InternalDataDSL.g:5477:2: rule__DataInterchange__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__Group_3__1__Impl();
@@ -19149,23 +20164,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_3__1__Impl"
-    // InternalDataDSL.g:5234:1: rule__DataInterchange__Group_3__1__Impl : ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) ) ;
+    // InternalDataDSL.g:5483:1: rule__DataInterchange__Group_3__1__Impl : ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) ) ;
     public final void rule__DataInterchange__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5238:1: ( ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) ) )
-            // InternalDataDSL.g:5239:1: ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) )
+            // InternalDataDSL.g:5487:1: ( ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) ) )
+            // InternalDataDSL.g:5488:1: ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:5239:1: ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) )
-            // InternalDataDSL.g:5240:2: ( rule__DataInterchange__DescriptionValueAssignment_3_1 )
+            // InternalDataDSL.g:5488:1: ( ( rule__DataInterchange__DescriptionValueAssignment_3_1 ) )
+            // InternalDataDSL.g:5489:2: ( rule__DataInterchange__DescriptionValueAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDescriptionValueAssignment_3_1()); 
             }
-            // InternalDataDSL.g:5241:2: ( rule__DataInterchange__DescriptionValueAssignment_3_1 )
-            // InternalDataDSL.g:5241:3: rule__DataInterchange__DescriptionValueAssignment_3_1
+            // InternalDataDSL.g:5490:2: ( rule__DataInterchange__DescriptionValueAssignment_3_1 )
+            // InternalDataDSL.g:5490:3: rule__DataInterchange__DescriptionValueAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__DescriptionValueAssignment_3_1();
@@ -19200,14 +20215,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_5__0"
-    // InternalDataDSL.g:5250:1: rule__DataInterchange__Group_5__0 : rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1 ;
+    // InternalDataDSL.g:5499:1: rule__DataInterchange__Group_5__0 : rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1 ;
     public final void rule__DataInterchange__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5254:1: ( rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1 )
-            // InternalDataDSL.g:5255:2: rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1
+            // InternalDataDSL.g:5503:1: ( rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1 )
+            // InternalDataDSL.g:5504:2: rule__DataInterchange__Group_5__0__Impl rule__DataInterchange__Group_5__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchange__Group_5__0__Impl();
@@ -19238,23 +20253,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_5__0__Impl"
-    // InternalDataDSL.g:5262:1: rule__DataInterchange__Group_5__0__Impl : ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) ) ;
+    // InternalDataDSL.g:5511:1: rule__DataInterchange__Group_5__0__Impl : ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) ) ;
     public final void rule__DataInterchange__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5266:1: ( ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) ) )
-            // InternalDataDSL.g:5267:1: ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) )
+            // InternalDataDSL.g:5515:1: ( ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) ) )
+            // InternalDataDSL.g:5516:1: ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) )
             {
-            // InternalDataDSL.g:5267:1: ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) )
-            // InternalDataDSL.g:5268:2: ( rule__DataInterchange__HasVectorNameAssignment_5_0 )
+            // InternalDataDSL.g:5516:1: ( ( rule__DataInterchange__HasVectorNameAssignment_5_0 ) )
+            // InternalDataDSL.g:5517:2: ( rule__DataInterchange__HasVectorNameAssignment_5_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getHasVectorNameAssignment_5_0()); 
             }
-            // InternalDataDSL.g:5269:2: ( rule__DataInterchange__HasVectorNameAssignment_5_0 )
-            // InternalDataDSL.g:5269:3: rule__DataInterchange__HasVectorNameAssignment_5_0
+            // InternalDataDSL.g:5518:2: ( rule__DataInterchange__HasVectorNameAssignment_5_0 )
+            // InternalDataDSL.g:5518:3: rule__DataInterchange__HasVectorNameAssignment_5_0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__HasVectorNameAssignment_5_0();
@@ -19289,14 +20304,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_5__1"
-    // InternalDataDSL.g:5277:1: rule__DataInterchange__Group_5__1 : rule__DataInterchange__Group_5__1__Impl ;
+    // InternalDataDSL.g:5526:1: rule__DataInterchange__Group_5__1 : rule__DataInterchange__Group_5__1__Impl ;
     public final void rule__DataInterchange__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5281:1: ( rule__DataInterchange__Group_5__1__Impl )
-            // InternalDataDSL.g:5282:2: rule__DataInterchange__Group_5__1__Impl
+            // InternalDataDSL.g:5530:1: ( rule__DataInterchange__Group_5__1__Impl )
+            // InternalDataDSL.g:5531:2: rule__DataInterchange__Group_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__Group_5__1__Impl();
@@ -19322,23 +20337,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_5__1__Impl"
-    // InternalDataDSL.g:5288:1: rule__DataInterchange__Group_5__1__Impl : ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) ) ;
+    // InternalDataDSL.g:5537:1: rule__DataInterchange__Group_5__1__Impl : ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) ) ;
     public final void rule__DataInterchange__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5292:1: ( ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) ) )
-            // InternalDataDSL.g:5293:1: ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) )
+            // InternalDataDSL.g:5541:1: ( ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) ) )
+            // InternalDataDSL.g:5542:1: ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) )
             {
-            // InternalDataDSL.g:5293:1: ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) )
-            // InternalDataDSL.g:5294:2: ( rule__DataInterchange__VectorNameAssignment_5_1 )
+            // InternalDataDSL.g:5542:1: ( ( rule__DataInterchange__VectorNameAssignment_5_1 ) )
+            // InternalDataDSL.g:5543:2: ( rule__DataInterchange__VectorNameAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getVectorNameAssignment_5_1()); 
             }
-            // InternalDataDSL.g:5295:2: ( rule__DataInterchange__VectorNameAssignment_5_1 )
-            // InternalDataDSL.g:5295:3: rule__DataInterchange__VectorNameAssignment_5_1
+            // InternalDataDSL.g:5544:2: ( rule__DataInterchange__VectorNameAssignment_5_1 )
+            // InternalDataDSL.g:5544:3: rule__DataInterchange__VectorNameAssignment_5_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__VectorNameAssignment_5_1();
@@ -19373,14 +20388,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_7__0"
-    // InternalDataDSL.g:5304:1: rule__DataInterchange__Group_7__0 : rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1 ;
+    // InternalDataDSL.g:5553:1: rule__DataInterchange__Group_7__0 : rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1 ;
     public final void rule__DataInterchange__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5308:1: ( rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1 )
-            // InternalDataDSL.g:5309:2: rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1
+            // InternalDataDSL.g:5557:1: ( rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1 )
+            // InternalDataDSL.g:5558:2: rule__DataInterchange__Group_7__0__Impl rule__DataInterchange__Group_7__1
             {
             pushFollow(FOLLOW_22);
             rule__DataInterchange__Group_7__0__Impl();
@@ -19411,17 +20426,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_7__0__Impl"
-    // InternalDataDSL.g:5316:1: rule__DataInterchange__Group_7__0__Impl : ( 'elementSize' ) ;
+    // InternalDataDSL.g:5565:1: rule__DataInterchange__Group_7__0__Impl : ( 'elementSize' ) ;
     public final void rule__DataInterchange__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5320:1: ( ( 'elementSize' ) )
-            // InternalDataDSL.g:5321:1: ( 'elementSize' )
+            // InternalDataDSL.g:5569:1: ( ( 'elementSize' ) )
+            // InternalDataDSL.g:5570:1: ( 'elementSize' )
             {
-            // InternalDataDSL.g:5321:1: ( 'elementSize' )
-            // InternalDataDSL.g:5322:2: 'elementSize'
+            // InternalDataDSL.g:5570:1: ( 'elementSize' )
+            // InternalDataDSL.g:5571:2: 'elementSize'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getElementSizeKeyword_7_0()); 
@@ -19452,14 +20467,14 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_7__1"
-    // InternalDataDSL.g:5331:1: rule__DataInterchange__Group_7__1 : rule__DataInterchange__Group_7__1__Impl ;
+    // InternalDataDSL.g:5580:1: rule__DataInterchange__Group_7__1 : rule__DataInterchange__Group_7__1__Impl ;
     public final void rule__DataInterchange__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5335:1: ( rule__DataInterchange__Group_7__1__Impl )
-            // InternalDataDSL.g:5336:2: rule__DataInterchange__Group_7__1__Impl
+            // InternalDataDSL.g:5584:1: ( rule__DataInterchange__Group_7__1__Impl )
+            // InternalDataDSL.g:5585:2: rule__DataInterchange__Group_7__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__Group_7__1__Impl();
@@ -19485,23 +20500,23 @@
 
 
     // $ANTLR start "rule__DataInterchange__Group_7__1__Impl"
-    // InternalDataDSL.g:5342:1: rule__DataInterchange__Group_7__1__Impl : ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) ) ;
+    // InternalDataDSL.g:5591:1: rule__DataInterchange__Group_7__1__Impl : ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) ) ;
     public final void rule__DataInterchange__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5346:1: ( ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) ) )
-            // InternalDataDSL.g:5347:1: ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) )
+            // InternalDataDSL.g:5595:1: ( ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) ) )
+            // InternalDataDSL.g:5596:1: ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) )
             {
-            // InternalDataDSL.g:5347:1: ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) )
-            // InternalDataDSL.g:5348:2: ( rule__DataInterchange__ElementSizeAssignment_7_1 )
+            // InternalDataDSL.g:5596:1: ( ( rule__DataInterchange__ElementSizeAssignment_7_1 ) )
+            // InternalDataDSL.g:5597:2: ( rule__DataInterchange__ElementSizeAssignment_7_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getElementSizeAssignment_7_1()); 
             }
-            // InternalDataDSL.g:5349:2: ( rule__DataInterchange__ElementSizeAssignment_7_1 )
-            // InternalDataDSL.g:5349:3: rule__DataInterchange__ElementSizeAssignment_7_1
+            // InternalDataDSL.g:5598:2: ( rule__DataInterchange__ElementSizeAssignment_7_1 )
+            // InternalDataDSL.g:5598:3: rule__DataInterchange__ElementSizeAssignment_7_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchange__ElementSizeAssignment_7_1();
@@ -19536,14 +20551,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__0"
-    // InternalDataDSL.g:5358:1: rule__DataInterchangeFileXML__Group__0 : rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1 ;
+    // InternalDataDSL.g:5607:1: rule__DataInterchangeFileXML__Group__0 : rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1 ;
     public final void rule__DataInterchangeFileXML__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5362:1: ( rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1 )
-            // InternalDataDSL.g:5363:2: rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1
+            // InternalDataDSL.g:5611:1: ( rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1 )
+            // InternalDataDSL.g:5612:2: rule__DataInterchangeFileXML__Group__0__Impl rule__DataInterchangeFileXML__Group__1
             {
             pushFollow(FOLLOW_23);
             rule__DataInterchangeFileXML__Group__0__Impl();
@@ -19574,23 +20589,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__0__Impl"
-    // InternalDataDSL.g:5370:1: rule__DataInterchangeFileXML__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:5619:1: rule__DataInterchangeFileXML__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeFileXML__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5374:1: ( ( () ) )
-            // InternalDataDSL.g:5375:1: ( () )
+            // InternalDataDSL.g:5623:1: ( ( () ) )
+            // InternalDataDSL.g:5624:1: ( () )
             {
-            // InternalDataDSL.g:5375:1: ( () )
-            // InternalDataDSL.g:5376:2: ()
+            // InternalDataDSL.g:5624:1: ( () )
+            // InternalDataDSL.g:5625:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getDataInterchangeFileXMLAction_0()); 
             }
-            // InternalDataDSL.g:5377:2: ()
-            // InternalDataDSL.g:5377:3: 
+            // InternalDataDSL.g:5626:2: ()
+            // InternalDataDSL.g:5626:3: 
             {
             }
 
@@ -19615,14 +20630,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__1"
-    // InternalDataDSL.g:5385:1: rule__DataInterchangeFileXML__Group__1 : rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2 ;
+    // InternalDataDSL.g:5634:1: rule__DataInterchangeFileXML__Group__1 : rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2 ;
     public final void rule__DataInterchangeFileXML__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5389:1: ( rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2 )
-            // InternalDataDSL.g:5390:2: rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2
+            // InternalDataDSL.g:5638:1: ( rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2 )
+            // InternalDataDSL.g:5639:2: rule__DataInterchangeFileXML__Group__1__Impl rule__DataInterchangeFileXML__Group__2
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileXML__Group__1__Impl();
@@ -19653,17 +20668,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__1__Impl"
-    // InternalDataDSL.g:5397:1: rule__DataInterchangeFileXML__Group__1__Impl : ( 'XML' ) ;
+    // InternalDataDSL.g:5646:1: rule__DataInterchangeFileXML__Group__1__Impl : ( 'XML' ) ;
     public final void rule__DataInterchangeFileXML__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5401:1: ( ( 'XML' ) )
-            // InternalDataDSL.g:5402:1: ( 'XML' )
+            // InternalDataDSL.g:5650:1: ( ( 'XML' ) )
+            // InternalDataDSL.g:5651:1: ( 'XML' )
             {
-            // InternalDataDSL.g:5402:1: ( 'XML' )
-            // InternalDataDSL.g:5403:2: 'XML'
+            // InternalDataDSL.g:5651:1: ( 'XML' )
+            // InternalDataDSL.g:5652:2: 'XML'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getXMLKeyword_1()); 
@@ -19694,14 +20709,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__2"
-    // InternalDataDSL.g:5412:1: rule__DataInterchangeFileXML__Group__2 : rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3 ;
+    // InternalDataDSL.g:5661:1: rule__DataInterchangeFileXML__Group__2 : rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3 ;
     public final void rule__DataInterchangeFileXML__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5416:1: ( rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3 )
-            // InternalDataDSL.g:5417:2: rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3
+            // InternalDataDSL.g:5665:1: ( rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3 )
+            // InternalDataDSL.g:5666:2: rule__DataInterchangeFileXML__Group__2__Impl rule__DataInterchangeFileXML__Group__3
             {
             pushFollow(FOLLOW_24);
             rule__DataInterchangeFileXML__Group__2__Impl();
@@ -19732,23 +20747,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__2__Impl"
-    // InternalDataDSL.g:5424:1: rule__DataInterchangeFileXML__Group__2__Impl : ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) ) ;
+    // InternalDataDSL.g:5673:1: rule__DataInterchangeFileXML__Group__2__Impl : ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) ) ;
     public final void rule__DataInterchangeFileXML__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5428:1: ( ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) ) )
-            // InternalDataDSL.g:5429:1: ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:5677:1: ( ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) ) )
+            // InternalDataDSL.g:5678:1: ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) )
             {
-            // InternalDataDSL.g:5429:1: ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) )
-            // InternalDataDSL.g:5430:2: ( rule__DataInterchangeFileXML__FileURLAssignment_2 )
+            // InternalDataDSL.g:5678:1: ( ( rule__DataInterchangeFileXML__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:5679:2: ( rule__DataInterchangeFileXML__FileURLAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getFileURLAssignment_2()); 
             }
-            // InternalDataDSL.g:5431:2: ( rule__DataInterchangeFileXML__FileURLAssignment_2 )
-            // InternalDataDSL.g:5431:3: rule__DataInterchangeFileXML__FileURLAssignment_2
+            // InternalDataDSL.g:5680:2: ( rule__DataInterchangeFileXML__FileURLAssignment_2 )
+            // InternalDataDSL.g:5680:3: rule__DataInterchangeFileXML__FileURLAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__FileURLAssignment_2();
@@ -19783,14 +20798,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__3"
-    // InternalDataDSL.g:5439:1: rule__DataInterchangeFileXML__Group__3 : rule__DataInterchangeFileXML__Group__3__Impl ;
+    // InternalDataDSL.g:5688:1: rule__DataInterchangeFileXML__Group__3 : rule__DataInterchangeFileXML__Group__3__Impl ;
     public final void rule__DataInterchangeFileXML__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5443:1: ( rule__DataInterchangeFileXML__Group__3__Impl )
-            // InternalDataDSL.g:5444:2: rule__DataInterchangeFileXML__Group__3__Impl
+            // InternalDataDSL.g:5692:1: ( rule__DataInterchangeFileXML__Group__3__Impl )
+            // InternalDataDSL.g:5693:2: rule__DataInterchangeFileXML__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__Group__3__Impl();
@@ -19816,23 +20831,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group__3__Impl"
-    // InternalDataDSL.g:5450:1: rule__DataInterchangeFileXML__Group__3__Impl : ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) ) ;
+    // InternalDataDSL.g:5699:1: rule__DataInterchangeFileXML__Group__3__Impl : ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) ) ;
     public final void rule__DataInterchangeFileXML__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5454:1: ( ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) ) )
-            // InternalDataDSL.g:5455:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:5703:1: ( ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) ) )
+            // InternalDataDSL.g:5704:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) )
             {
-            // InternalDataDSL.g:5455:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) )
-            // InternalDataDSL.g:5456:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3 )
+            // InternalDataDSL.g:5704:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:5705:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3()); 
             }
-            // InternalDataDSL.g:5457:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3 )
-            // InternalDataDSL.g:5457:3: rule__DataInterchangeFileXML__UnorderedGroup_3
+            // InternalDataDSL.g:5706:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3 )
+            // InternalDataDSL.g:5706:3: rule__DataInterchangeFileXML__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__UnorderedGroup_3();
@@ -19867,14 +20882,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_1__0"
-    // InternalDataDSL.g:5466:1: rule__DataInterchangeFileXML__Group_3_1__0 : rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1 ;
+    // InternalDataDSL.g:5715:1: rule__DataInterchangeFileXML__Group_3_1__0 : rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1 ;
     public final void rule__DataInterchangeFileXML__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5470:1: ( rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1 )
-            // InternalDataDSL.g:5471:2: rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1
+            // InternalDataDSL.g:5719:1: ( rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1 )
+            // InternalDataDSL.g:5720:2: rule__DataInterchangeFileXML__Group_3_1__0__Impl rule__DataInterchangeFileXML__Group_3_1__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileXML__Group_3_1__0__Impl();
@@ -19905,17 +20920,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_1__0__Impl"
-    // InternalDataDSL.g:5478:1: rule__DataInterchangeFileXML__Group_3_1__0__Impl : ( 'encoding' ) ;
+    // InternalDataDSL.g:5727:1: rule__DataInterchangeFileXML__Group_3_1__0__Impl : ( 'encoding' ) ;
     public final void rule__DataInterchangeFileXML__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5482:1: ( ( 'encoding' ) )
-            // InternalDataDSL.g:5483:1: ( 'encoding' )
+            // InternalDataDSL.g:5731:1: ( ( 'encoding' ) )
+            // InternalDataDSL.g:5732:1: ( 'encoding' )
             {
-            // InternalDataDSL.g:5483:1: ( 'encoding' )
-            // InternalDataDSL.g:5484:2: 'encoding'
+            // InternalDataDSL.g:5732:1: ( 'encoding' )
+            // InternalDataDSL.g:5733:2: 'encoding'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getEncodingKeyword_3_1_0()); 
@@ -19946,14 +20961,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_1__1"
-    // InternalDataDSL.g:5493:1: rule__DataInterchangeFileXML__Group_3_1__1 : rule__DataInterchangeFileXML__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:5742:1: rule__DataInterchangeFileXML__Group_3_1__1 : rule__DataInterchangeFileXML__Group_3_1__1__Impl ;
     public final void rule__DataInterchangeFileXML__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5497:1: ( rule__DataInterchangeFileXML__Group_3_1__1__Impl )
-            // InternalDataDSL.g:5498:2: rule__DataInterchangeFileXML__Group_3_1__1__Impl
+            // InternalDataDSL.g:5746:1: ( rule__DataInterchangeFileXML__Group_3_1__1__Impl )
+            // InternalDataDSL.g:5747:2: rule__DataInterchangeFileXML__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__Group_3_1__1__Impl();
@@ -19979,23 +20994,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_1__1__Impl"
-    // InternalDataDSL.g:5504:1: rule__DataInterchangeFileXML__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:5753:1: rule__DataInterchangeFileXML__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) ) ;
     public final void rule__DataInterchangeFileXML__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5508:1: ( ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:5509:1: ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) )
+            // InternalDataDSL.g:5757:1: ( ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:5758:1: ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:5509:1: ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) )
-            // InternalDataDSL.g:5510:2: ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 )
+            // InternalDataDSL.g:5758:1: ( ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 ) )
+            // InternalDataDSL.g:5759:2: ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getEncodingAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:5511:2: ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 )
-            // InternalDataDSL.g:5511:3: rule__DataInterchangeFileXML__EncodingAssignment_3_1_1
+            // InternalDataDSL.g:5760:2: ( rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 )
+            // InternalDataDSL.g:5760:3: rule__DataInterchangeFileXML__EncodingAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__EncodingAssignment_3_1_1();
@@ -20030,14 +21045,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_2__0"
-    // InternalDataDSL.g:5520:1: rule__DataInterchangeFileXML__Group_3_2__0 : rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1 ;
+    // InternalDataDSL.g:5769:1: rule__DataInterchangeFileXML__Group_3_2__0 : rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1 ;
     public final void rule__DataInterchangeFileXML__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5524:1: ( rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1 )
-            // InternalDataDSL.g:5525:2: rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1
+            // InternalDataDSL.g:5773:1: ( rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1 )
+            // InternalDataDSL.g:5774:2: rule__DataInterchangeFileXML__Group_3_2__0__Impl rule__DataInterchangeFileXML__Group_3_2__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileXML__Group_3_2__0__Impl();
@@ -20068,17 +21083,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_2__0__Impl"
-    // InternalDataDSL.g:5532:1: rule__DataInterchangeFileXML__Group_3_2__0__Impl : ( 'locale' ) ;
+    // InternalDataDSL.g:5781:1: rule__DataInterchangeFileXML__Group_3_2__0__Impl : ( 'locale' ) ;
     public final void rule__DataInterchangeFileXML__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5536:1: ( ( 'locale' ) )
-            // InternalDataDSL.g:5537:1: ( 'locale' )
+            // InternalDataDSL.g:5785:1: ( ( 'locale' ) )
+            // InternalDataDSL.g:5786:1: ( 'locale' )
             {
-            // InternalDataDSL.g:5537:1: ( 'locale' )
-            // InternalDataDSL.g:5538:2: 'locale'
+            // InternalDataDSL.g:5786:1: ( 'locale' )
+            // InternalDataDSL.g:5787:2: 'locale'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getLocaleKeyword_3_2_0()); 
@@ -20109,14 +21124,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_2__1"
-    // InternalDataDSL.g:5547:1: rule__DataInterchangeFileXML__Group_3_2__1 : rule__DataInterchangeFileXML__Group_3_2__1__Impl ;
+    // InternalDataDSL.g:5796:1: rule__DataInterchangeFileXML__Group_3_2__1 : rule__DataInterchangeFileXML__Group_3_2__1__Impl ;
     public final void rule__DataInterchangeFileXML__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5551:1: ( rule__DataInterchangeFileXML__Group_3_2__1__Impl )
-            // InternalDataDSL.g:5552:2: rule__DataInterchangeFileXML__Group_3_2__1__Impl
+            // InternalDataDSL.g:5800:1: ( rule__DataInterchangeFileXML__Group_3_2__1__Impl )
+            // InternalDataDSL.g:5801:2: rule__DataInterchangeFileXML__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__Group_3_2__1__Impl();
@@ -20142,23 +21157,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__Group_3_2__1__Impl"
-    // InternalDataDSL.g:5558:1: rule__DataInterchangeFileXML__Group_3_2__1__Impl : ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) ) ;
+    // InternalDataDSL.g:5807:1: rule__DataInterchangeFileXML__Group_3_2__1__Impl : ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) ) ;
     public final void rule__DataInterchangeFileXML__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5562:1: ( ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) ) )
-            // InternalDataDSL.g:5563:1: ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) )
+            // InternalDataDSL.g:5811:1: ( ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) ) )
+            // InternalDataDSL.g:5812:1: ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) )
             {
-            // InternalDataDSL.g:5563:1: ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) )
-            // InternalDataDSL.g:5564:2: ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 )
+            // InternalDataDSL.g:5812:1: ( ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 ) )
+            // InternalDataDSL.g:5813:2: ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getLocaleAssignment_3_2_1()); 
             }
-            // InternalDataDSL.g:5565:2: ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 )
-            // InternalDataDSL.g:5565:3: rule__DataInterchangeFileXML__LocaleAssignment_3_2_1
+            // InternalDataDSL.g:5814:2: ( rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 )
+            // InternalDataDSL.g:5814:3: rule__DataInterchangeFileXML__LocaleAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__LocaleAssignment_3_2_1();
@@ -20193,14 +21208,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__0"
-    // InternalDataDSL.g:5574:1: rule__DataInterchangeFileCSV__Group__0 : rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1 ;
+    // InternalDataDSL.g:5823:1: rule__DataInterchangeFileCSV__Group__0 : rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1 ;
     public final void rule__DataInterchangeFileCSV__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5578:1: ( rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1 )
-            // InternalDataDSL.g:5579:2: rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1
+            // InternalDataDSL.g:5827:1: ( rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1 )
+            // InternalDataDSL.g:5828:2: rule__DataInterchangeFileCSV__Group__0__Impl rule__DataInterchangeFileCSV__Group__1
             {
             pushFollow(FOLLOW_25);
             rule__DataInterchangeFileCSV__Group__0__Impl();
@@ -20231,23 +21246,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__0__Impl"
-    // InternalDataDSL.g:5586:1: rule__DataInterchangeFileCSV__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:5835:1: rule__DataInterchangeFileCSV__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeFileCSV__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5590:1: ( ( () ) )
-            // InternalDataDSL.g:5591:1: ( () )
+            // InternalDataDSL.g:5839:1: ( ( () ) )
+            // InternalDataDSL.g:5840:1: ( () )
             {
-            // InternalDataDSL.g:5591:1: ( () )
-            // InternalDataDSL.g:5592:2: ()
+            // InternalDataDSL.g:5840:1: ( () )
+            // InternalDataDSL.g:5841:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getDataInterchangeFileCSVAction_0()); 
             }
-            // InternalDataDSL.g:5593:2: ()
-            // InternalDataDSL.g:5593:3: 
+            // InternalDataDSL.g:5842:2: ()
+            // InternalDataDSL.g:5842:3: 
             {
             }
 
@@ -20272,14 +21287,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__1"
-    // InternalDataDSL.g:5601:1: rule__DataInterchangeFileCSV__Group__1 : rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2 ;
+    // InternalDataDSL.g:5850:1: rule__DataInterchangeFileCSV__Group__1 : rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2 ;
     public final void rule__DataInterchangeFileCSV__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5605:1: ( rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2 )
-            // InternalDataDSL.g:5606:2: rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2
+            // InternalDataDSL.g:5854:1: ( rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2 )
+            // InternalDataDSL.g:5855:2: rule__DataInterchangeFileCSV__Group__1__Impl rule__DataInterchangeFileCSV__Group__2
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileCSV__Group__1__Impl();
@@ -20310,17 +21325,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__1__Impl"
-    // InternalDataDSL.g:5613:1: rule__DataInterchangeFileCSV__Group__1__Impl : ( 'CSV' ) ;
+    // InternalDataDSL.g:5862:1: rule__DataInterchangeFileCSV__Group__1__Impl : ( 'CSV' ) ;
     public final void rule__DataInterchangeFileCSV__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5617:1: ( ( 'CSV' ) )
-            // InternalDataDSL.g:5618:1: ( 'CSV' )
+            // InternalDataDSL.g:5866:1: ( ( 'CSV' ) )
+            // InternalDataDSL.g:5867:1: ( 'CSV' )
             {
-            // InternalDataDSL.g:5618:1: ( 'CSV' )
-            // InternalDataDSL.g:5619:2: 'CSV'
+            // InternalDataDSL.g:5867:1: ( 'CSV' )
+            // InternalDataDSL.g:5868:2: 'CSV'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getCSVKeyword_1()); 
@@ -20351,14 +21366,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__2"
-    // InternalDataDSL.g:5628:1: rule__DataInterchangeFileCSV__Group__2 : rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3 ;
+    // InternalDataDSL.g:5877:1: rule__DataInterchangeFileCSV__Group__2 : rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3 ;
     public final void rule__DataInterchangeFileCSV__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5632:1: ( rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3 )
-            // InternalDataDSL.g:5633:2: rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3
+            // InternalDataDSL.g:5881:1: ( rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3 )
+            // InternalDataDSL.g:5882:2: rule__DataInterchangeFileCSV__Group__2__Impl rule__DataInterchangeFileCSV__Group__3
             {
             pushFollow(FOLLOW_26);
             rule__DataInterchangeFileCSV__Group__2__Impl();
@@ -20389,23 +21404,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__2__Impl"
-    // InternalDataDSL.g:5640:1: rule__DataInterchangeFileCSV__Group__2__Impl : ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) ) ;
+    // InternalDataDSL.g:5889:1: rule__DataInterchangeFileCSV__Group__2__Impl : ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5644:1: ( ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) ) )
-            // InternalDataDSL.g:5645:1: ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:5893:1: ( ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) ) )
+            // InternalDataDSL.g:5894:1: ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) )
             {
-            // InternalDataDSL.g:5645:1: ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) )
-            // InternalDataDSL.g:5646:2: ( rule__DataInterchangeFileCSV__FileURLAssignment_2 )
+            // InternalDataDSL.g:5894:1: ( ( rule__DataInterchangeFileCSV__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:5895:2: ( rule__DataInterchangeFileCSV__FileURLAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getFileURLAssignment_2()); 
             }
-            // InternalDataDSL.g:5647:2: ( rule__DataInterchangeFileCSV__FileURLAssignment_2 )
-            // InternalDataDSL.g:5647:3: rule__DataInterchangeFileCSV__FileURLAssignment_2
+            // InternalDataDSL.g:5896:2: ( rule__DataInterchangeFileCSV__FileURLAssignment_2 )
+            // InternalDataDSL.g:5896:3: rule__DataInterchangeFileCSV__FileURLAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__FileURLAssignment_2();
@@ -20440,14 +21455,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__3"
-    // InternalDataDSL.g:5655:1: rule__DataInterchangeFileCSV__Group__3 : rule__DataInterchangeFileCSV__Group__3__Impl ;
+    // InternalDataDSL.g:5904:1: rule__DataInterchangeFileCSV__Group__3 : rule__DataInterchangeFileCSV__Group__3__Impl ;
     public final void rule__DataInterchangeFileCSV__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5659:1: ( rule__DataInterchangeFileCSV__Group__3__Impl )
-            // InternalDataDSL.g:5660:2: rule__DataInterchangeFileCSV__Group__3__Impl
+            // InternalDataDSL.g:5908:1: ( rule__DataInterchangeFileCSV__Group__3__Impl )
+            // InternalDataDSL.g:5909:2: rule__DataInterchangeFileCSV__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group__3__Impl();
@@ -20473,23 +21488,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group__3__Impl"
-    // InternalDataDSL.g:5666:1: rule__DataInterchangeFileCSV__Group__3__Impl : ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) ) ;
+    // InternalDataDSL.g:5915:1: rule__DataInterchangeFileCSV__Group__3__Impl : ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5670:1: ( ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) ) )
-            // InternalDataDSL.g:5671:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:5919:1: ( ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) ) )
+            // InternalDataDSL.g:5920:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) )
             {
-            // InternalDataDSL.g:5671:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) )
-            // InternalDataDSL.g:5672:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3 )
+            // InternalDataDSL.g:5920:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:5921:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3()); 
             }
-            // InternalDataDSL.g:5673:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3 )
-            // InternalDataDSL.g:5673:3: rule__DataInterchangeFileCSV__UnorderedGroup_3
+            // InternalDataDSL.g:5922:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3 )
+            // InternalDataDSL.g:5922:3: rule__DataInterchangeFileCSV__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__UnorderedGroup_3();
@@ -20524,14 +21539,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_0__0"
-    // InternalDataDSL.g:5682:1: rule__DataInterchangeFileCSV__Group_3_0__0 : rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1 ;
+    // InternalDataDSL.g:5931:1: rule__DataInterchangeFileCSV__Group_3_0__0 : rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1 ;
     public final void rule__DataInterchangeFileCSV__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5686:1: ( rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1 )
-            // InternalDataDSL.g:5687:2: rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1
+            // InternalDataDSL.g:5935:1: ( rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1 )
+            // InternalDataDSL.g:5936:2: rule__DataInterchangeFileCSV__Group_3_0__0__Impl rule__DataInterchangeFileCSV__Group_3_0__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileCSV__Group_3_0__0__Impl();
@@ -20562,17 +21577,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_0__0__Impl"
-    // InternalDataDSL.g:5694:1: rule__DataInterchangeFileCSV__Group_3_0__0__Impl : ( 'delimiter' ) ;
+    // InternalDataDSL.g:5943:1: rule__DataInterchangeFileCSV__Group_3_0__0__Impl : ( 'delimiter' ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5698:1: ( ( 'delimiter' ) )
-            // InternalDataDSL.g:5699:1: ( 'delimiter' )
+            // InternalDataDSL.g:5947:1: ( ( 'delimiter' ) )
+            // InternalDataDSL.g:5948:1: ( 'delimiter' )
             {
-            // InternalDataDSL.g:5699:1: ( 'delimiter' )
-            // InternalDataDSL.g:5700:2: 'delimiter'
+            // InternalDataDSL.g:5948:1: ( 'delimiter' )
+            // InternalDataDSL.g:5949:2: 'delimiter'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getDelimiterKeyword_3_0_0()); 
@@ -20603,14 +21618,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_0__1"
-    // InternalDataDSL.g:5709:1: rule__DataInterchangeFileCSV__Group_3_0__1 : rule__DataInterchangeFileCSV__Group_3_0__1__Impl ;
+    // InternalDataDSL.g:5958:1: rule__DataInterchangeFileCSV__Group_3_0__1 : rule__DataInterchangeFileCSV__Group_3_0__1__Impl ;
     public final void rule__DataInterchangeFileCSV__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5713:1: ( rule__DataInterchangeFileCSV__Group_3_0__1__Impl )
-            // InternalDataDSL.g:5714:2: rule__DataInterchangeFileCSV__Group_3_0__1__Impl
+            // InternalDataDSL.g:5962:1: ( rule__DataInterchangeFileCSV__Group_3_0__1__Impl )
+            // InternalDataDSL.g:5963:2: rule__DataInterchangeFileCSV__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group_3_0__1__Impl();
@@ -20636,23 +21651,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_0__1__Impl"
-    // InternalDataDSL.g:5720:1: rule__DataInterchangeFileCSV__Group_3_0__1__Impl : ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) ) ;
+    // InternalDataDSL.g:5969:1: rule__DataInterchangeFileCSV__Group_3_0__1__Impl : ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5724:1: ( ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) ) )
-            // InternalDataDSL.g:5725:1: ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) )
+            // InternalDataDSL.g:5973:1: ( ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) ) )
+            // InternalDataDSL.g:5974:1: ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) )
             {
-            // InternalDataDSL.g:5725:1: ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) )
-            // InternalDataDSL.g:5726:2: ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 )
+            // InternalDataDSL.g:5974:1: ( ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 ) )
+            // InternalDataDSL.g:5975:2: ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getDelimiterAssignment_3_0_1()); 
             }
-            // InternalDataDSL.g:5727:2: ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 )
-            // InternalDataDSL.g:5727:3: rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1
+            // InternalDataDSL.g:5976:2: ( rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 )
+            // InternalDataDSL.g:5976:3: rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1();
@@ -20687,14 +21702,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_1__0"
-    // InternalDataDSL.g:5736:1: rule__DataInterchangeFileCSV__Group_3_1__0 : rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1 ;
+    // InternalDataDSL.g:5985:1: rule__DataInterchangeFileCSV__Group_3_1__0 : rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1 ;
     public final void rule__DataInterchangeFileCSV__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5740:1: ( rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1 )
-            // InternalDataDSL.g:5741:2: rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1
+            // InternalDataDSL.g:5989:1: ( rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1 )
+            // InternalDataDSL.g:5990:2: rule__DataInterchangeFileCSV__Group_3_1__0__Impl rule__DataInterchangeFileCSV__Group_3_1__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileCSV__Group_3_1__0__Impl();
@@ -20725,17 +21740,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_1__0__Impl"
-    // InternalDataDSL.g:5748:1: rule__DataInterchangeFileCSV__Group_3_1__0__Impl : ( 'quoteCharacter' ) ;
+    // InternalDataDSL.g:5997:1: rule__DataInterchangeFileCSV__Group_3_1__0__Impl : ( 'quoteCharacter' ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5752:1: ( ( 'quoteCharacter' ) )
-            // InternalDataDSL.g:5753:1: ( 'quoteCharacter' )
+            // InternalDataDSL.g:6001:1: ( ( 'quoteCharacter' ) )
+            // InternalDataDSL.g:6002:1: ( 'quoteCharacter' )
             {
-            // InternalDataDSL.g:5753:1: ( 'quoteCharacter' )
-            // InternalDataDSL.g:5754:2: 'quoteCharacter'
+            // InternalDataDSL.g:6002:1: ( 'quoteCharacter' )
+            // InternalDataDSL.g:6003:2: 'quoteCharacter'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getQuoteCharacterKeyword_3_1_0()); 
@@ -20766,14 +21781,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_1__1"
-    // InternalDataDSL.g:5763:1: rule__DataInterchangeFileCSV__Group_3_1__1 : rule__DataInterchangeFileCSV__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:6012:1: rule__DataInterchangeFileCSV__Group_3_1__1 : rule__DataInterchangeFileCSV__Group_3_1__1__Impl ;
     public final void rule__DataInterchangeFileCSV__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5767:1: ( rule__DataInterchangeFileCSV__Group_3_1__1__Impl )
-            // InternalDataDSL.g:5768:2: rule__DataInterchangeFileCSV__Group_3_1__1__Impl
+            // InternalDataDSL.g:6016:1: ( rule__DataInterchangeFileCSV__Group_3_1__1__Impl )
+            // InternalDataDSL.g:6017:2: rule__DataInterchangeFileCSV__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group_3_1__1__Impl();
@@ -20799,23 +21814,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_1__1__Impl"
-    // InternalDataDSL.g:5774:1: rule__DataInterchangeFileCSV__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:6023:1: rule__DataInterchangeFileCSV__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5778:1: ( ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:5779:1: ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) )
+            // InternalDataDSL.g:6027:1: ( ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:6028:1: ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:5779:1: ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) )
-            // InternalDataDSL.g:5780:2: ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 )
+            // InternalDataDSL.g:6028:1: ( ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 ) )
+            // InternalDataDSL.g:6029:2: ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getQuoteCharacterAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:5781:2: ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 )
-            // InternalDataDSL.g:5781:3: rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1
+            // InternalDataDSL.g:6030:2: ( rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 )
+            // InternalDataDSL.g:6030:3: rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1();
@@ -20850,14 +21865,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_2__0"
-    // InternalDataDSL.g:5790:1: rule__DataInterchangeFileCSV__Group_3_2__0 : rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1 ;
+    // InternalDataDSL.g:6039:1: rule__DataInterchangeFileCSV__Group_3_2__0 : rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1 ;
     public final void rule__DataInterchangeFileCSV__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5794:1: ( rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1 )
-            // InternalDataDSL.g:5795:2: rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1
+            // InternalDataDSL.g:6043:1: ( rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1 )
+            // InternalDataDSL.g:6044:2: rule__DataInterchangeFileCSV__Group_3_2__0__Impl rule__DataInterchangeFileCSV__Group_3_2__1
             {
             pushFollow(FOLLOW_22);
             rule__DataInterchangeFileCSV__Group_3_2__0__Impl();
@@ -20888,17 +21903,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_2__0__Impl"
-    // InternalDataDSL.g:5802:1: rule__DataInterchangeFileCSV__Group_3_2__0__Impl : ( 'skipLines' ) ;
+    // InternalDataDSL.g:6051:1: rule__DataInterchangeFileCSV__Group_3_2__0__Impl : ( 'skipLines' ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5806:1: ( ( 'skipLines' ) )
-            // InternalDataDSL.g:5807:1: ( 'skipLines' )
+            // InternalDataDSL.g:6055:1: ( ( 'skipLines' ) )
+            // InternalDataDSL.g:6056:1: ( 'skipLines' )
             {
-            // InternalDataDSL.g:5807:1: ( 'skipLines' )
-            // InternalDataDSL.g:5808:2: 'skipLines'
+            // InternalDataDSL.g:6056:1: ( 'skipLines' )
+            // InternalDataDSL.g:6057:2: 'skipLines'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getSkipLinesKeyword_3_2_0()); 
@@ -20929,14 +21944,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_2__1"
-    // InternalDataDSL.g:5817:1: rule__DataInterchangeFileCSV__Group_3_2__1 : rule__DataInterchangeFileCSV__Group_3_2__1__Impl ;
+    // InternalDataDSL.g:6066:1: rule__DataInterchangeFileCSV__Group_3_2__1 : rule__DataInterchangeFileCSV__Group_3_2__1__Impl ;
     public final void rule__DataInterchangeFileCSV__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5821:1: ( rule__DataInterchangeFileCSV__Group_3_2__1__Impl )
-            // InternalDataDSL.g:5822:2: rule__DataInterchangeFileCSV__Group_3_2__1__Impl
+            // InternalDataDSL.g:6070:1: ( rule__DataInterchangeFileCSV__Group_3_2__1__Impl )
+            // InternalDataDSL.g:6071:2: rule__DataInterchangeFileCSV__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group_3_2__1__Impl();
@@ -20962,23 +21977,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_2__1__Impl"
-    // InternalDataDSL.g:5828:1: rule__DataInterchangeFileCSV__Group_3_2__1__Impl : ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) ) ;
+    // InternalDataDSL.g:6077:1: rule__DataInterchangeFileCSV__Group_3_2__1__Impl : ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5832:1: ( ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) ) )
-            // InternalDataDSL.g:5833:1: ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) )
+            // InternalDataDSL.g:6081:1: ( ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) ) )
+            // InternalDataDSL.g:6082:1: ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) )
             {
-            // InternalDataDSL.g:5833:1: ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) )
-            // InternalDataDSL.g:5834:2: ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 )
+            // InternalDataDSL.g:6082:1: ( ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 ) )
+            // InternalDataDSL.g:6083:2: ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getSkipLinesAssignment_3_2_1()); 
             }
-            // InternalDataDSL.g:5835:2: ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 )
-            // InternalDataDSL.g:5835:3: rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1
+            // InternalDataDSL.g:6084:2: ( rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 )
+            // InternalDataDSL.g:6084:3: rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1();
@@ -21013,14 +22028,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_4__0"
-    // InternalDataDSL.g:5844:1: rule__DataInterchangeFileCSV__Group_3_4__0 : rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1 ;
+    // InternalDataDSL.g:6093:1: rule__DataInterchangeFileCSV__Group_3_4__0 : rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1 ;
     public final void rule__DataInterchangeFileCSV__Group_3_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5848:1: ( rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1 )
-            // InternalDataDSL.g:5849:2: rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1
+            // InternalDataDSL.g:6097:1: ( rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1 )
+            // InternalDataDSL.g:6098:2: rule__DataInterchangeFileCSV__Group_3_4__0__Impl rule__DataInterchangeFileCSV__Group_3_4__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileCSV__Group_3_4__0__Impl();
@@ -21051,17 +22066,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_4__0__Impl"
-    // InternalDataDSL.g:5856:1: rule__DataInterchangeFileCSV__Group_3_4__0__Impl : ( 'encoding' ) ;
+    // InternalDataDSL.g:6105:1: rule__DataInterchangeFileCSV__Group_3_4__0__Impl : ( 'encoding' ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5860:1: ( ( 'encoding' ) )
-            // InternalDataDSL.g:5861:1: ( 'encoding' )
+            // InternalDataDSL.g:6109:1: ( ( 'encoding' ) )
+            // InternalDataDSL.g:6110:1: ( 'encoding' )
             {
-            // InternalDataDSL.g:5861:1: ( 'encoding' )
-            // InternalDataDSL.g:5862:2: 'encoding'
+            // InternalDataDSL.g:6110:1: ( 'encoding' )
+            // InternalDataDSL.g:6111:2: 'encoding'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getEncodingKeyword_3_4_0()); 
@@ -21092,14 +22107,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_4__1"
-    // InternalDataDSL.g:5871:1: rule__DataInterchangeFileCSV__Group_3_4__1 : rule__DataInterchangeFileCSV__Group_3_4__1__Impl ;
+    // InternalDataDSL.g:6120:1: rule__DataInterchangeFileCSV__Group_3_4__1 : rule__DataInterchangeFileCSV__Group_3_4__1__Impl ;
     public final void rule__DataInterchangeFileCSV__Group_3_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5875:1: ( rule__DataInterchangeFileCSV__Group_3_4__1__Impl )
-            // InternalDataDSL.g:5876:2: rule__DataInterchangeFileCSV__Group_3_4__1__Impl
+            // InternalDataDSL.g:6124:1: ( rule__DataInterchangeFileCSV__Group_3_4__1__Impl )
+            // InternalDataDSL.g:6125:2: rule__DataInterchangeFileCSV__Group_3_4__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group_3_4__1__Impl();
@@ -21125,23 +22140,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_4__1__Impl"
-    // InternalDataDSL.g:5882:1: rule__DataInterchangeFileCSV__Group_3_4__1__Impl : ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) ) ;
+    // InternalDataDSL.g:6131:1: rule__DataInterchangeFileCSV__Group_3_4__1__Impl : ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5886:1: ( ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) ) )
-            // InternalDataDSL.g:5887:1: ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) )
+            // InternalDataDSL.g:6135:1: ( ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) ) )
+            // InternalDataDSL.g:6136:1: ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) )
             {
-            // InternalDataDSL.g:5887:1: ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) )
-            // InternalDataDSL.g:5888:2: ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 )
+            // InternalDataDSL.g:6136:1: ( ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 ) )
+            // InternalDataDSL.g:6137:2: ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getEncodingAssignment_3_4_1()); 
             }
-            // InternalDataDSL.g:5889:2: ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 )
-            // InternalDataDSL.g:5889:3: rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1
+            // InternalDataDSL.g:6138:2: ( rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 )
+            // InternalDataDSL.g:6138:3: rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1();
@@ -21176,14 +22191,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_5__0"
-    // InternalDataDSL.g:5898:1: rule__DataInterchangeFileCSV__Group_3_5__0 : rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1 ;
+    // InternalDataDSL.g:6147:1: rule__DataInterchangeFileCSV__Group_3_5__0 : rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1 ;
     public final void rule__DataInterchangeFileCSV__Group_3_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5902:1: ( rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1 )
-            // InternalDataDSL.g:5903:2: rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1
+            // InternalDataDSL.g:6151:1: ( rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1 )
+            // InternalDataDSL.g:6152:2: rule__DataInterchangeFileCSV__Group_3_5__0__Impl rule__DataInterchangeFileCSV__Group_3_5__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileCSV__Group_3_5__0__Impl();
@@ -21214,17 +22229,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_5__0__Impl"
-    // InternalDataDSL.g:5910:1: rule__DataInterchangeFileCSV__Group_3_5__0__Impl : ( 'locale' ) ;
+    // InternalDataDSL.g:6159:1: rule__DataInterchangeFileCSV__Group_3_5__0__Impl : ( 'locale' ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5914:1: ( ( 'locale' ) )
-            // InternalDataDSL.g:5915:1: ( 'locale' )
+            // InternalDataDSL.g:6163:1: ( ( 'locale' ) )
+            // InternalDataDSL.g:6164:1: ( 'locale' )
             {
-            // InternalDataDSL.g:5915:1: ( 'locale' )
-            // InternalDataDSL.g:5916:2: 'locale'
+            // InternalDataDSL.g:6164:1: ( 'locale' )
+            // InternalDataDSL.g:6165:2: 'locale'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getLocaleKeyword_3_5_0()); 
@@ -21255,14 +22270,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_5__1"
-    // InternalDataDSL.g:5925:1: rule__DataInterchangeFileCSV__Group_3_5__1 : rule__DataInterchangeFileCSV__Group_3_5__1__Impl ;
+    // InternalDataDSL.g:6174:1: rule__DataInterchangeFileCSV__Group_3_5__1 : rule__DataInterchangeFileCSV__Group_3_5__1__Impl ;
     public final void rule__DataInterchangeFileCSV__Group_3_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5929:1: ( rule__DataInterchangeFileCSV__Group_3_5__1__Impl )
-            // InternalDataDSL.g:5930:2: rule__DataInterchangeFileCSV__Group_3_5__1__Impl
+            // InternalDataDSL.g:6178:1: ( rule__DataInterchangeFileCSV__Group_3_5__1__Impl )
+            // InternalDataDSL.g:6179:2: rule__DataInterchangeFileCSV__Group_3_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__Group_3_5__1__Impl();
@@ -21288,23 +22303,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__Group_3_5__1__Impl"
-    // InternalDataDSL.g:5936:1: rule__DataInterchangeFileCSV__Group_3_5__1__Impl : ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) ) ;
+    // InternalDataDSL.g:6185:1: rule__DataInterchangeFileCSV__Group_3_5__1__Impl : ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) ) ;
     public final void rule__DataInterchangeFileCSV__Group_3_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5940:1: ( ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) ) )
-            // InternalDataDSL.g:5941:1: ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) )
+            // InternalDataDSL.g:6189:1: ( ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) ) )
+            // InternalDataDSL.g:6190:1: ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) )
             {
-            // InternalDataDSL.g:5941:1: ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) )
-            // InternalDataDSL.g:5942:2: ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 )
+            // InternalDataDSL.g:6190:1: ( ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 ) )
+            // InternalDataDSL.g:6191:2: ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getLocaleAssignment_3_5_1()); 
             }
-            // InternalDataDSL.g:5943:2: ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 )
-            // InternalDataDSL.g:5943:3: rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1
+            // InternalDataDSL.g:6192:2: ( rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 )
+            // InternalDataDSL.g:6192:3: rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1();
@@ -21339,16 +22354,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__0"
-    // InternalDataDSL.g:5952:1: rule__DataInterchangeFileEDI__Group__0 : rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1 ;
+    // InternalDataDSL.g:6201:1: rule__DataInterchangeFileEDI__Group__0 : rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1 ;
     public final void rule__DataInterchangeFileEDI__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5956:1: ( rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1 )
-            // InternalDataDSL.g:5957:2: rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1
+            // InternalDataDSL.g:6205:1: ( rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1 )
+            // InternalDataDSL.g:6206:2: rule__DataInterchangeFileEDI__Group__0__Impl rule__DataInterchangeFileEDI__Group__1
             {
-            pushFollow(FOLLOW_17);
+            pushFollow(FOLLOW_27);
             rule__DataInterchangeFileEDI__Group__0__Impl();
 
             state._fsp--;
@@ -21377,23 +22392,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__0__Impl"
-    // InternalDataDSL.g:5964:1: rule__DataInterchangeFileEDI__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:6213:1: rule__DataInterchangeFileEDI__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeFileEDI__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5968:1: ( ( () ) )
-            // InternalDataDSL.g:5969:1: ( () )
+            // InternalDataDSL.g:6217:1: ( ( () ) )
+            // InternalDataDSL.g:6218:1: ( () )
             {
-            // InternalDataDSL.g:5969:1: ( () )
-            // InternalDataDSL.g:5970:2: ()
+            // InternalDataDSL.g:6218:1: ( () )
+            // InternalDataDSL.g:6219:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getDataInterchangeFileEDIAction_0()); 
             }
-            // InternalDataDSL.g:5971:2: ()
-            // InternalDataDSL.g:5971:3: 
+            // InternalDataDSL.g:6220:2: ()
+            // InternalDataDSL.g:6220:3: 
             {
             }
 
@@ -21418,14 +22433,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__1"
-    // InternalDataDSL.g:5979:1: rule__DataInterchangeFileEDI__Group__1 : rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2 ;
+    // InternalDataDSL.g:6228:1: rule__DataInterchangeFileEDI__Group__1 : rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2 ;
     public final void rule__DataInterchangeFileEDI__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5983:1: ( rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2 )
-            // InternalDataDSL.g:5984:2: rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2
+            // InternalDataDSL.g:6232:1: ( rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2 )
+            // InternalDataDSL.g:6233:2: rule__DataInterchangeFileEDI__Group__1__Impl rule__DataInterchangeFileEDI__Group__2
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileEDI__Group__1__Impl();
@@ -21456,17 +22471,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__1__Impl"
-    // InternalDataDSL.g:5991:1: rule__DataInterchangeFileEDI__Group__1__Impl : ( 'EDI' ) ;
+    // InternalDataDSL.g:6240:1: rule__DataInterchangeFileEDI__Group__1__Impl : ( 'EDI' ) ;
     public final void rule__DataInterchangeFileEDI__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:5995:1: ( ( 'EDI' ) )
-            // InternalDataDSL.g:5996:1: ( 'EDI' )
+            // InternalDataDSL.g:6244:1: ( ( 'EDI' ) )
+            // InternalDataDSL.g:6245:1: ( 'EDI' )
             {
-            // InternalDataDSL.g:5996:1: ( 'EDI' )
-            // InternalDataDSL.g:5997:2: 'EDI'
+            // InternalDataDSL.g:6245:1: ( 'EDI' )
+            // InternalDataDSL.g:6246:2: 'EDI'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getEDIKeyword_1()); 
@@ -21497,16 +22512,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__2"
-    // InternalDataDSL.g:6006:1: rule__DataInterchangeFileEDI__Group__2 : rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3 ;
+    // InternalDataDSL.g:6255:1: rule__DataInterchangeFileEDI__Group__2 : rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3 ;
     public final void rule__DataInterchangeFileEDI__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6010:1: ( rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3 )
-            // InternalDataDSL.g:6011:2: rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3
+            // InternalDataDSL.g:6259:1: ( rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3 )
+            // InternalDataDSL.g:6260:2: rule__DataInterchangeFileEDI__Group__2__Impl rule__DataInterchangeFileEDI__Group__3
             {
-            pushFollow(FOLLOW_27);
+            pushFollow(FOLLOW_28);
             rule__DataInterchangeFileEDI__Group__2__Impl();
 
             state._fsp--;
@@ -21535,23 +22550,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__2__Impl"
-    // InternalDataDSL.g:6018:1: rule__DataInterchangeFileEDI__Group__2__Impl : ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) ) ;
+    // InternalDataDSL.g:6267:1: rule__DataInterchangeFileEDI__Group__2__Impl : ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) ) ;
     public final void rule__DataInterchangeFileEDI__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6022:1: ( ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) ) )
-            // InternalDataDSL.g:6023:1: ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:6271:1: ( ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) ) )
+            // InternalDataDSL.g:6272:1: ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) )
             {
-            // InternalDataDSL.g:6023:1: ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) )
-            // InternalDataDSL.g:6024:2: ( rule__DataInterchangeFileEDI__FileURLAssignment_2 )
+            // InternalDataDSL.g:6272:1: ( ( rule__DataInterchangeFileEDI__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:6273:2: ( rule__DataInterchangeFileEDI__FileURLAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getFileURLAssignment_2()); 
             }
-            // InternalDataDSL.g:6025:2: ( rule__DataInterchangeFileEDI__FileURLAssignment_2 )
-            // InternalDataDSL.g:6025:3: rule__DataInterchangeFileEDI__FileURLAssignment_2
+            // InternalDataDSL.g:6274:2: ( rule__DataInterchangeFileEDI__FileURLAssignment_2 )
+            // InternalDataDSL.g:6274:3: rule__DataInterchangeFileEDI__FileURLAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__FileURLAssignment_2();
@@ -21586,16 +22601,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__3"
-    // InternalDataDSL.g:6033:1: rule__DataInterchangeFileEDI__Group__3 : rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4 ;
+    // InternalDataDSL.g:6282:1: rule__DataInterchangeFileEDI__Group__3 : rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4 ;
     public final void rule__DataInterchangeFileEDI__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6037:1: ( rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4 )
-            // InternalDataDSL.g:6038:2: rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4
+            // InternalDataDSL.g:6286:1: ( rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4 )
+            // InternalDataDSL.g:6287:2: rule__DataInterchangeFileEDI__Group__3__Impl rule__DataInterchangeFileEDI__Group__4
             {
-            pushFollow(FOLLOW_28);
+            pushFollow(FOLLOW_29);
             rule__DataInterchangeFileEDI__Group__3__Impl();
 
             state._fsp--;
@@ -21624,23 +22639,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__3__Impl"
-    // InternalDataDSL.g:6045:1: rule__DataInterchangeFileEDI__Group__3__Impl : ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) ) ;
+    // InternalDataDSL.g:6294:1: rule__DataInterchangeFileEDI__Group__3__Impl : ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) ) ;
     public final void rule__DataInterchangeFileEDI__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6049:1: ( ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) ) )
-            // InternalDataDSL.g:6050:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:6298:1: ( ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) ) )
+            // InternalDataDSL.g:6299:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) )
             {
-            // InternalDataDSL.g:6050:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) )
-            // InternalDataDSL.g:6051:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3 )
+            // InternalDataDSL.g:6299:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:6300:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3()); 
             }
-            // InternalDataDSL.g:6052:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3 )
-            // InternalDataDSL.g:6052:3: rule__DataInterchangeFileEDI__UnorderedGroup_3
+            // InternalDataDSL.g:6301:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3 )
+            // InternalDataDSL.g:6301:3: rule__DataInterchangeFileEDI__UnorderedGroup_3
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__UnorderedGroup_3();
@@ -21675,14 +22690,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__4"
-    // InternalDataDSL.g:6060:1: rule__DataInterchangeFileEDI__Group__4 : rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5 ;
+    // InternalDataDSL.g:6309:1: rule__DataInterchangeFileEDI__Group__4 : rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5 ;
     public final void rule__DataInterchangeFileEDI__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6064:1: ( rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5 )
-            // InternalDataDSL.g:6065:2: rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5
+            // InternalDataDSL.g:6313:1: ( rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5 )
+            // InternalDataDSL.g:6314:2: rule__DataInterchangeFileEDI__Group__4__Impl rule__DataInterchangeFileEDI__Group__5
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileEDI__Group__4__Impl();
@@ -21713,17 +22728,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__4__Impl"
-    // InternalDataDSL.g:6072:1: rule__DataInterchangeFileEDI__Group__4__Impl : ( 'mappingModel' ) ;
+    // InternalDataDSL.g:6321:1: rule__DataInterchangeFileEDI__Group__4__Impl : ( 'mappingModel' ) ;
     public final void rule__DataInterchangeFileEDI__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6076:1: ( ( 'mappingModel' ) )
-            // InternalDataDSL.g:6077:1: ( 'mappingModel' )
+            // InternalDataDSL.g:6325:1: ( ( 'mappingModel' ) )
+            // InternalDataDSL.g:6326:1: ( 'mappingModel' )
             {
-            // InternalDataDSL.g:6077:1: ( 'mappingModel' )
-            // InternalDataDSL.g:6078:2: 'mappingModel'
+            // InternalDataDSL.g:6326:1: ( 'mappingModel' )
+            // InternalDataDSL.g:6327:2: 'mappingModel'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getMappingModelKeyword_4()); 
@@ -21754,16 +22769,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__5"
-    // InternalDataDSL.g:6087:1: rule__DataInterchangeFileEDI__Group__5 : rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6 ;
+    // InternalDataDSL.g:6336:1: rule__DataInterchangeFileEDI__Group__5 : rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6 ;
     public final void rule__DataInterchangeFileEDI__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6091:1: ( rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6 )
-            // InternalDataDSL.g:6092:2: rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6
+            // InternalDataDSL.g:6340:1: ( rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6 )
+            // InternalDataDSL.g:6341:2: rule__DataInterchangeFileEDI__Group__5__Impl rule__DataInterchangeFileEDI__Group__6
             {
-            pushFollow(FOLLOW_29);
+            pushFollow(FOLLOW_30);
             rule__DataInterchangeFileEDI__Group__5__Impl();
 
             state._fsp--;
@@ -21792,23 +22807,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__5__Impl"
-    // InternalDataDSL.g:6099:1: rule__DataInterchangeFileEDI__Group__5__Impl : ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) ) ;
+    // InternalDataDSL.g:6348:1: rule__DataInterchangeFileEDI__Group__5__Impl : ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) ) ;
     public final void rule__DataInterchangeFileEDI__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6103:1: ( ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) ) )
-            // InternalDataDSL.g:6104:1: ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) )
+            // InternalDataDSL.g:6352:1: ( ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) ) )
+            // InternalDataDSL.g:6353:1: ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) )
             {
-            // InternalDataDSL.g:6104:1: ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) )
-            // InternalDataDSL.g:6105:2: ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 )
+            // InternalDataDSL.g:6353:1: ( ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 ) )
+            // InternalDataDSL.g:6354:2: ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getMappingModelAssignment_5()); 
             }
-            // InternalDataDSL.g:6106:2: ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 )
-            // InternalDataDSL.g:6106:3: rule__DataInterchangeFileEDI__MappingModelAssignment_5
+            // InternalDataDSL.g:6355:2: ( rule__DataInterchangeFileEDI__MappingModelAssignment_5 )
+            // InternalDataDSL.g:6355:3: rule__DataInterchangeFileEDI__MappingModelAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__MappingModelAssignment_5();
@@ -21843,14 +22858,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__6"
-    // InternalDataDSL.g:6114:1: rule__DataInterchangeFileEDI__Group__6 : rule__DataInterchangeFileEDI__Group__6__Impl ;
+    // InternalDataDSL.g:6363:1: rule__DataInterchangeFileEDI__Group__6 : rule__DataInterchangeFileEDI__Group__6__Impl ;
     public final void rule__DataInterchangeFileEDI__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6118:1: ( rule__DataInterchangeFileEDI__Group__6__Impl )
-            // InternalDataDSL.g:6119:2: rule__DataInterchangeFileEDI__Group__6__Impl
+            // InternalDataDSL.g:6367:1: ( rule__DataInterchangeFileEDI__Group__6__Impl )
+            // InternalDataDSL.g:6368:2: rule__DataInterchangeFileEDI__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__Group__6__Impl();
@@ -21876,31 +22891,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group__6__Impl"
-    // InternalDataDSL.g:6125:1: rule__DataInterchangeFileEDI__Group__6__Impl : ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? ) ;
+    // InternalDataDSL.g:6374:1: rule__DataInterchangeFileEDI__Group__6__Impl : ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? ) ;
     public final void rule__DataInterchangeFileEDI__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6129:1: ( ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? ) )
-            // InternalDataDSL.g:6130:1: ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? )
+            // InternalDataDSL.g:6378:1: ( ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? ) )
+            // InternalDataDSL.g:6379:1: ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? )
             {
-            // InternalDataDSL.g:6130:1: ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? )
-            // InternalDataDSL.g:6131:2: ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )?
+            // InternalDataDSL.g:6379:1: ( ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )? )
+            // InternalDataDSL.g:6380:2: ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getValidateAssignment_6()); 
             }
-            // InternalDataDSL.g:6132:2: ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )?
-            int alt68=2;
-            int LA68_0 = input.LA(1);
+            // InternalDataDSL.g:6381:2: ( rule__DataInterchangeFileEDI__ValidateAssignment_6 )?
+            int alt71=2;
+            int LA71_0 = input.LA(1);
 
-            if ( (LA68_0==154) ) {
-                alt68=1;
+            if ( (LA71_0==160) ) {
+                alt71=1;
             }
-            switch (alt68) {
+            switch (alt71) {
                 case 1 :
-                    // InternalDataDSL.g:6132:3: rule__DataInterchangeFileEDI__ValidateAssignment_6
+                    // InternalDataDSL.g:6381:3: rule__DataInterchangeFileEDI__ValidateAssignment_6
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileEDI__ValidateAssignment_6();
@@ -21938,14 +22953,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_0__0"
-    // InternalDataDSL.g:6141:1: rule__DataInterchangeFileEDI__Group_3_0__0 : rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1 ;
+    // InternalDataDSL.g:6390:1: rule__DataInterchangeFileEDI__Group_3_0__0 : rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1 ;
     public final void rule__DataInterchangeFileEDI__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6145:1: ( rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1 )
-            // InternalDataDSL.g:6146:2: rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1
+            // InternalDataDSL.g:6394:1: ( rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1 )
+            // InternalDataDSL.g:6395:2: rule__DataInterchangeFileEDI__Group_3_0__0__Impl rule__DataInterchangeFileEDI__Group_3_0__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileEDI__Group_3_0__0__Impl();
@@ -21976,17 +22991,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_0__0__Impl"
-    // InternalDataDSL.g:6153:1: rule__DataInterchangeFileEDI__Group_3_0__0__Impl : ( 'encoding' ) ;
+    // InternalDataDSL.g:6402:1: rule__DataInterchangeFileEDI__Group_3_0__0__Impl : ( 'encoding' ) ;
     public final void rule__DataInterchangeFileEDI__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6157:1: ( ( 'encoding' ) )
-            // InternalDataDSL.g:6158:1: ( 'encoding' )
+            // InternalDataDSL.g:6406:1: ( ( 'encoding' ) )
+            // InternalDataDSL.g:6407:1: ( 'encoding' )
             {
-            // InternalDataDSL.g:6158:1: ( 'encoding' )
-            // InternalDataDSL.g:6159:2: 'encoding'
+            // InternalDataDSL.g:6407:1: ( 'encoding' )
+            // InternalDataDSL.g:6408:2: 'encoding'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getEncodingKeyword_3_0_0()); 
@@ -22017,14 +23032,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_0__1"
-    // InternalDataDSL.g:6168:1: rule__DataInterchangeFileEDI__Group_3_0__1 : rule__DataInterchangeFileEDI__Group_3_0__1__Impl ;
+    // InternalDataDSL.g:6417:1: rule__DataInterchangeFileEDI__Group_3_0__1 : rule__DataInterchangeFileEDI__Group_3_0__1__Impl ;
     public final void rule__DataInterchangeFileEDI__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6172:1: ( rule__DataInterchangeFileEDI__Group_3_0__1__Impl )
-            // InternalDataDSL.g:6173:2: rule__DataInterchangeFileEDI__Group_3_0__1__Impl
+            // InternalDataDSL.g:6421:1: ( rule__DataInterchangeFileEDI__Group_3_0__1__Impl )
+            // InternalDataDSL.g:6422:2: rule__DataInterchangeFileEDI__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__Group_3_0__1__Impl();
@@ -22050,23 +23065,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_0__1__Impl"
-    // InternalDataDSL.g:6179:1: rule__DataInterchangeFileEDI__Group_3_0__1__Impl : ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) ) ;
+    // InternalDataDSL.g:6428:1: rule__DataInterchangeFileEDI__Group_3_0__1__Impl : ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) ) ;
     public final void rule__DataInterchangeFileEDI__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6183:1: ( ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) ) )
-            // InternalDataDSL.g:6184:1: ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) )
+            // InternalDataDSL.g:6432:1: ( ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) ) )
+            // InternalDataDSL.g:6433:1: ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) )
             {
-            // InternalDataDSL.g:6184:1: ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) )
-            // InternalDataDSL.g:6185:2: ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 )
+            // InternalDataDSL.g:6433:1: ( ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 ) )
+            // InternalDataDSL.g:6434:2: ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getEncodingAssignment_3_0_1()); 
             }
-            // InternalDataDSL.g:6186:2: ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 )
-            // InternalDataDSL.g:6186:3: rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1
+            // InternalDataDSL.g:6435:2: ( rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 )
+            // InternalDataDSL.g:6435:3: rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1();
@@ -22101,14 +23116,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_1__0"
-    // InternalDataDSL.g:6195:1: rule__DataInterchangeFileEDI__Group_3_1__0 : rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1 ;
+    // InternalDataDSL.g:6444:1: rule__DataInterchangeFileEDI__Group_3_1__0 : rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1 ;
     public final void rule__DataInterchangeFileEDI__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6199:1: ( rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1 )
-            // InternalDataDSL.g:6200:2: rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1
+            // InternalDataDSL.g:6448:1: ( rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1 )
+            // InternalDataDSL.g:6449:2: rule__DataInterchangeFileEDI__Group_3_1__0__Impl rule__DataInterchangeFileEDI__Group_3_1__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFileEDI__Group_3_1__0__Impl();
@@ -22139,17 +23154,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_1__0__Impl"
-    // InternalDataDSL.g:6207:1: rule__DataInterchangeFileEDI__Group_3_1__0__Impl : ( 'locale' ) ;
+    // InternalDataDSL.g:6456:1: rule__DataInterchangeFileEDI__Group_3_1__0__Impl : ( 'locale' ) ;
     public final void rule__DataInterchangeFileEDI__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6211:1: ( ( 'locale' ) )
-            // InternalDataDSL.g:6212:1: ( 'locale' )
+            // InternalDataDSL.g:6460:1: ( ( 'locale' ) )
+            // InternalDataDSL.g:6461:1: ( 'locale' )
             {
-            // InternalDataDSL.g:6212:1: ( 'locale' )
-            // InternalDataDSL.g:6213:2: 'locale'
+            // InternalDataDSL.g:6461:1: ( 'locale' )
+            // InternalDataDSL.g:6462:2: 'locale'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getLocaleKeyword_3_1_0()); 
@@ -22180,14 +23195,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_1__1"
-    // InternalDataDSL.g:6222:1: rule__DataInterchangeFileEDI__Group_3_1__1 : rule__DataInterchangeFileEDI__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:6471:1: rule__DataInterchangeFileEDI__Group_3_1__1 : rule__DataInterchangeFileEDI__Group_3_1__1__Impl ;
     public final void rule__DataInterchangeFileEDI__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6226:1: ( rule__DataInterchangeFileEDI__Group_3_1__1__Impl )
-            // InternalDataDSL.g:6227:2: rule__DataInterchangeFileEDI__Group_3_1__1__Impl
+            // InternalDataDSL.g:6475:1: ( rule__DataInterchangeFileEDI__Group_3_1__1__Impl )
+            // InternalDataDSL.g:6476:2: rule__DataInterchangeFileEDI__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__Group_3_1__1__Impl();
@@ -22213,23 +23228,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__Group_3_1__1__Impl"
-    // InternalDataDSL.g:6233:1: rule__DataInterchangeFileEDI__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:6482:1: rule__DataInterchangeFileEDI__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) ) ;
     public final void rule__DataInterchangeFileEDI__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6237:1: ( ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:6238:1: ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) )
+            // InternalDataDSL.g:6486:1: ( ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:6487:1: ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:6238:1: ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) )
-            // InternalDataDSL.g:6239:2: ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 )
+            // InternalDataDSL.g:6487:1: ( ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 ) )
+            // InternalDataDSL.g:6488:2: ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getLocaleAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:6240:2: ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 )
-            // InternalDataDSL.g:6240:3: rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1
+            // InternalDataDSL.g:6489:2: ( rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 )
+            // InternalDataDSL.g:6489:3: rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1();
@@ -22263,17 +23278,674 @@
     // $ANTLR end "rule__DataInterchangeFileEDI__Group_3_1__1__Impl"
 
 
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__0"
+    // InternalDataDSL.g:6498:1: rule__DataInterchangeFileFixed__Group__0 : rule__DataInterchangeFileFixed__Group__0__Impl rule__DataInterchangeFileFixed__Group__1 ;
+    public final void rule__DataInterchangeFileFixed__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6502:1: ( rule__DataInterchangeFileFixed__Group__0__Impl rule__DataInterchangeFileFixed__Group__1 )
+            // InternalDataDSL.g:6503:2: rule__DataInterchangeFileFixed__Group__0__Impl rule__DataInterchangeFileFixed__Group__1
+            {
+            pushFollow(FOLLOW_17);
+            rule__DataInterchangeFileFixed__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__0"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__0__Impl"
+    // InternalDataDSL.g:6510:1: rule__DataInterchangeFileFixed__Group__0__Impl : ( () ) ;
+    public final void rule__DataInterchangeFileFixed__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6514:1: ( ( () ) )
+            // InternalDataDSL.g:6515:1: ( () )
+            {
+            // InternalDataDSL.g:6515:1: ( () )
+            // InternalDataDSL.g:6516:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0()); 
+            }
+            // InternalDataDSL.g:6517:2: ()
+            // InternalDataDSL.g:6517:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__1"
+    // InternalDataDSL.g:6525:1: rule__DataInterchangeFileFixed__Group__1 : rule__DataInterchangeFileFixed__Group__1__Impl rule__DataInterchangeFileFixed__Group__2 ;
+    public final void rule__DataInterchangeFileFixed__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6529:1: ( rule__DataInterchangeFileFixed__Group__1__Impl rule__DataInterchangeFileFixed__Group__2 )
+            // InternalDataDSL.g:6530:2: rule__DataInterchangeFileFixed__Group__1__Impl rule__DataInterchangeFileFixed__Group__2
+            {
+            pushFollow(FOLLOW_21);
+            rule__DataInterchangeFileFixed__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__1"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__1__Impl"
+    // InternalDataDSL.g:6537:1: rule__DataInterchangeFileFixed__Group__1__Impl : ( 'Fixed' ) ;
+    public final void rule__DataInterchangeFileFixed__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6541:1: ( ( 'Fixed' ) )
+            // InternalDataDSL.g:6542:1: ( 'Fixed' )
+            {
+            // InternalDataDSL.g:6542:1: ( 'Fixed' )
+            // InternalDataDSL.g:6543:2: 'Fixed'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1()); 
+            }
+            match(input,90,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__2"
+    // InternalDataDSL.g:6552:1: rule__DataInterchangeFileFixed__Group__2 : rule__DataInterchangeFileFixed__Group__2__Impl rule__DataInterchangeFileFixed__Group__3 ;
+    public final void rule__DataInterchangeFileFixed__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6556:1: ( rule__DataInterchangeFileFixed__Group__2__Impl rule__DataInterchangeFileFixed__Group__3 )
+            // InternalDataDSL.g:6557:2: rule__DataInterchangeFileFixed__Group__2__Impl rule__DataInterchangeFileFixed__Group__3
+            {
+            pushFollow(FOLLOW_28);
+            rule__DataInterchangeFileFixed__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__2"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__2__Impl"
+    // InternalDataDSL.g:6564:1: rule__DataInterchangeFileFixed__Group__2__Impl : ( ( rule__DataInterchangeFileFixed__FileURLAssignment_2 ) ) ;
+    public final void rule__DataInterchangeFileFixed__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6568:1: ( ( ( rule__DataInterchangeFileFixed__FileURLAssignment_2 ) ) )
+            // InternalDataDSL.g:6569:1: ( ( rule__DataInterchangeFileFixed__FileURLAssignment_2 ) )
+            {
+            // InternalDataDSL.g:6569:1: ( ( rule__DataInterchangeFileFixed__FileURLAssignment_2 ) )
+            // InternalDataDSL.g:6570:2: ( rule__DataInterchangeFileFixed__FileURLAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLAssignment_2()); 
+            }
+            // InternalDataDSL.g:6571:2: ( rule__DataInterchangeFileFixed__FileURLAssignment_2 )
+            // InternalDataDSL.g:6571:3: rule__DataInterchangeFileFixed__FileURLAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__FileURLAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__3"
+    // InternalDataDSL.g:6579:1: rule__DataInterchangeFileFixed__Group__3 : rule__DataInterchangeFileFixed__Group__3__Impl ;
+    public final void rule__DataInterchangeFileFixed__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6583:1: ( rule__DataInterchangeFileFixed__Group__3__Impl )
+            // InternalDataDSL.g:6584:2: rule__DataInterchangeFileFixed__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__3"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group__3__Impl"
+    // InternalDataDSL.g:6590:1: rule__DataInterchangeFileFixed__Group__3__Impl : ( ( rule__DataInterchangeFileFixed__UnorderedGroup_3 ) ) ;
+    public final void rule__DataInterchangeFileFixed__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6594:1: ( ( ( rule__DataInterchangeFileFixed__UnorderedGroup_3 ) ) )
+            // InternalDataDSL.g:6595:1: ( ( rule__DataInterchangeFileFixed__UnorderedGroup_3 ) )
+            {
+            // InternalDataDSL.g:6595:1: ( ( rule__DataInterchangeFileFixed__UnorderedGroup_3 ) )
+            // InternalDataDSL.g:6596:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3()); 
+            }
+            // InternalDataDSL.g:6597:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3 )
+            // InternalDataDSL.g:6597:3: rule__DataInterchangeFileFixed__UnorderedGroup_3
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__UnorderedGroup_3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_0__0"
+    // InternalDataDSL.g:6606:1: rule__DataInterchangeFileFixed__Group_3_0__0 : rule__DataInterchangeFileFixed__Group_3_0__0__Impl rule__DataInterchangeFileFixed__Group_3_0__1 ;
+    public final void rule__DataInterchangeFileFixed__Group_3_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6610:1: ( rule__DataInterchangeFileFixed__Group_3_0__0__Impl rule__DataInterchangeFileFixed__Group_3_0__1 )
+            // InternalDataDSL.g:6611:2: rule__DataInterchangeFileFixed__Group_3_0__0__Impl rule__DataInterchangeFileFixed__Group_3_0__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__DataInterchangeFileFixed__Group_3_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group_3_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_0__0"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_0__0__Impl"
+    // InternalDataDSL.g:6618:1: rule__DataInterchangeFileFixed__Group_3_0__0__Impl : ( 'encoding' ) ;
+    public final void rule__DataInterchangeFileFixed__Group_3_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6622:1: ( ( 'encoding' ) )
+            // InternalDataDSL.g:6623:1: ( 'encoding' )
+            {
+            // InternalDataDSL.g:6623:1: ( 'encoding' )
+            // InternalDataDSL.g:6624:2: 'encoding'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0()); 
+            }
+            match(input,82,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_0__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_0__1"
+    // InternalDataDSL.g:6633:1: rule__DataInterchangeFileFixed__Group_3_0__1 : rule__DataInterchangeFileFixed__Group_3_0__1__Impl ;
+    public final void rule__DataInterchangeFileFixed__Group_3_0__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6637:1: ( rule__DataInterchangeFileFixed__Group_3_0__1__Impl )
+            // InternalDataDSL.g:6638:2: rule__DataInterchangeFileFixed__Group_3_0__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group_3_0__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_0__1"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_0__1__Impl"
+    // InternalDataDSL.g:6644:1: rule__DataInterchangeFileFixed__Group_3_0__1__Impl : ( ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 ) ) ;
+    public final void rule__DataInterchangeFileFixed__Group_3_0__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6648:1: ( ( ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 ) ) )
+            // InternalDataDSL.g:6649:1: ( ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 ) )
+            {
+            // InternalDataDSL.g:6649:1: ( ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 ) )
+            // InternalDataDSL.g:6650:2: ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingAssignment_3_0_1()); 
+            }
+            // InternalDataDSL.g:6651:2: ( rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 )
+            // InternalDataDSL.g:6651:3: rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingAssignment_3_0_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_0__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_1__0"
+    // InternalDataDSL.g:6660:1: rule__DataInterchangeFileFixed__Group_3_1__0 : rule__DataInterchangeFileFixed__Group_3_1__0__Impl rule__DataInterchangeFileFixed__Group_3_1__1 ;
+    public final void rule__DataInterchangeFileFixed__Group_3_1__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6664:1: ( rule__DataInterchangeFileFixed__Group_3_1__0__Impl rule__DataInterchangeFileFixed__Group_3_1__1 )
+            // InternalDataDSL.g:6665:2: rule__DataInterchangeFileFixed__Group_3_1__0__Impl rule__DataInterchangeFileFixed__Group_3_1__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__DataInterchangeFileFixed__Group_3_1__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group_3_1__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_1__0"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_1__0__Impl"
+    // InternalDataDSL.g:6672:1: rule__DataInterchangeFileFixed__Group_3_1__0__Impl : ( 'locale' ) ;
+    public final void rule__DataInterchangeFileFixed__Group_3_1__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6676:1: ( ( 'locale' ) )
+            // InternalDataDSL.g:6677:1: ( 'locale' )
+            {
+            // InternalDataDSL.g:6677:1: ( 'locale' )
+            // InternalDataDSL.g:6678:2: 'locale'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0()); 
+            }
+            match(input,83,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_1__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_1__1"
+    // InternalDataDSL.g:6687:1: rule__DataInterchangeFileFixed__Group_3_1__1 : rule__DataInterchangeFileFixed__Group_3_1__1__Impl ;
+    public final void rule__DataInterchangeFileFixed__Group_3_1__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6691:1: ( rule__DataInterchangeFileFixed__Group_3_1__1__Impl )
+            // InternalDataDSL.g:6692:2: rule__DataInterchangeFileFixed__Group_3_1__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__Group_3_1__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_1__1"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__Group_3_1__1__Impl"
+    // InternalDataDSL.g:6698:1: rule__DataInterchangeFileFixed__Group_3_1__1__Impl : ( ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 ) ) ;
+    public final void rule__DataInterchangeFileFixed__Group_3_1__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:6702:1: ( ( ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:6703:1: ( ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 ) )
+            {
+            // InternalDataDSL.g:6703:1: ( ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 ) )
+            // InternalDataDSL.g:6704:2: ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleAssignment_3_1_1()); 
+            }
+            // InternalDataDSL.g:6705:2: ( rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 )
+            // InternalDataDSL.g:6705:3: rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleAssignment_3_1_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__Group_3_1__1__Impl"
+
+
     // $ANTLR start "rule__DataInterchangeBean__Group__0"
-    // InternalDataDSL.g:6249:1: rule__DataInterchangeBean__Group__0 : rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1 ;
+    // InternalDataDSL.g:6714:1: rule__DataInterchangeBean__Group__0 : rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1 ;
     public final void rule__DataInterchangeBean__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6253:1: ( rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1 )
-            // InternalDataDSL.g:6254:2: rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1
+            // InternalDataDSL.g:6718:1: ( rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1 )
+            // InternalDataDSL.g:6719:2: rule__DataInterchangeBean__Group__0__Impl rule__DataInterchangeBean__Group__1
             {
-            pushFollow(FOLLOW_30);
+            pushFollow(FOLLOW_31);
             rule__DataInterchangeBean__Group__0__Impl();
 
             state._fsp--;
@@ -22302,23 +23974,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__0__Impl"
-    // InternalDataDSL.g:6261:1: rule__DataInterchangeBean__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:6726:1: rule__DataInterchangeBean__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeBean__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6265:1: ( ( () ) )
-            // InternalDataDSL.g:6266:1: ( () )
+            // InternalDataDSL.g:6730:1: ( ( () ) )
+            // InternalDataDSL.g:6731:1: ( () )
             {
-            // InternalDataDSL.g:6266:1: ( () )
-            // InternalDataDSL.g:6267:2: ()
+            // InternalDataDSL.g:6731:1: ( () )
+            // InternalDataDSL.g:6732:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getDataInterchangeBeanAction_0()); 
             }
-            // InternalDataDSL.g:6268:2: ()
-            // InternalDataDSL.g:6268:3: 
+            // InternalDataDSL.g:6733:2: ()
+            // InternalDataDSL.g:6733:3: 
             {
             }
 
@@ -22343,14 +24015,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__1"
-    // InternalDataDSL.g:6276:1: rule__DataInterchangeBean__Group__1 : rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2 ;
+    // InternalDataDSL.g:6741:1: rule__DataInterchangeBean__Group__1 : rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2 ;
     public final void rule__DataInterchangeBean__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6280:1: ( rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2 )
-            // InternalDataDSL.g:6281:2: rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2
+            // InternalDataDSL.g:6745:1: ( rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2 )
+            // InternalDataDSL.g:6746:2: rule__DataInterchangeBean__Group__1__Impl rule__DataInterchangeBean__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeBean__Group__1__Impl();
@@ -22381,22 +24053,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__1__Impl"
-    // InternalDataDSL.g:6288:1: rule__DataInterchangeBean__Group__1__Impl : ( 'entity' ) ;
+    // InternalDataDSL.g:6753:1: rule__DataInterchangeBean__Group__1__Impl : ( 'entity' ) ;
     public final void rule__DataInterchangeBean__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6292:1: ( ( 'entity' ) )
-            // InternalDataDSL.g:6293:1: ( 'entity' )
+            // InternalDataDSL.g:6757:1: ( ( 'entity' ) )
+            // InternalDataDSL.g:6758:1: ( 'entity' )
             {
-            // InternalDataDSL.g:6293:1: ( 'entity' )
-            // InternalDataDSL.g:6294:2: 'entity'
+            // InternalDataDSL.g:6758:1: ( 'entity' )
+            // InternalDataDSL.g:6759:2: 'entity'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getEntityKeyword_1()); 
             }
-            match(input,90,FOLLOW_2); if (state.failed) return ;
+            match(input,91,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeBeanAccess().getEntityKeyword_1()); 
             }
@@ -22422,16 +24094,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__2"
-    // InternalDataDSL.g:6303:1: rule__DataInterchangeBean__Group__2 : rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3 ;
+    // InternalDataDSL.g:6768:1: rule__DataInterchangeBean__Group__2 : rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3 ;
     public final void rule__DataInterchangeBean__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6307:1: ( rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3 )
-            // InternalDataDSL.g:6308:2: rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3
+            // InternalDataDSL.g:6772:1: ( rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3 )
+            // InternalDataDSL.g:6773:2: rule__DataInterchangeBean__Group__2__Impl rule__DataInterchangeBean__Group__3
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__2__Impl();
 
             state._fsp--;
@@ -22460,23 +24132,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__2__Impl"
-    // InternalDataDSL.g:6315:1: rule__DataInterchangeBean__Group__2__Impl : ( ( rule__DataInterchangeBean__EntityAssignment_2 ) ) ;
+    // InternalDataDSL.g:6780:1: rule__DataInterchangeBean__Group__2__Impl : ( ( rule__DataInterchangeBean__EntityAssignment_2 ) ) ;
     public final void rule__DataInterchangeBean__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6319:1: ( ( ( rule__DataInterchangeBean__EntityAssignment_2 ) ) )
-            // InternalDataDSL.g:6320:1: ( ( rule__DataInterchangeBean__EntityAssignment_2 ) )
+            // InternalDataDSL.g:6784:1: ( ( ( rule__DataInterchangeBean__EntityAssignment_2 ) ) )
+            // InternalDataDSL.g:6785:1: ( ( rule__DataInterchangeBean__EntityAssignment_2 ) )
             {
-            // InternalDataDSL.g:6320:1: ( ( rule__DataInterchangeBean__EntityAssignment_2 ) )
-            // InternalDataDSL.g:6321:2: ( rule__DataInterchangeBean__EntityAssignment_2 )
+            // InternalDataDSL.g:6785:1: ( ( rule__DataInterchangeBean__EntityAssignment_2 ) )
+            // InternalDataDSL.g:6786:2: ( rule__DataInterchangeBean__EntityAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getEntityAssignment_2()); 
             }
-            // InternalDataDSL.g:6322:2: ( rule__DataInterchangeBean__EntityAssignment_2 )
-            // InternalDataDSL.g:6322:3: rule__DataInterchangeBean__EntityAssignment_2
+            // InternalDataDSL.g:6787:2: ( rule__DataInterchangeBean__EntityAssignment_2 )
+            // InternalDataDSL.g:6787:3: rule__DataInterchangeBean__EntityAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__EntityAssignment_2();
@@ -22511,16 +24183,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__3"
-    // InternalDataDSL.g:6330:1: rule__DataInterchangeBean__Group__3 : rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4 ;
+    // InternalDataDSL.g:6795:1: rule__DataInterchangeBean__Group__3 : rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4 ;
     public final void rule__DataInterchangeBean__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6334:1: ( rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4 )
-            // InternalDataDSL.g:6335:2: rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4
+            // InternalDataDSL.g:6799:1: ( rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4 )
+            // InternalDataDSL.g:6800:2: rule__DataInterchangeBean__Group__3__Impl rule__DataInterchangeBean__Group__4
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__3__Impl();
 
             state._fsp--;
@@ -22549,31 +24221,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__3__Impl"
-    // InternalDataDSL.g:6342:1: rule__DataInterchangeBean__Group__3__Impl : ( ( rule__DataInterchangeBean__Group_3__0 )? ) ;
+    // InternalDataDSL.g:6807:1: rule__DataInterchangeBean__Group__3__Impl : ( ( rule__DataInterchangeBean__Group_3__0 )? ) ;
     public final void rule__DataInterchangeBean__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6346:1: ( ( ( rule__DataInterchangeBean__Group_3__0 )? ) )
-            // InternalDataDSL.g:6347:1: ( ( rule__DataInterchangeBean__Group_3__0 )? )
+            // InternalDataDSL.g:6811:1: ( ( ( rule__DataInterchangeBean__Group_3__0 )? ) )
+            // InternalDataDSL.g:6812:1: ( ( rule__DataInterchangeBean__Group_3__0 )? )
             {
-            // InternalDataDSL.g:6347:1: ( ( rule__DataInterchangeBean__Group_3__0 )? )
-            // InternalDataDSL.g:6348:2: ( rule__DataInterchangeBean__Group_3__0 )?
+            // InternalDataDSL.g:6812:1: ( ( rule__DataInterchangeBean__Group_3__0 )? )
+            // InternalDataDSL.g:6813:2: ( rule__DataInterchangeBean__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:6349:2: ( rule__DataInterchangeBean__Group_3__0 )?
-            int alt69=2;
-            int LA69_0 = input.LA(1);
+            // InternalDataDSL.g:6814:2: ( rule__DataInterchangeBean__Group_3__0 )?
+            int alt72=2;
+            int LA72_0 = input.LA(1);
 
-            if ( (LA69_0==91) ) {
-                alt69=1;
+            if ( (LA72_0==92) ) {
+                alt72=1;
             }
-            switch (alt69) {
+            switch (alt72) {
                 case 1 :
-                    // InternalDataDSL.g:6349:3: rule__DataInterchangeBean__Group_3__0
+                    // InternalDataDSL.g:6814:3: rule__DataInterchangeBean__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBean__Group_3__0();
@@ -22611,16 +24283,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__4"
-    // InternalDataDSL.g:6357:1: rule__DataInterchangeBean__Group__4 : rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5 ;
+    // InternalDataDSL.g:6822:1: rule__DataInterchangeBean__Group__4 : rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5 ;
     public final void rule__DataInterchangeBean__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6361:1: ( rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5 )
-            // InternalDataDSL.g:6362:2: rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5
+            // InternalDataDSL.g:6826:1: ( rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5 )
+            // InternalDataDSL.g:6827:2: rule__DataInterchangeBean__Group__4__Impl rule__DataInterchangeBean__Group__5
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__4__Impl();
 
             state._fsp--;
@@ -22649,31 +24321,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__4__Impl"
-    // InternalDataDSL.g:6369:1: rule__DataInterchangeBean__Group__4__Impl : ( ( rule__DataInterchangeBean__Group_4__0 )? ) ;
+    // InternalDataDSL.g:6834:1: rule__DataInterchangeBean__Group__4__Impl : ( ( rule__DataInterchangeBean__Group_4__0 )? ) ;
     public final void rule__DataInterchangeBean__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6373:1: ( ( ( rule__DataInterchangeBean__Group_4__0 )? ) )
-            // InternalDataDSL.g:6374:1: ( ( rule__DataInterchangeBean__Group_4__0 )? )
+            // InternalDataDSL.g:6838:1: ( ( ( rule__DataInterchangeBean__Group_4__0 )? ) )
+            // InternalDataDSL.g:6839:1: ( ( rule__DataInterchangeBean__Group_4__0 )? )
             {
-            // InternalDataDSL.g:6374:1: ( ( rule__DataInterchangeBean__Group_4__0 )? )
-            // InternalDataDSL.g:6375:2: ( rule__DataInterchangeBean__Group_4__0 )?
+            // InternalDataDSL.g:6839:1: ( ( rule__DataInterchangeBean__Group_4__0 )? )
+            // InternalDataDSL.g:6840:2: ( rule__DataInterchangeBean__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_4()); 
             }
-            // InternalDataDSL.g:6376:2: ( rule__DataInterchangeBean__Group_4__0 )?
-            int alt70=2;
-            int LA70_0 = input.LA(1);
+            // InternalDataDSL.g:6841:2: ( rule__DataInterchangeBean__Group_4__0 )?
+            int alt73=2;
+            int LA73_0 = input.LA(1);
 
-            if ( (LA70_0==92) ) {
-                alt70=1;
+            if ( (LA73_0==93) ) {
+                alt73=1;
             }
-            switch (alt70) {
+            switch (alt73) {
                 case 1 :
-                    // InternalDataDSL.g:6376:3: rule__DataInterchangeBean__Group_4__0
+                    // InternalDataDSL.g:6841:3: rule__DataInterchangeBean__Group_4__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBean__Group_4__0();
@@ -22711,16 +24383,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__5"
-    // InternalDataDSL.g:6384:1: rule__DataInterchangeBean__Group__5 : rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6 ;
+    // InternalDataDSL.g:6849:1: rule__DataInterchangeBean__Group__5 : rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6 ;
     public final void rule__DataInterchangeBean__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6388:1: ( rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6 )
-            // InternalDataDSL.g:6389:2: rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6
+            // InternalDataDSL.g:6853:1: ( rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6 )
+            // InternalDataDSL.g:6854:2: rule__DataInterchangeBean__Group__5__Impl rule__DataInterchangeBean__Group__6
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__5__Impl();
 
             state._fsp--;
@@ -22749,31 +24421,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__5__Impl"
-    // InternalDataDSL.g:6396:1: rule__DataInterchangeBean__Group__5__Impl : ( ( rule__DataInterchangeBean__Group_5__0 )? ) ;
+    // InternalDataDSL.g:6861:1: rule__DataInterchangeBean__Group__5__Impl : ( ( rule__DataInterchangeBean__Group_5__0 )? ) ;
     public final void rule__DataInterchangeBean__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6400:1: ( ( ( rule__DataInterchangeBean__Group_5__0 )? ) )
-            // InternalDataDSL.g:6401:1: ( ( rule__DataInterchangeBean__Group_5__0 )? )
+            // InternalDataDSL.g:6865:1: ( ( ( rule__DataInterchangeBean__Group_5__0 )? ) )
+            // InternalDataDSL.g:6866:1: ( ( rule__DataInterchangeBean__Group_5__0 )? )
             {
-            // InternalDataDSL.g:6401:1: ( ( rule__DataInterchangeBean__Group_5__0 )? )
-            // InternalDataDSL.g:6402:2: ( rule__DataInterchangeBean__Group_5__0 )?
+            // InternalDataDSL.g:6866:1: ( ( rule__DataInterchangeBean__Group_5__0 )? )
+            // InternalDataDSL.g:6867:2: ( rule__DataInterchangeBean__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_5()); 
             }
-            // InternalDataDSL.g:6403:2: ( rule__DataInterchangeBean__Group_5__0 )?
-            int alt71=2;
-            int LA71_0 = input.LA(1);
+            // InternalDataDSL.g:6868:2: ( rule__DataInterchangeBean__Group_5__0 )?
+            int alt74=2;
+            int LA74_0 = input.LA(1);
 
-            if ( (LA71_0==155) ) {
-                alt71=1;
+            if ( (LA74_0==94) ) {
+                alt74=1;
             }
-            switch (alt71) {
+            switch (alt74) {
                 case 1 :
-                    // InternalDataDSL.g:6403:3: rule__DataInterchangeBean__Group_5__0
+                    // InternalDataDSL.g:6868:3: rule__DataInterchangeBean__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBean__Group_5__0();
@@ -22811,16 +24483,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__6"
-    // InternalDataDSL.g:6411:1: rule__DataInterchangeBean__Group__6 : rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7 ;
+    // InternalDataDSL.g:6876:1: rule__DataInterchangeBean__Group__6 : rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7 ;
     public final void rule__DataInterchangeBean__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6415:1: ( rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7 )
-            // InternalDataDSL.g:6416:2: rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7
+            // InternalDataDSL.g:6880:1: ( rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7 )
+            // InternalDataDSL.g:6881:2: rule__DataInterchangeBean__Group__6__Impl rule__DataInterchangeBean__Group__7
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__6__Impl();
 
             state._fsp--;
@@ -22849,31 +24521,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__6__Impl"
-    // InternalDataDSL.g:6423:1: rule__DataInterchangeBean__Group__6__Impl : ( ( rule__DataInterchangeBean__Group_6__0 )? ) ;
+    // InternalDataDSL.g:6888:1: rule__DataInterchangeBean__Group__6__Impl : ( ( rule__DataInterchangeBean__Group_6__0 )? ) ;
     public final void rule__DataInterchangeBean__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6427:1: ( ( ( rule__DataInterchangeBean__Group_6__0 )? ) )
-            // InternalDataDSL.g:6428:1: ( ( rule__DataInterchangeBean__Group_6__0 )? )
+            // InternalDataDSL.g:6892:1: ( ( ( rule__DataInterchangeBean__Group_6__0 )? ) )
+            // InternalDataDSL.g:6893:1: ( ( rule__DataInterchangeBean__Group_6__0 )? )
             {
-            // InternalDataDSL.g:6428:1: ( ( rule__DataInterchangeBean__Group_6__0 )? )
-            // InternalDataDSL.g:6429:2: ( rule__DataInterchangeBean__Group_6__0 )?
+            // InternalDataDSL.g:6893:1: ( ( rule__DataInterchangeBean__Group_6__0 )? )
+            // InternalDataDSL.g:6894:2: ( rule__DataInterchangeBean__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_6()); 
             }
-            // InternalDataDSL.g:6430:2: ( rule__DataInterchangeBean__Group_6__0 )?
-            int alt72=2;
-            int LA72_0 = input.LA(1);
+            // InternalDataDSL.g:6895:2: ( rule__DataInterchangeBean__Group_6__0 )?
+            int alt75=2;
+            int LA75_0 = input.LA(1);
 
-            if ( (LA72_0==156) ) {
-                alt72=1;
+            if ( (LA75_0==161) ) {
+                alt75=1;
             }
-            switch (alt72) {
+            switch (alt75) {
                 case 1 :
-                    // InternalDataDSL.g:6430:3: rule__DataInterchangeBean__Group_6__0
+                    // InternalDataDSL.g:6895:3: rule__DataInterchangeBean__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBean__Group_6__0();
@@ -22911,16 +24583,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__7"
-    // InternalDataDSL.g:6438:1: rule__DataInterchangeBean__Group__7 : rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8 ;
+    // InternalDataDSL.g:6903:1: rule__DataInterchangeBean__Group__7 : rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8 ;
     public final void rule__DataInterchangeBean__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6442:1: ( rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8 )
-            // InternalDataDSL.g:6443:2: rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8
+            // InternalDataDSL.g:6907:1: ( rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8 )
+            // InternalDataDSL.g:6908:2: rule__DataInterchangeBean__Group__7__Impl rule__DataInterchangeBean__Group__8
             {
-            pushFollow(FOLLOW_31);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group__7__Impl();
 
             state._fsp--;
@@ -22949,31 +24621,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__7__Impl"
-    // InternalDataDSL.g:6450:1: rule__DataInterchangeBean__Group__7__Impl : ( ( rule__DataInterchangeBean__Group_7__0 )? ) ;
+    // InternalDataDSL.g:6915:1: rule__DataInterchangeBean__Group__7__Impl : ( ( rule__DataInterchangeBean__Group_7__0 )? ) ;
     public final void rule__DataInterchangeBean__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6454:1: ( ( ( rule__DataInterchangeBean__Group_7__0 )? ) )
-            // InternalDataDSL.g:6455:1: ( ( rule__DataInterchangeBean__Group_7__0 )? )
+            // InternalDataDSL.g:6919:1: ( ( ( rule__DataInterchangeBean__Group_7__0 )? ) )
+            // InternalDataDSL.g:6920:1: ( ( rule__DataInterchangeBean__Group_7__0 )? )
             {
-            // InternalDataDSL.g:6455:1: ( ( rule__DataInterchangeBean__Group_7__0 )? )
-            // InternalDataDSL.g:6456:2: ( rule__DataInterchangeBean__Group_7__0 )?
+            // InternalDataDSL.g:6920:1: ( ( rule__DataInterchangeBean__Group_7__0 )? )
+            // InternalDataDSL.g:6921:2: ( rule__DataInterchangeBean__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_7()); 
             }
-            // InternalDataDSL.g:6457:2: ( rule__DataInterchangeBean__Group_7__0 )?
-            int alt73=2;
-            int LA73_0 = input.LA(1);
+            // InternalDataDSL.g:6922:2: ( rule__DataInterchangeBean__Group_7__0 )?
+            int alt76=2;
+            int LA76_0 = input.LA(1);
 
-            if ( (LA73_0==93) ) {
-                alt73=1;
+            if ( (LA76_0==162) ) {
+                alt76=1;
             }
-            switch (alt73) {
+            switch (alt76) {
                 case 1 :
-                    // InternalDataDSL.g:6457:3: rule__DataInterchangeBean__Group_7__0
+                    // InternalDataDSL.g:6922:3: rule__DataInterchangeBean__Group_7__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBean__Group_7__0();
@@ -23011,22 +24683,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__8"
-    // InternalDataDSL.g:6465:1: rule__DataInterchangeBean__Group__8 : rule__DataInterchangeBean__Group__8__Impl rule__DataInterchangeBean__Group__9 ;
+    // InternalDataDSL.g:6930:1: rule__DataInterchangeBean__Group__8 : rule__DataInterchangeBean__Group__8__Impl ;
     public final void rule__DataInterchangeBean__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6469:1: ( rule__DataInterchangeBean__Group__8__Impl rule__DataInterchangeBean__Group__9 )
-            // InternalDataDSL.g:6470:2: rule__DataInterchangeBean__Group__8__Impl rule__DataInterchangeBean__Group__9
+            // InternalDataDSL.g:6934:1: ( rule__DataInterchangeBean__Group__8__Impl )
+            // InternalDataDSL.g:6935:2: rule__DataInterchangeBean__Group__8__Impl
             {
-            pushFollow(FOLLOW_31);
-            rule__DataInterchangeBean__Group__8__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__9();
+            rule__DataInterchangeBean__Group__8__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -23049,40 +24716,29 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group__8__Impl"
-    // InternalDataDSL.g:6477:1: rule__DataInterchangeBean__Group__8__Impl : ( ( rule__DataInterchangeBean__Group_8__0 )? ) ;
+    // InternalDataDSL.g:6941:1: rule__DataInterchangeBean__Group__8__Impl : ( ( rule__DataInterchangeBean__Group_8__0 ) ) ;
     public final void rule__DataInterchangeBean__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6481:1: ( ( ( rule__DataInterchangeBean__Group_8__0 )? ) )
-            // InternalDataDSL.g:6482:1: ( ( rule__DataInterchangeBean__Group_8__0 )? )
+            // InternalDataDSL.g:6945:1: ( ( ( rule__DataInterchangeBean__Group_8__0 ) ) )
+            // InternalDataDSL.g:6946:1: ( ( rule__DataInterchangeBean__Group_8__0 ) )
             {
-            // InternalDataDSL.g:6482:1: ( ( rule__DataInterchangeBean__Group_8__0 )? )
-            // InternalDataDSL.g:6483:2: ( rule__DataInterchangeBean__Group_8__0 )?
+            // InternalDataDSL.g:6946:1: ( ( rule__DataInterchangeBean__Group_8__0 ) )
+            // InternalDataDSL.g:6947:2: ( rule__DataInterchangeBean__Group_8__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8()); 
             }
-            // InternalDataDSL.g:6484:2: ( rule__DataInterchangeBean__Group_8__0 )?
-            int alt74=2;
-            int LA74_0 = input.LA(1);
+            // InternalDataDSL.g:6948:2: ( rule__DataInterchangeBean__Group_8__0 )
+            // InternalDataDSL.g:6948:3: rule__DataInterchangeBean__Group_8__0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8__0();
 
-            if ( (LA74_0==94) ) {
-                alt74=1;
-            }
-            switch (alt74) {
-                case 1 :
-                    // InternalDataDSL.g:6484:3: rule__DataInterchangeBean__Group_8__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_8__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
+            state._fsp--;
+            if (state.failed) return ;
 
             }
 
@@ -23110,512 +24766,17 @@
     // $ANTLR end "rule__DataInterchangeBean__Group__8__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group__9"
-    // InternalDataDSL.g:6492:1: rule__DataInterchangeBean__Group__9 : rule__DataInterchangeBean__Group__9__Impl rule__DataInterchangeBean__Group__10 ;
-    public final void rule__DataInterchangeBean__Group__9() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6496:1: ( rule__DataInterchangeBean__Group__9__Impl rule__DataInterchangeBean__Group__10 )
-            // InternalDataDSL.g:6497:2: rule__DataInterchangeBean__Group__9__Impl rule__DataInterchangeBean__Group__10
-            {
-            pushFollow(FOLLOW_31);
-            rule__DataInterchangeBean__Group__9__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__10();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__9"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__9__Impl"
-    // InternalDataDSL.g:6504:1: rule__DataInterchangeBean__Group__9__Impl : ( ( rule__DataInterchangeBean__Group_9__0 )? ) ;
-    public final void rule__DataInterchangeBean__Group__9__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6508:1: ( ( ( rule__DataInterchangeBean__Group_9__0 )? ) )
-            // InternalDataDSL.g:6509:1: ( ( rule__DataInterchangeBean__Group_9__0 )? )
-            {
-            // InternalDataDSL.g:6509:1: ( ( rule__DataInterchangeBean__Group_9__0 )? )
-            // InternalDataDSL.g:6510:2: ( rule__DataInterchangeBean__Group_9__0 )?
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_9()); 
-            }
-            // InternalDataDSL.g:6511:2: ( rule__DataInterchangeBean__Group_9__0 )?
-            int alt75=2;
-            int LA75_0 = input.LA(1);
-
-            if ( (LA75_0==95) ) {
-                alt75=1;
-            }
-            switch (alt75) {
-                case 1 :
-                    // InternalDataDSL.g:6511:3: rule__DataInterchangeBean__Group_9__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_9__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_9()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__9__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__10"
-    // InternalDataDSL.g:6519:1: rule__DataInterchangeBean__Group__10 : rule__DataInterchangeBean__Group__10__Impl rule__DataInterchangeBean__Group__11 ;
-    public final void rule__DataInterchangeBean__Group__10() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6523:1: ( rule__DataInterchangeBean__Group__10__Impl rule__DataInterchangeBean__Group__11 )
-            // InternalDataDSL.g:6524:2: rule__DataInterchangeBean__Group__10__Impl rule__DataInterchangeBean__Group__11
-            {
-            pushFollow(FOLLOW_31);
-            rule__DataInterchangeBean__Group__10__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__11();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__10"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__10__Impl"
-    // InternalDataDSL.g:6531:1: rule__DataInterchangeBean__Group__10__Impl : ( ( rule__DataInterchangeBean__Group_10__0 )? ) ;
-    public final void rule__DataInterchangeBean__Group__10__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6535:1: ( ( ( rule__DataInterchangeBean__Group_10__0 )? ) )
-            // InternalDataDSL.g:6536:1: ( ( rule__DataInterchangeBean__Group_10__0 )? )
-            {
-            // InternalDataDSL.g:6536:1: ( ( rule__DataInterchangeBean__Group_10__0 )? )
-            // InternalDataDSL.g:6537:2: ( rule__DataInterchangeBean__Group_10__0 )?
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_10()); 
-            }
-            // InternalDataDSL.g:6538:2: ( rule__DataInterchangeBean__Group_10__0 )?
-            int alt76=2;
-            int LA76_0 = input.LA(1);
-
-            if ( (LA76_0==96) ) {
-                alt76=1;
-            }
-            switch (alt76) {
-                case 1 :
-                    // InternalDataDSL.g:6538:3: rule__DataInterchangeBean__Group_10__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_10__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_10()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__10__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__11"
-    // InternalDataDSL.g:6546:1: rule__DataInterchangeBean__Group__11 : rule__DataInterchangeBean__Group__11__Impl rule__DataInterchangeBean__Group__12 ;
-    public final void rule__DataInterchangeBean__Group__11() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6550:1: ( rule__DataInterchangeBean__Group__11__Impl rule__DataInterchangeBean__Group__12 )
-            // InternalDataDSL.g:6551:2: rule__DataInterchangeBean__Group__11__Impl rule__DataInterchangeBean__Group__12
-            {
-            pushFollow(FOLLOW_31);
-            rule__DataInterchangeBean__Group__11__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__12();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__11"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__11__Impl"
-    // InternalDataDSL.g:6558:1: rule__DataInterchangeBean__Group__11__Impl : ( ( rule__DataInterchangeBean__Group_11__0 )? ) ;
-    public final void rule__DataInterchangeBean__Group__11__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6562:1: ( ( ( rule__DataInterchangeBean__Group_11__0 )? ) )
-            // InternalDataDSL.g:6563:1: ( ( rule__DataInterchangeBean__Group_11__0 )? )
-            {
-            // InternalDataDSL.g:6563:1: ( ( rule__DataInterchangeBean__Group_11__0 )? )
-            // InternalDataDSL.g:6564:2: ( rule__DataInterchangeBean__Group_11__0 )?
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_11()); 
-            }
-            // InternalDataDSL.g:6565:2: ( rule__DataInterchangeBean__Group_11__0 )?
-            int alt77=2;
-            int LA77_0 = input.LA(1);
-
-            if ( (LA77_0==97) ) {
-                alt77=1;
-            }
-            switch (alt77) {
-                case 1 :
-                    // InternalDataDSL.g:6565:3: rule__DataInterchangeBean__Group_11__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_11__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_11()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__11__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__12"
-    // InternalDataDSL.g:6573:1: rule__DataInterchangeBean__Group__12 : rule__DataInterchangeBean__Group__12__Impl rule__DataInterchangeBean__Group__13 ;
-    public final void rule__DataInterchangeBean__Group__12() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6577:1: ( rule__DataInterchangeBean__Group__12__Impl rule__DataInterchangeBean__Group__13 )
-            // InternalDataDSL.g:6578:2: rule__DataInterchangeBean__Group__12__Impl rule__DataInterchangeBean__Group__13
-            {
-            pushFollow(FOLLOW_31);
-            rule__DataInterchangeBean__Group__12__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__13();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__12"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__12__Impl"
-    // InternalDataDSL.g:6585:1: rule__DataInterchangeBean__Group__12__Impl : ( ( rule__DataInterchangeBean__Group_12__0 )? ) ;
-    public final void rule__DataInterchangeBean__Group__12__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6589:1: ( ( ( rule__DataInterchangeBean__Group_12__0 )? ) )
-            // InternalDataDSL.g:6590:1: ( ( rule__DataInterchangeBean__Group_12__0 )? )
-            {
-            // InternalDataDSL.g:6590:1: ( ( rule__DataInterchangeBean__Group_12__0 )? )
-            // InternalDataDSL.g:6591:2: ( rule__DataInterchangeBean__Group_12__0 )?
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_12()); 
-            }
-            // InternalDataDSL.g:6592:2: ( rule__DataInterchangeBean__Group_12__0 )?
-            int alt78=2;
-            int LA78_0 = input.LA(1);
-
-            if ( (LA78_0==98) ) {
-                alt78=1;
-            }
-            switch (alt78) {
-                case 1 :
-                    // InternalDataDSL.g:6592:3: rule__DataInterchangeBean__Group_12__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_12__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_12()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__12__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__13"
-    // InternalDataDSL.g:6600:1: rule__DataInterchangeBean__Group__13 : rule__DataInterchangeBean__Group__13__Impl ;
-    public final void rule__DataInterchangeBean__Group__13() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6604:1: ( rule__DataInterchangeBean__Group__13__Impl )
-            // InternalDataDSL.g:6605:2: rule__DataInterchangeBean__Group__13__Impl
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group__13__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__13"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group__13__Impl"
-    // InternalDataDSL.g:6611:1: rule__DataInterchangeBean__Group__13__Impl : ( ( rule__DataInterchangeBean__Group_13__0 )? ) ;
-    public final void rule__DataInterchangeBean__Group__13__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6615:1: ( ( ( rule__DataInterchangeBean__Group_13__0 )? ) )
-            // InternalDataDSL.g:6616:1: ( ( rule__DataInterchangeBean__Group_13__0 )? )
-            {
-            // InternalDataDSL.g:6616:1: ( ( rule__DataInterchangeBean__Group_13__0 )? )
-            // InternalDataDSL.g:6617:2: ( rule__DataInterchangeBean__Group_13__0 )?
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_13()); 
-            }
-            // InternalDataDSL.g:6618:2: ( rule__DataInterchangeBean__Group_13__0 )?
-            int alt79=2;
-            int LA79_0 = input.LA(1);
-
-            if ( (LA79_0==99) ) {
-                alt79=1;
-            }
-            switch (alt79) {
-                case 1 :
-                    // InternalDataDSL.g:6618:3: rule__DataInterchangeBean__Group_13__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeBean__Group_13__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_13()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group__13__Impl"
-
-
     // $ANTLR start "rule__DataInterchangeBean__Group_3__0"
-    // InternalDataDSL.g:6627:1: rule__DataInterchangeBean__Group_3__0 : rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1 ;
+    // InternalDataDSL.g:6957:1: rule__DataInterchangeBean__Group_3__0 : rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1 ;
     public final void rule__DataInterchangeBean__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6631:1: ( rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1 )
-            // InternalDataDSL.g:6632:2: rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1
+            // InternalDataDSL.g:6961:1: ( rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1 )
+            // InternalDataDSL.g:6962:2: rule__DataInterchangeBean__Group_3__0__Impl rule__DataInterchangeBean__Group_3__1
             {
-            pushFollow(FOLLOW_21);
+            pushFollow(FOLLOW_7);
             rule__DataInterchangeBean__Group_3__0__Impl();
 
             state._fsp--;
@@ -23644,24 +24805,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_3__0__Impl"
-    // InternalDataDSL.g:6639:1: rule__DataInterchangeBean__Group_3__0__Impl : ( 'nodeName' ) ;
+    // InternalDataDSL.g:6969:1: rule__DataInterchangeBean__Group_3__0__Impl : ( 'referencedBy' ) ;
     public final void rule__DataInterchangeBean__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6643:1: ( ( 'nodeName' ) )
-            // InternalDataDSL.g:6644:1: ( 'nodeName' )
+            // InternalDataDSL.g:6973:1: ( ( 'referencedBy' ) )
+            // InternalDataDSL.g:6974:1: ( 'referencedBy' )
             {
-            // InternalDataDSL.g:6644:1: ( 'nodeName' )
-            // InternalDataDSL.g:6645:2: 'nodeName'
+            // InternalDataDSL.g:6974:1: ( 'referencedBy' )
+            // InternalDataDSL.g:6975:2: 'referencedBy'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0()); 
             }
-            match(input,91,FOLLOW_2); if (state.failed) return ;
+            match(input,92,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0()); 
             }
 
             }
@@ -23685,14 +24846,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_3__1"
-    // InternalDataDSL.g:6654:1: rule__DataInterchangeBean__Group_3__1 : rule__DataInterchangeBean__Group_3__1__Impl ;
+    // InternalDataDSL.g:6984:1: rule__DataInterchangeBean__Group_3__1 : rule__DataInterchangeBean__Group_3__1__Impl ;
     public final void rule__DataInterchangeBean__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6658:1: ( rule__DataInterchangeBean__Group_3__1__Impl )
-            // InternalDataDSL.g:6659:2: rule__DataInterchangeBean__Group_3__1__Impl
+            // InternalDataDSL.g:6988:1: ( rule__DataInterchangeBean__Group_3__1__Impl )
+            // InternalDataDSL.g:6989:2: rule__DataInterchangeBean__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__Group_3__1__Impl();
@@ -23718,26 +24879,26 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_3__1__Impl"
-    // InternalDataDSL.g:6665:1: rule__DataInterchangeBean__Group_3__1__Impl : ( ( rule__DataInterchangeBean__NodeNameAssignment_3_1 ) ) ;
+    // InternalDataDSL.g:6995:1: rule__DataInterchangeBean__Group_3__1__Impl : ( ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 ) ) ;
     public final void rule__DataInterchangeBean__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6669:1: ( ( ( rule__DataInterchangeBean__NodeNameAssignment_3_1 ) ) )
-            // InternalDataDSL.g:6670:1: ( ( rule__DataInterchangeBean__NodeNameAssignment_3_1 ) )
+            // InternalDataDSL.g:6999:1: ( ( ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 ) ) )
+            // InternalDataDSL.g:7000:1: ( ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:6670:1: ( ( rule__DataInterchangeBean__NodeNameAssignment_3_1 ) )
-            // InternalDataDSL.g:6671:2: ( rule__DataInterchangeBean__NodeNameAssignment_3_1 )
+            // InternalDataDSL.g:7000:1: ( ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 ) )
+            // InternalDataDSL.g:7001:2: ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_3_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceAssignment_3_1()); 
             }
-            // InternalDataDSL.g:6672:2: ( rule__DataInterchangeBean__NodeNameAssignment_3_1 )
-            // InternalDataDSL.g:6672:3: rule__DataInterchangeBean__NodeNameAssignment_3_1
+            // InternalDataDSL.g:7002:2: ( rule__DataInterchangeBean__RefDataSourceAssignment_3_1 )
+            // InternalDataDSL.g:7002:3: rule__DataInterchangeBean__RefDataSourceAssignment_3_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__NodeNameAssignment_3_1();
+            rule__DataInterchangeBean__RefDataSourceAssignment_3_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -23745,7 +24906,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_3_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceAssignment_3_1()); 
             }
 
             }
@@ -23769,14 +24930,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_4__0"
-    // InternalDataDSL.g:6681:1: rule__DataInterchangeBean__Group_4__0 : rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1 ;
+    // InternalDataDSL.g:7011:1: rule__DataInterchangeBean__Group_4__0 : rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1 ;
     public final void rule__DataInterchangeBean__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6685:1: ( rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1 )
-            // InternalDataDSL.g:6686:2: rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1
+            // InternalDataDSL.g:7015:1: ( rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1 )
+            // InternalDataDSL.g:7016:2: rule__DataInterchangeBean__Group_4__0__Impl rule__DataInterchangeBean__Group_4__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeBean__Group_4__0__Impl();
@@ -23807,24 +24968,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_4__0__Impl"
-    // InternalDataDSL.g:6693:1: rule__DataInterchangeBean__Group_4__0__Impl : ( 'createOn' ) ;
+    // InternalDataDSL.g:7023:1: rule__DataInterchangeBean__Group_4__0__Impl : ( 'nodeName' ) ;
     public final void rule__DataInterchangeBean__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6697:1: ( ( 'createOn' ) )
-            // InternalDataDSL.g:6698:1: ( 'createOn' )
+            // InternalDataDSL.g:7027:1: ( ( 'nodeName' ) )
+            // InternalDataDSL.g:7028:1: ( 'nodeName' )
             {
-            // InternalDataDSL.g:6698:1: ( 'createOn' )
-            // InternalDataDSL.g:6699:2: 'createOn'
+            // InternalDataDSL.g:7028:1: ( 'nodeName' )
+            // InternalDataDSL.g:7029:2: 'nodeName'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0()); 
             }
-            match(input,92,FOLLOW_2); if (state.failed) return ;
+            match(input,93,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0()); 
             }
 
             }
@@ -23848,14 +25009,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_4__1"
-    // InternalDataDSL.g:6708:1: rule__DataInterchangeBean__Group_4__1 : rule__DataInterchangeBean__Group_4__1__Impl ;
+    // InternalDataDSL.g:7038:1: rule__DataInterchangeBean__Group_4__1 : rule__DataInterchangeBean__Group_4__1__Impl ;
     public final void rule__DataInterchangeBean__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6712:1: ( rule__DataInterchangeBean__Group_4__1__Impl )
-            // InternalDataDSL.g:6713:2: rule__DataInterchangeBean__Group_4__1__Impl
+            // InternalDataDSL.g:7042:1: ( rule__DataInterchangeBean__Group_4__1__Impl )
+            // InternalDataDSL.g:7043:2: rule__DataInterchangeBean__Group_4__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__Group_4__1__Impl();
@@ -23881,26 +25042,26 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_4__1__Impl"
-    // InternalDataDSL.g:6719:1: rule__DataInterchangeBean__Group_4__1__Impl : ( ( rule__DataInterchangeBean__ElementMapAssignment_4_1 ) ) ;
+    // InternalDataDSL.g:7049:1: rule__DataInterchangeBean__Group_4__1__Impl : ( ( rule__DataInterchangeBean__NodeNameAssignment_4_1 ) ) ;
     public final void rule__DataInterchangeBean__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6723:1: ( ( ( rule__DataInterchangeBean__ElementMapAssignment_4_1 ) ) )
-            // InternalDataDSL.g:6724:1: ( ( rule__DataInterchangeBean__ElementMapAssignment_4_1 ) )
+            // InternalDataDSL.g:7053:1: ( ( ( rule__DataInterchangeBean__NodeNameAssignment_4_1 ) ) )
+            // InternalDataDSL.g:7054:1: ( ( rule__DataInterchangeBean__NodeNameAssignment_4_1 ) )
             {
-            // InternalDataDSL.g:6724:1: ( ( rule__DataInterchangeBean__ElementMapAssignment_4_1 ) )
-            // InternalDataDSL.g:6725:2: ( rule__DataInterchangeBean__ElementMapAssignment_4_1 )
+            // InternalDataDSL.g:7054:1: ( ( rule__DataInterchangeBean__NodeNameAssignment_4_1 ) )
+            // InternalDataDSL.g:7055:2: ( rule__DataInterchangeBean__NodeNameAssignment_4_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_4_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_4_1()); 
             }
-            // InternalDataDSL.g:6726:2: ( rule__DataInterchangeBean__ElementMapAssignment_4_1 )
-            // InternalDataDSL.g:6726:3: rule__DataInterchangeBean__ElementMapAssignment_4_1
+            // InternalDataDSL.g:7056:2: ( rule__DataInterchangeBean__NodeNameAssignment_4_1 )
+            // InternalDataDSL.g:7056:3: rule__DataInterchangeBean__NodeNameAssignment_4_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__ElementMapAssignment_4_1();
+            rule__DataInterchangeBean__NodeNameAssignment_4_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -23908,7 +25069,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_4_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameAssignment_4_1()); 
             }
 
             }
@@ -23932,16 +25093,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_5__0"
-    // InternalDataDSL.g:6735:1: rule__DataInterchangeBean__Group_5__0 : rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1 ;
+    // InternalDataDSL.g:7065:1: rule__DataInterchangeBean__Group_5__0 : rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1 ;
     public final void rule__DataInterchangeBean__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6739:1: ( rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1 )
-            // InternalDataDSL.g:6740:2: rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1
+            // InternalDataDSL.g:7069:1: ( rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1 )
+            // InternalDataDSL.g:7070:2: rule__DataInterchangeBean__Group_5__0__Impl rule__DataInterchangeBean__Group_5__1
             {
-            pushFollow(FOLLOW_7);
+            pushFollow(FOLLOW_21);
             rule__DataInterchangeBean__Group_5__0__Impl();
 
             state._fsp--;
@@ -23970,34 +25131,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_5__0__Impl"
-    // InternalDataDSL.g:6747:1: rule__DataInterchangeBean__Group_5__0__Impl : ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 ) ) ;
+    // InternalDataDSL.g:7077:1: rule__DataInterchangeBean__Group_5__0__Impl : ( 'createOn' ) ;
     public final void rule__DataInterchangeBean__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6751:1: ( ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 ) ) )
-            // InternalDataDSL.g:6752:1: ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 ) )
+            // InternalDataDSL.g:7081:1: ( ( 'createOn' ) )
+            // InternalDataDSL.g:7082:1: ( 'createOn' )
             {
-            // InternalDataDSL.g:6752:1: ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 ) )
-            // InternalDataDSL.g:6753:2: ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 )
+            // InternalDataDSL.g:7082:1: ( 'createOn' )
+            // InternalDataDSL.g:7083:2: 'createOn'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_5_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0()); 
             }
-            // InternalDataDSL.g:6754:2: ( rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 )
-            // InternalDataDSL.g:6754:3: rule__DataInterchangeBean__MarkLatestImportAssignment_5_0
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__MarkLatestImportAssignment_5_0();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
+            match(input,94,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_5_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0()); 
             }
 
             }
@@ -24021,14 +25172,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_5__1"
-    // InternalDataDSL.g:6762:1: rule__DataInterchangeBean__Group_5__1 : rule__DataInterchangeBean__Group_5__1__Impl ;
+    // InternalDataDSL.g:7092:1: rule__DataInterchangeBean__Group_5__1 : rule__DataInterchangeBean__Group_5__1__Impl ;
     public final void rule__DataInterchangeBean__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6766:1: ( rule__DataInterchangeBean__Group_5__1__Impl )
-            // InternalDataDSL.g:6767:2: rule__DataInterchangeBean__Group_5__1__Impl
+            // InternalDataDSL.g:7096:1: ( rule__DataInterchangeBean__Group_5__1__Impl )
+            // InternalDataDSL.g:7097:2: rule__DataInterchangeBean__Group_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__Group_5__1__Impl();
@@ -24054,26 +25205,26 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_5__1__Impl"
-    // InternalDataDSL.g:6773:1: rule__DataInterchangeBean__Group_5__1__Impl : ( ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 ) ) ;
+    // InternalDataDSL.g:7103:1: rule__DataInterchangeBean__Group_5__1__Impl : ( ( rule__DataInterchangeBean__ElementMapAssignment_5_1 ) ) ;
     public final void rule__DataInterchangeBean__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6777:1: ( ( ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 ) ) )
-            // InternalDataDSL.g:6778:1: ( ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 ) )
+            // InternalDataDSL.g:7107:1: ( ( ( rule__DataInterchangeBean__ElementMapAssignment_5_1 ) ) )
+            // InternalDataDSL.g:7108:1: ( ( rule__DataInterchangeBean__ElementMapAssignment_5_1 ) )
             {
-            // InternalDataDSL.g:6778:1: ( ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 ) )
-            // InternalDataDSL.g:6779:2: ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 )
+            // InternalDataDSL.g:7108:1: ( ( rule__DataInterchangeBean__ElementMapAssignment_5_1 ) )
+            // InternalDataDSL.g:7109:2: ( rule__DataInterchangeBean__ElementMapAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_5_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_5_1()); 
             }
-            // InternalDataDSL.g:6780:2: ( rule__DataInterchangeBean__LatestPropertyAssignment_5_1 )
-            // InternalDataDSL.g:6780:3: rule__DataInterchangeBean__LatestPropertyAssignment_5_1
+            // InternalDataDSL.g:7110:2: ( rule__DataInterchangeBean__ElementMapAssignment_5_1 )
+            // InternalDataDSL.g:7110:3: rule__DataInterchangeBean__ElementMapAssignment_5_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__LatestPropertyAssignment_5_1();
+            rule__DataInterchangeBean__ElementMapAssignment_5_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -24081,7 +25232,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_5_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getElementMapAssignment_5_1()); 
             }
 
             }
@@ -24105,14 +25256,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_6__0"
-    // InternalDataDSL.g:6789:1: rule__DataInterchangeBean__Group_6__0 : rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1 ;
+    // InternalDataDSL.g:7119:1: rule__DataInterchangeBean__Group_6__0 : rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1 ;
     public final void rule__DataInterchangeBean__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6793:1: ( rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1 )
-            // InternalDataDSL.g:6794:2: rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1
+            // InternalDataDSL.g:7123:1: ( rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1 )
+            // InternalDataDSL.g:7124:2: rule__DataInterchangeBean__Group_6__0__Impl rule__DataInterchangeBean__Group_6__1
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeBean__Group_6__0__Impl();
@@ -24143,26 +25294,26 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_6__0__Impl"
-    // InternalDataDSL.g:6801:1: rule__DataInterchangeBean__Group_6__0__Impl : ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 ) ) ;
+    // InternalDataDSL.g:7131:1: rule__DataInterchangeBean__Group_6__0__Impl : ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 ) ) ;
     public final void rule__DataInterchangeBean__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6805:1: ( ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 ) ) )
-            // InternalDataDSL.g:6806:1: ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 ) )
+            // InternalDataDSL.g:7135:1: ( ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 ) ) )
+            // InternalDataDSL.g:7136:1: ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 ) )
             {
-            // InternalDataDSL.g:6806:1: ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 ) )
-            // InternalDataDSL.g:6807:2: ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 )
+            // InternalDataDSL.g:7136:1: ( ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 ) )
+            // InternalDataDSL.g:7137:2: ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_6_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_6_0()); 
             }
-            // InternalDataDSL.g:6808:2: ( rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 )
-            // InternalDataDSL.g:6808:3: rule__DataInterchangeBean__MarkLatestExportAssignment_6_0
+            // InternalDataDSL.g:7138:2: ( rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 )
+            // InternalDataDSL.g:7138:3: rule__DataInterchangeBean__MarkLatestImportAssignment_6_0
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__MarkLatestExportAssignment_6_0();
+            rule__DataInterchangeBean__MarkLatestImportAssignment_6_0();
 
             state._fsp--;
             if (state.failed) return ;
@@ -24170,7 +25321,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_6_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportAssignment_6_0()); 
             }
 
             }
@@ -24194,14 +25345,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_6__1"
-    // InternalDataDSL.g:6816:1: rule__DataInterchangeBean__Group_6__1 : rule__DataInterchangeBean__Group_6__1__Impl ;
+    // InternalDataDSL.g:7146:1: rule__DataInterchangeBean__Group_6__1 : rule__DataInterchangeBean__Group_6__1__Impl ;
     public final void rule__DataInterchangeBean__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6820:1: ( rule__DataInterchangeBean__Group_6__1__Impl )
-            // InternalDataDSL.g:6821:2: rule__DataInterchangeBean__Group_6__1__Impl
+            // InternalDataDSL.g:7150:1: ( rule__DataInterchangeBean__Group_6__1__Impl )
+            // InternalDataDSL.g:7151:2: rule__DataInterchangeBean__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBean__Group_6__1__Impl();
@@ -24227,26 +25378,26 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_6__1__Impl"
-    // InternalDataDSL.g:6827:1: rule__DataInterchangeBean__Group_6__1__Impl : ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 ) ) ;
+    // InternalDataDSL.g:7157:1: rule__DataInterchangeBean__Group_6__1__Impl : ( ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 ) ) ;
     public final void rule__DataInterchangeBean__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6831:1: ( ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 ) ) )
-            // InternalDataDSL.g:6832:1: ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 ) )
+            // InternalDataDSL.g:7161:1: ( ( ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 ) ) )
+            // InternalDataDSL.g:7162:1: ( ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 ) )
             {
-            // InternalDataDSL.g:6832:1: ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 ) )
-            // InternalDataDSL.g:6833:2: ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 )
+            // InternalDataDSL.g:7162:1: ( ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 ) )
+            // InternalDataDSL.g:7163:2: ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_6_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_6_1()); 
             }
-            // InternalDataDSL.g:6834:2: ( rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 )
-            // InternalDataDSL.g:6834:3: rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1
+            // InternalDataDSL.g:7164:2: ( rule__DataInterchangeBean__LatestPropertyAssignment_6_1 )
+            // InternalDataDSL.g:7164:3: rule__DataInterchangeBean__LatestPropertyAssignment_6_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1();
+            rule__DataInterchangeBean__LatestPropertyAssignment_6_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -24254,7 +25405,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_6_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyAssignment_6_1()); 
             }
 
             }
@@ -24278,16 +25429,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_7__0"
-    // InternalDataDSL.g:6843:1: rule__DataInterchangeBean__Group_7__0 : rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1 ;
+    // InternalDataDSL.g:7173:1: rule__DataInterchangeBean__Group_7__0 : rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1 ;
     public final void rule__DataInterchangeBean__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6847:1: ( rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1 )
-            // InternalDataDSL.g:6848:2: rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1
+            // InternalDataDSL.g:7177:1: ( rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1 )
+            // InternalDataDSL.g:7178:2: rule__DataInterchangeBean__Group_7__0__Impl rule__DataInterchangeBean__Group_7__1
             {
-            pushFollow(FOLLOW_8);
+            pushFollow(FOLLOW_7);
             rule__DataInterchangeBean__Group_7__0__Impl();
 
             state._fsp--;
@@ -24316,24 +25467,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_7__0__Impl"
-    // InternalDataDSL.g:6855:1: rule__DataInterchangeBean__Group_7__0__Impl : ( 'expression' ) ;
+    // InternalDataDSL.g:7185:1: rule__DataInterchangeBean__Group_7__0__Impl : ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 ) ) ;
     public final void rule__DataInterchangeBean__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6859:1: ( ( 'expression' ) )
-            // InternalDataDSL.g:6860:1: ( 'expression' )
+            // InternalDataDSL.g:7189:1: ( ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 ) ) )
+            // InternalDataDSL.g:7190:1: ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 ) )
             {
-            // InternalDataDSL.g:6860:1: ( 'expression' )
-            // InternalDataDSL.g:6861:2: 'expression'
+            // InternalDataDSL.g:7190:1: ( ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 ) )
+            // InternalDataDSL.g:7191:2: ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_7_0()); 
             }
-            match(input,93,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:7192:2: ( rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 )
+            // InternalDataDSL.g:7192:3: rule__DataInterchangeBean__MarkLatestExportAssignment_7_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__MarkLatestExportAssignment_7_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportAssignment_7_0()); 
             }
 
             }
@@ -24357,22 +25518,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_7__1"
-    // InternalDataDSL.g:6870:1: rule__DataInterchangeBean__Group_7__1 : rule__DataInterchangeBean__Group_7__1__Impl rule__DataInterchangeBean__Group_7__2 ;
+    // InternalDataDSL.g:7200:1: rule__DataInterchangeBean__Group_7__1 : rule__DataInterchangeBean__Group_7__1__Impl ;
     public final void rule__DataInterchangeBean__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6874:1: ( rule__DataInterchangeBean__Group_7__1__Impl rule__DataInterchangeBean__Group_7__2 )
-            // InternalDataDSL.g:6875:2: rule__DataInterchangeBean__Group_7__1__Impl rule__DataInterchangeBean__Group_7__2
+            // InternalDataDSL.g:7204:1: ( rule__DataInterchangeBean__Group_7__1__Impl )
+            // InternalDataDSL.g:7205:2: rule__DataInterchangeBean__Group_7__1__Impl
             {
-            pushFollow(FOLLOW_32);
-            rule__DataInterchangeBean__Group_7__1__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_7__2();
+            rule__DataInterchangeBean__Group_7__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -24395,24 +25551,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_7__1__Impl"
-    // InternalDataDSL.g:6882:1: rule__DataInterchangeBean__Group_7__1__Impl : ( '{' ) ;
+    // InternalDataDSL.g:7211:1: rule__DataInterchangeBean__Group_7__1__Impl : ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 ) ) ;
     public final void rule__DataInterchangeBean__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6886:1: ( ( '{' ) )
-            // InternalDataDSL.g:6887:1: ( '{' )
+            // InternalDataDSL.g:7215:1: ( ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 ) ) )
+            // InternalDataDSL.g:7216:1: ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 ) )
             {
-            // InternalDataDSL.g:6887:1: ( '{' )
-            // InternalDataDSL.g:6888:2: '{'
+            // InternalDataDSL.g:7216:1: ( ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 ) )
+            // InternalDataDSL.g:7217:2: ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_7_1()); 
             }
-            match(input,74,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:7218:2: ( rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 )
+            // InternalDataDSL.g:7218:3: rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyAssignment_7_1()); 
             }
 
             }
@@ -24435,198 +25601,17 @@
     // $ANTLR end "rule__DataInterchangeBean__Group_7__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_7__2"
-    // InternalDataDSL.g:6897:1: rule__DataInterchangeBean__Group_7__2 : rule__DataInterchangeBean__Group_7__2__Impl rule__DataInterchangeBean__Group_7__3 ;
-    public final void rule__DataInterchangeBean__Group_7__2() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6901:1: ( rule__DataInterchangeBean__Group_7__2__Impl rule__DataInterchangeBean__Group_7__3 )
-            // InternalDataDSL.g:6902:2: rule__DataInterchangeBean__Group_7__2__Impl rule__DataInterchangeBean__Group_7__3
-            {
-            pushFollow(FOLLOW_32);
-            rule__DataInterchangeBean__Group_7__2__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_7__3();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_7__2"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_7__2__Impl"
-    // InternalDataDSL.g:6909:1: rule__DataInterchangeBean__Group_7__2__Impl : ( ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )* ) ;
-    public final void rule__DataInterchangeBean__Group_7__2__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6913:1: ( ( ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )* ) )
-            // InternalDataDSL.g:6914:1: ( ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )* )
-            {
-            // InternalDataDSL.g:6914:1: ( ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )* )
-            // InternalDataDSL.g:6915:2: ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_7_2()); 
-            }
-            // InternalDataDSL.g:6916:2: ( rule__DataInterchangeBean__ExpressionAssignment_7_2 )*
-            loop80:
-            do {
-                int alt80=2;
-                int LA80_0 = input.LA(1);
-
-                if ( (LA80_0==108||LA80_0==114) ) {
-                    alt80=1;
-                }
-
-
-                switch (alt80) {
-            	case 1 :
-            	    // InternalDataDSL.g:6916:3: rule__DataInterchangeBean__ExpressionAssignment_7_2
-            	    {
-            	    pushFollow(FOLLOW_33);
-            	    rule__DataInterchangeBean__ExpressionAssignment_7_2();
-
-            	    state._fsp--;
-            	    if (state.failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop80;
-                }
-            } while (true);
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_7_2()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_7__2__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_7__3"
-    // InternalDataDSL.g:6924:1: rule__DataInterchangeBean__Group_7__3 : rule__DataInterchangeBean__Group_7__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_7__3() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6928:1: ( rule__DataInterchangeBean__Group_7__3__Impl )
-            // InternalDataDSL.g:6929:2: rule__DataInterchangeBean__Group_7__3__Impl
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_7__3__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_7__3"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_7__3__Impl"
-    // InternalDataDSL.g:6935:1: rule__DataInterchangeBean__Group_7__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_7__3__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:6939:1: ( ( '}' ) )
-            // InternalDataDSL.g:6940:1: ( '}' )
-            {
-            // InternalDataDSL.g:6940:1: ( '}' )
-            // InternalDataDSL.g:6941:2: '}'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3()); 
-            }
-            match(input,75,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_7__3__Impl"
-
-
     // $ANTLR start "rule__DataInterchangeBean__Group_8__0"
-    // InternalDataDSL.g:6951:1: rule__DataInterchangeBean__Group_8__0 : rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1 ;
+    // InternalDataDSL.g:7227:1: rule__DataInterchangeBean__Group_8__0 : rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1 ;
     public final void rule__DataInterchangeBean__Group_8__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6955:1: ( rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1 )
-            // InternalDataDSL.g:6956:2: rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1
+            // InternalDataDSL.g:7231:1: ( rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1 )
+            // InternalDataDSL.g:7232:2: rule__DataInterchangeBean__Group_8__0__Impl rule__DataInterchangeBean__Group_8__1
             {
-            pushFollow(FOLLOW_8);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group_8__0__Impl();
 
             state._fsp--;
@@ -24655,24 +25640,45 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__0__Impl"
-    // InternalDataDSL.g:6963:1: rule__DataInterchangeBean__Group_8__0__Impl : ( 'lookup' ) ;
+    // InternalDataDSL.g:7239:1: rule__DataInterchangeBean__Group_8__0__Impl : ( ( rule__DataInterchangeBean__Group_8_0__0 )? ) ;
     public final void rule__DataInterchangeBean__Group_8__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6967:1: ( ( 'lookup' ) )
-            // InternalDataDSL.g:6968:1: ( 'lookup' )
+            // InternalDataDSL.g:7243:1: ( ( ( rule__DataInterchangeBean__Group_8_0__0 )? ) )
+            // InternalDataDSL.g:7244:1: ( ( rule__DataInterchangeBean__Group_8_0__0 )? )
             {
-            // InternalDataDSL.g:6968:1: ( 'lookup' )
-            // InternalDataDSL.g:6969:2: 'lookup'
+            // InternalDataDSL.g:7244:1: ( ( rule__DataInterchangeBean__Group_8_0__0 )? )
+            // InternalDataDSL.g:7245:2: ( rule__DataInterchangeBean__Group_8_0__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_0()); 
             }
-            match(input,94,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:7246:2: ( rule__DataInterchangeBean__Group_8_0__0 )?
+            int alt77=2;
+            int LA77_0 = input.LA(1);
+
+            if ( (LA77_0==95) ) {
+                alt77=1;
+            }
+            switch (alt77) {
+                case 1 :
+                    // InternalDataDSL.g:7246:3: rule__DataInterchangeBean__Group_8_0__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_0__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_0()); 
             }
 
             }
@@ -24696,16 +25702,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__1"
-    // InternalDataDSL.g:6978:1: rule__DataInterchangeBean__Group_8__1 : rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2 ;
+    // InternalDataDSL.g:7254:1: rule__DataInterchangeBean__Group_8__1 : rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2 ;
     public final void rule__DataInterchangeBean__Group_8__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6982:1: ( rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2 )
-            // InternalDataDSL.g:6983:2: rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2
+            // InternalDataDSL.g:7258:1: ( rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2 )
+            // InternalDataDSL.g:7259:2: rule__DataInterchangeBean__Group_8__1__Impl rule__DataInterchangeBean__Group_8__2
             {
-            pushFollow(FOLLOW_34);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group_8__1__Impl();
 
             state._fsp--;
@@ -24734,24 +25740,45 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__1__Impl"
-    // InternalDataDSL.g:6990:1: rule__DataInterchangeBean__Group_8__1__Impl : ( '{' ) ;
+    // InternalDataDSL.g:7266:1: rule__DataInterchangeBean__Group_8__1__Impl : ( ( rule__DataInterchangeBean__Group_8_1__0 )? ) ;
     public final void rule__DataInterchangeBean__Group_8__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:6994:1: ( ( '{' ) )
-            // InternalDataDSL.g:6995:1: ( '{' )
+            // InternalDataDSL.g:7270:1: ( ( ( rule__DataInterchangeBean__Group_8_1__0 )? ) )
+            // InternalDataDSL.g:7271:1: ( ( rule__DataInterchangeBean__Group_8_1__0 )? )
             {
-            // InternalDataDSL.g:6995:1: ( '{' )
-            // InternalDataDSL.g:6996:2: '{'
+            // InternalDataDSL.g:7271:1: ( ( rule__DataInterchangeBean__Group_8_1__0 )? )
+            // InternalDataDSL.g:7272:2: ( rule__DataInterchangeBean__Group_8_1__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_1()); 
             }
-            match(input,74,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:7273:2: ( rule__DataInterchangeBean__Group_8_1__0 )?
+            int alt78=2;
+            int LA78_0 = input.LA(1);
+
+            if ( (LA78_0==96) ) {
+                alt78=1;
+            }
+            switch (alt78) {
+                case 1 :
+                    // InternalDataDSL.g:7273:3: rule__DataInterchangeBean__Group_8_1__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_1__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_1()); 
             }
 
             }
@@ -24775,16 +25802,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__2"
-    // InternalDataDSL.g:7005:1: rule__DataInterchangeBean__Group_8__2 : rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3 ;
+    // InternalDataDSL.g:7281:1: rule__DataInterchangeBean__Group_8__2 : rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3 ;
     public final void rule__DataInterchangeBean__Group_8__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7009:1: ( rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3 )
-            // InternalDataDSL.g:7010:2: rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3
+            // InternalDataDSL.g:7285:1: ( rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3 )
+            // InternalDataDSL.g:7286:2: rule__DataInterchangeBean__Group_8__2__Impl rule__DataInterchangeBean__Group_8__3
             {
-            pushFollow(FOLLOW_34);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group_8__2__Impl();
 
             state._fsp--;
@@ -24813,52 +25840,45 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__2__Impl"
-    // InternalDataDSL.g:7017:1: rule__DataInterchangeBean__Group_8__2__Impl : ( ( rule__DataInterchangeBean__LookupAssignment_8_2 )* ) ;
+    // InternalDataDSL.g:7293:1: rule__DataInterchangeBean__Group_8__2__Impl : ( ( rule__DataInterchangeBean__Group_8_2__0 )? ) ;
     public final void rule__DataInterchangeBean__Group_8__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7021:1: ( ( ( rule__DataInterchangeBean__LookupAssignment_8_2 )* ) )
-            // InternalDataDSL.g:7022:1: ( ( rule__DataInterchangeBean__LookupAssignment_8_2 )* )
+            // InternalDataDSL.g:7297:1: ( ( ( rule__DataInterchangeBean__Group_8_2__0 )? ) )
+            // InternalDataDSL.g:7298:1: ( ( rule__DataInterchangeBean__Group_8_2__0 )? )
             {
-            // InternalDataDSL.g:7022:1: ( ( rule__DataInterchangeBean__LookupAssignment_8_2 )* )
-            // InternalDataDSL.g:7023:2: ( rule__DataInterchangeBean__LookupAssignment_8_2 )*
+            // InternalDataDSL.g:7298:1: ( ( rule__DataInterchangeBean__Group_8_2__0 )? )
+            // InternalDataDSL.g:7299:2: ( rule__DataInterchangeBean__Group_8_2__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_2()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_2()); 
             }
-            // InternalDataDSL.g:7024:2: ( rule__DataInterchangeBean__LookupAssignment_8_2 )*
-            loop81:
-            do {
-                int alt81=2;
-                int LA81_0 = input.LA(1);
+            // InternalDataDSL.g:7300:2: ( rule__DataInterchangeBean__Group_8_2__0 )?
+            int alt79=2;
+            int LA79_0 = input.LA(1);
 
-                if ( (LA81_0==101) ) {
-                    alt81=1;
-                }
+            if ( (LA79_0==97) ) {
+                alt79=1;
+            }
+            switch (alt79) {
+                case 1 :
+                    // InternalDataDSL.g:7300:3: rule__DataInterchangeBean__Group_8_2__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_2__0();
 
+                    state._fsp--;
+                    if (state.failed) return ;
 
-                switch (alt81) {
-            	case 1 :
-            	    // InternalDataDSL.g:7024:3: rule__DataInterchangeBean__LookupAssignment_8_2
-            	    {
-            	    pushFollow(FOLLOW_35);
-            	    rule__DataInterchangeBean__LookupAssignment_8_2();
+                    }
+                    break;
 
-            	    state._fsp--;
-            	    if (state.failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop81;
-                }
-            } while (true);
+            }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_2()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_2()); 
             }
 
             }
@@ -24882,20 +25902,25 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__3"
-    // InternalDataDSL.g:7032:1: rule__DataInterchangeBean__Group_8__3 : rule__DataInterchangeBean__Group_8__3__Impl ;
+    // InternalDataDSL.g:7308:1: rule__DataInterchangeBean__Group_8__3 : rule__DataInterchangeBean__Group_8__3__Impl rule__DataInterchangeBean__Group_8__4 ;
     public final void rule__DataInterchangeBean__Group_8__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7036:1: ( rule__DataInterchangeBean__Group_8__3__Impl )
-            // InternalDataDSL.g:7037:2: rule__DataInterchangeBean__Group_8__3__Impl
+            // InternalDataDSL.g:7312:1: ( rule__DataInterchangeBean__Group_8__3__Impl rule__DataInterchangeBean__Group_8__4 )
+            // InternalDataDSL.g:7313:2: rule__DataInterchangeBean__Group_8__3__Impl rule__DataInterchangeBean__Group_8__4
             {
-            pushFollow(FOLLOW_2);
+            pushFollow(FOLLOW_32);
             rule__DataInterchangeBean__Group_8__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8__4();
+
+            state._fsp--;
+            if (state.failed) return ;
 
             }
 
@@ -24915,24 +25940,45 @@
 
 
     // $ANTLR start "rule__DataInterchangeBean__Group_8__3__Impl"
-    // InternalDataDSL.g:7043:1: rule__DataInterchangeBean__Group_8__3__Impl : ( '}' ) ;
+    // InternalDataDSL.g:7320:1: rule__DataInterchangeBean__Group_8__3__Impl : ( ( rule__DataInterchangeBean__Group_8_3__0 )? ) ;
     public final void rule__DataInterchangeBean__Group_8__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7047:1: ( ( '}' ) )
-            // InternalDataDSL.g:7048:1: ( '}' )
+            // InternalDataDSL.g:7324:1: ( ( ( rule__DataInterchangeBean__Group_8_3__0 )? ) )
+            // InternalDataDSL.g:7325:1: ( ( rule__DataInterchangeBean__Group_8_3__0 )? )
             {
-            // InternalDataDSL.g:7048:1: ( '}' )
-            // InternalDataDSL.g:7049:2: '}'
+            // InternalDataDSL.g:7325:1: ( ( rule__DataInterchangeBean__Group_8_3__0 )? )
+            // InternalDataDSL.g:7326:2: ( rule__DataInterchangeBean__Group_8_3__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_3()); 
             }
-            match(input,75,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:7327:2: ( rule__DataInterchangeBean__Group_8_3__0 )?
+            int alt80=2;
+            int LA80_0 = input.LA(1);
+
+            if ( (LA80_0==98) ) {
+                alt80=1;
+            }
+            switch (alt80) {
+                case 1 :
+                    // InternalDataDSL.g:7327:3: rule__DataInterchangeBean__Group_8_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_3()); 
             }
 
             }
@@ -24955,23 +26001,23 @@
     // $ANTLR end "rule__DataInterchangeBean__Group_8__3__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__0"
-    // InternalDataDSL.g:7059:1: rule__DataInterchangeBean__Group_9__0 : rule__DataInterchangeBean__Group_9__0__Impl rule__DataInterchangeBean__Group_9__1 ;
-    public final void rule__DataInterchangeBean__Group_9__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__4"
+    // InternalDataDSL.g:7335:1: rule__DataInterchangeBean__Group_8__4 : rule__DataInterchangeBean__Group_8__4__Impl rule__DataInterchangeBean__Group_8__5 ;
+    public final void rule__DataInterchangeBean__Group_8__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7063:1: ( rule__DataInterchangeBean__Group_9__0__Impl rule__DataInterchangeBean__Group_9__1 )
-            // InternalDataDSL.g:7064:2: rule__DataInterchangeBean__Group_9__0__Impl rule__DataInterchangeBean__Group_9__1
+            // InternalDataDSL.g:7339:1: ( rule__DataInterchangeBean__Group_8__4__Impl rule__DataInterchangeBean__Group_8__5 )
+            // InternalDataDSL.g:7340:2: rule__DataInterchangeBean__Group_8__4__Impl rule__DataInterchangeBean__Group_8__5
             {
-            pushFollow(FOLLOW_8);
-            rule__DataInterchangeBean__Group_9__0__Impl();
+            pushFollow(FOLLOW_32);
+            rule__DataInterchangeBean__Group_8__4__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_9__1();
+            rule__DataInterchangeBean__Group_8__5();
 
             state._fsp--;
             if (state.failed) return ;
@@ -24990,28 +26036,323 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__0"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__4"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__0__Impl"
-    // InternalDataDSL.g:7071:1: rule__DataInterchangeBean__Group_9__0__Impl : ( 'format' ) ;
-    public final void rule__DataInterchangeBean__Group_9__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__4__Impl"
+    // InternalDataDSL.g:7347:1: rule__DataInterchangeBean__Group_8__4__Impl : ( ( rule__DataInterchangeBean__Group_8_4__0 )? ) ;
+    public final void rule__DataInterchangeBean__Group_8__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7075:1: ( ( 'format' ) )
-            // InternalDataDSL.g:7076:1: ( 'format' )
+            // InternalDataDSL.g:7351:1: ( ( ( rule__DataInterchangeBean__Group_8_4__0 )? ) )
+            // InternalDataDSL.g:7352:1: ( ( rule__DataInterchangeBean__Group_8_4__0 )? )
             {
-            // InternalDataDSL.g:7076:1: ( 'format' )
-            // InternalDataDSL.g:7077:2: 'format'
+            // InternalDataDSL.g:7352:1: ( ( rule__DataInterchangeBean__Group_8_4__0 )? )
+            // InternalDataDSL.g:7353:2: ( rule__DataInterchangeBean__Group_8_4__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_4()); 
+            }
+            // InternalDataDSL.g:7354:2: ( rule__DataInterchangeBean__Group_8_4__0 )?
+            int alt81=2;
+            int LA81_0 = input.LA(1);
+
+            if ( (LA81_0==99) ) {
+                alt81=1;
+            }
+            switch (alt81) {
+                case 1 :
+                    // InternalDataDSL.g:7354:3: rule__DataInterchangeBean__Group_8_4__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_4__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__4__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__5"
+    // InternalDataDSL.g:7362:1: rule__DataInterchangeBean__Group_8__5 : rule__DataInterchangeBean__Group_8__5__Impl rule__DataInterchangeBean__Group_8__6 ;
+    public final void rule__DataInterchangeBean__Group_8__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7366:1: ( rule__DataInterchangeBean__Group_8__5__Impl rule__DataInterchangeBean__Group_8__6 )
+            // InternalDataDSL.g:7367:2: rule__DataInterchangeBean__Group_8__5__Impl rule__DataInterchangeBean__Group_8__6
+            {
+            pushFollow(FOLLOW_32);
+            rule__DataInterchangeBean__Group_8__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8__6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__5"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__5__Impl"
+    // InternalDataDSL.g:7374:1: rule__DataInterchangeBean__Group_8__5__Impl : ( ( rule__DataInterchangeBean__Group_8_5__0 )? ) ;
+    public final void rule__DataInterchangeBean__Group_8__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7378:1: ( ( ( rule__DataInterchangeBean__Group_8_5__0 )? ) )
+            // InternalDataDSL.g:7379:1: ( ( rule__DataInterchangeBean__Group_8_5__0 )? )
+            {
+            // InternalDataDSL.g:7379:1: ( ( rule__DataInterchangeBean__Group_8_5__0 )? )
+            // InternalDataDSL.g:7380:2: ( rule__DataInterchangeBean__Group_8_5__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_5()); 
+            }
+            // InternalDataDSL.g:7381:2: ( rule__DataInterchangeBean__Group_8_5__0 )?
+            int alt82=2;
+            int LA82_0 = input.LA(1);
+
+            if ( (LA82_0==100) ) {
+                alt82=1;
+            }
+            switch (alt82) {
+                case 1 :
+                    // InternalDataDSL.g:7381:3: rule__DataInterchangeBean__Group_8_5__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__5__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__6"
+    // InternalDataDSL.g:7389:1: rule__DataInterchangeBean__Group_8__6 : rule__DataInterchangeBean__Group_8__6__Impl ;
+    public final void rule__DataInterchangeBean__Group_8__6() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7393:1: ( rule__DataInterchangeBean__Group_8__6__Impl )
+            // InternalDataDSL.g:7394:2: rule__DataInterchangeBean__Group_8__6__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8__6__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__6"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8__6__Impl"
+    // InternalDataDSL.g:7400:1: rule__DataInterchangeBean__Group_8__6__Impl : ( ( rule__DataInterchangeBean__Group_8_6__0 )? ) ;
+    public final void rule__DataInterchangeBean__Group_8__6__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7404:1: ( ( ( rule__DataInterchangeBean__Group_8_6__0 )? ) )
+            // InternalDataDSL.g:7405:1: ( ( rule__DataInterchangeBean__Group_8_6__0 )? )
+            {
+            // InternalDataDSL.g:7405:1: ( ( rule__DataInterchangeBean__Group_8_6__0 )? )
+            // InternalDataDSL.g:7406:2: ( rule__DataInterchangeBean__Group_8_6__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_6()); 
+            }
+            // InternalDataDSL.g:7407:2: ( rule__DataInterchangeBean__Group_8_6__0 )?
+            int alt83=2;
+            int LA83_0 = input.LA(1);
+
+            if ( (LA83_0==101) ) {
+                alt83=1;
+            }
+            switch (alt83) {
+                case 1 :
+                    // InternalDataDSL.g:7407:3: rule__DataInterchangeBean__Group_8_6__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeBean__Group_8_6__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getGroup_8_6()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8__6__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__0"
+    // InternalDataDSL.g:7416:1: rule__DataInterchangeBean__Group_8_0__0 : rule__DataInterchangeBean__Group_8_0__0__Impl rule__DataInterchangeBean__Group_8_0__1 ;
+    public final void rule__DataInterchangeBean__Group_8_0__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7420:1: ( rule__DataInterchangeBean__Group_8_0__0__Impl rule__DataInterchangeBean__Group_8_0__1 )
+            // InternalDataDSL.g:7421:2: rule__DataInterchangeBean__Group_8_0__0__Impl rule__DataInterchangeBean__Group_8_0__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeBean__Group_8_0__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_0__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__0__Impl"
+    // InternalDataDSL.g:7428:1: rule__DataInterchangeBean__Group_8_0__0__Impl : ( 'expression' ) ;
+    public final void rule__DataInterchangeBean__Group_8_0__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7432:1: ( ( 'expression' ) )
+            // InternalDataDSL.g:7433:1: ( 'expression' )
+            {
+            // InternalDataDSL.g:7433:1: ( 'expression' )
+            // InternalDataDSL.g:7434:2: 'expression'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0()); 
             }
             match(input,95,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0()); 
             }
 
             }
@@ -25031,26 +26372,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__0__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__1"
-    // InternalDataDSL.g:7086:1: rule__DataInterchangeBean__Group_9__1 : rule__DataInterchangeBean__Group_9__1__Impl rule__DataInterchangeBean__Group_9__2 ;
-    public final void rule__DataInterchangeBean__Group_9__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__1"
+    // InternalDataDSL.g:7443:1: rule__DataInterchangeBean__Group_8_0__1 : rule__DataInterchangeBean__Group_8_0__1__Impl rule__DataInterchangeBean__Group_8_0__2 ;
+    public final void rule__DataInterchangeBean__Group_8_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7090:1: ( rule__DataInterchangeBean__Group_9__1__Impl rule__DataInterchangeBean__Group_9__2 )
-            // InternalDataDSL.g:7091:2: rule__DataInterchangeBean__Group_9__1__Impl rule__DataInterchangeBean__Group_9__2
+            // InternalDataDSL.g:7447:1: ( rule__DataInterchangeBean__Group_8_0__1__Impl rule__DataInterchangeBean__Group_8_0__2 )
+            // InternalDataDSL.g:7448:2: rule__DataInterchangeBean__Group_8_0__1__Impl rule__DataInterchangeBean__Group_8_0__2
             {
-            pushFollow(FOLLOW_34);
-            rule__DataInterchangeBean__Group_9__1__Impl();
+            pushFollow(FOLLOW_33);
+            rule__DataInterchangeBean__Group_8_0__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_9__2();
+            rule__DataInterchangeBean__Group_8_0__2();
 
             state._fsp--;
             if (state.failed) return ;
@@ -25069,28 +26410,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__1"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__1__Impl"
-    // InternalDataDSL.g:7098:1: rule__DataInterchangeBean__Group_9__1__Impl : ( '{' ) ;
-    public final void rule__DataInterchangeBean__Group_9__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__1__Impl"
+    // InternalDataDSL.g:7455:1: rule__DataInterchangeBean__Group_8_0__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7102:1: ( ( '{' ) )
-            // InternalDataDSL.g:7103:1: ( '{' )
+            // InternalDataDSL.g:7459:1: ( ( '{' ) )
+            // InternalDataDSL.g:7460:1: ( '{' )
             {
-            // InternalDataDSL.g:7103:1: ( '{' )
-            // InternalDataDSL.g:7104:2: '{'
+            // InternalDataDSL.g:7460:1: ( '{' )
+            // InternalDataDSL.g:7461:2: '{'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1()); 
             }
             match(input,74,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1()); 
             }
 
             }
@@ -25110,26 +26451,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__1__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__2"
-    // InternalDataDSL.g:7113:1: rule__DataInterchangeBean__Group_9__2 : rule__DataInterchangeBean__Group_9__2__Impl rule__DataInterchangeBean__Group_9__3 ;
-    public final void rule__DataInterchangeBean__Group_9__2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__2"
+    // InternalDataDSL.g:7470:1: rule__DataInterchangeBean__Group_8_0__2 : rule__DataInterchangeBean__Group_8_0__2__Impl rule__DataInterchangeBean__Group_8_0__3 ;
+    public final void rule__DataInterchangeBean__Group_8_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7117:1: ( rule__DataInterchangeBean__Group_9__2__Impl rule__DataInterchangeBean__Group_9__3 )
-            // InternalDataDSL.g:7118:2: rule__DataInterchangeBean__Group_9__2__Impl rule__DataInterchangeBean__Group_9__3
+            // InternalDataDSL.g:7474:1: ( rule__DataInterchangeBean__Group_8_0__2__Impl rule__DataInterchangeBean__Group_8_0__3 )
+            // InternalDataDSL.g:7475:2: rule__DataInterchangeBean__Group_8_0__2__Impl rule__DataInterchangeBean__Group_8_0__3
             {
-            pushFollow(FOLLOW_34);
-            rule__DataInterchangeBean__Group_9__2__Impl();
+            pushFollow(FOLLOW_33);
+            rule__DataInterchangeBean__Group_8_0__2__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_9__3();
+            rule__DataInterchangeBean__Group_8_0__3();
 
             state._fsp--;
             if (state.failed) return ;
@@ -25148,720 +26489,42 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__2"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__2__Impl"
-    // InternalDataDSL.g:7125:1: rule__DataInterchangeBean__Group_9__2__Impl : ( ( rule__DataInterchangeBean__FormatAssignment_9_2 )* ) ;
-    public final void rule__DataInterchangeBean__Group_9__2__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__2__Impl"
+    // InternalDataDSL.g:7482:1: rule__DataInterchangeBean__Group_8_0__2__Impl : ( ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7129:1: ( ( ( rule__DataInterchangeBean__FormatAssignment_9_2 )* ) )
-            // InternalDataDSL.g:7130:1: ( ( rule__DataInterchangeBean__FormatAssignment_9_2 )* )
+            // InternalDataDSL.g:7486:1: ( ( ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )* ) )
+            // InternalDataDSL.g:7487:1: ( ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )* )
             {
-            // InternalDataDSL.g:7130:1: ( ( rule__DataInterchangeBean__FormatAssignment_9_2 )* )
-            // InternalDataDSL.g:7131:2: ( rule__DataInterchangeBean__FormatAssignment_9_2 )*
+            // InternalDataDSL.g:7487:1: ( ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )* )
+            // InternalDataDSL.g:7488:2: ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )*
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_9_2()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_8_0_2()); 
             }
-            // InternalDataDSL.g:7132:2: ( rule__DataInterchangeBean__FormatAssignment_9_2 )*
-            loop82:
-            do {
-                int alt82=2;
-                int LA82_0 = input.LA(1);
-
-                if ( (LA82_0==101) ) {
-                    alt82=1;
-                }
-
-
-                switch (alt82) {
-            	case 1 :
-            	    // InternalDataDSL.g:7132:3: rule__DataInterchangeBean__FormatAssignment_9_2
-            	    {
-            	    pushFollow(FOLLOW_35);
-            	    rule__DataInterchangeBean__FormatAssignment_9_2();
-
-            	    state._fsp--;
-            	    if (state.failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop82;
-                }
-            } while (true);
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_9_2()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__2__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__3"
-    // InternalDataDSL.g:7140:1: rule__DataInterchangeBean__Group_9__3 : rule__DataInterchangeBean__Group_9__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_9__3() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7144:1: ( rule__DataInterchangeBean__Group_9__3__Impl )
-            // InternalDataDSL.g:7145:2: rule__DataInterchangeBean__Group_9__3__Impl
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_9__3__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__3"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_9__3__Impl"
-    // InternalDataDSL.g:7151:1: rule__DataInterchangeBean__Group_9__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_9__3__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7155:1: ( ( '}' ) )
-            // InternalDataDSL.g:7156:1: ( '}' )
-            {
-            // InternalDataDSL.g:7156:1: ( '}' )
-            // InternalDataDSL.g:7157:2: '}'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3()); 
-            }
-            match(input,75,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_9__3__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__0"
-    // InternalDataDSL.g:7167:1: rule__DataInterchangeBean__Group_10__0 : rule__DataInterchangeBean__Group_10__0__Impl rule__DataInterchangeBean__Group_10__1 ;
-    public final void rule__DataInterchangeBean__Group_10__0() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7171:1: ( rule__DataInterchangeBean__Group_10__0__Impl rule__DataInterchangeBean__Group_10__1 )
-            // InternalDataDSL.g:7172:2: rule__DataInterchangeBean__Group_10__0__Impl rule__DataInterchangeBean__Group_10__1
-            {
-            pushFollow(FOLLOW_8);
-            rule__DataInterchangeBean__Group_10__0__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_10__1();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__0"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__0__Impl"
-    // InternalDataDSL.g:7179:1: rule__DataInterchangeBean__Group_10__0__Impl : ( 'expose' ) ;
-    public final void rule__DataInterchangeBean__Group_10__0__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7183:1: ( ( 'expose' ) )
-            // InternalDataDSL.g:7184:1: ( 'expose' )
-            {
-            // InternalDataDSL.g:7184:1: ( 'expose' )
-            // InternalDataDSL.g:7185:2: 'expose'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0()); 
-            }
-            match(input,96,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__0__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__1"
-    // InternalDataDSL.g:7194:1: rule__DataInterchangeBean__Group_10__1 : rule__DataInterchangeBean__Group_10__1__Impl rule__DataInterchangeBean__Group_10__2 ;
-    public final void rule__DataInterchangeBean__Group_10__1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7198:1: ( rule__DataInterchangeBean__Group_10__1__Impl rule__DataInterchangeBean__Group_10__2 )
-            // InternalDataDSL.g:7199:2: rule__DataInterchangeBean__Group_10__1__Impl rule__DataInterchangeBean__Group_10__2
-            {
-            pushFollow(FOLLOW_36);
-            rule__DataInterchangeBean__Group_10__1__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_10__2();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__1"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__1__Impl"
-    // InternalDataDSL.g:7206:1: rule__DataInterchangeBean__Group_10__1__Impl : ( '{' ) ;
-    public final void rule__DataInterchangeBean__Group_10__1__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7210:1: ( ( '{' ) )
-            // InternalDataDSL.g:7211:1: ( '{' )
-            {
-            // InternalDataDSL.g:7211:1: ( '{' )
-            // InternalDataDSL.g:7212:2: '{'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1()); 
-            }
-            match(input,74,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__1__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__2"
-    // InternalDataDSL.g:7221:1: rule__DataInterchangeBean__Group_10__2 : rule__DataInterchangeBean__Group_10__2__Impl rule__DataInterchangeBean__Group_10__3 ;
-    public final void rule__DataInterchangeBean__Group_10__2() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7225:1: ( rule__DataInterchangeBean__Group_10__2__Impl rule__DataInterchangeBean__Group_10__3 )
-            // InternalDataDSL.g:7226:2: rule__DataInterchangeBean__Group_10__2__Impl rule__DataInterchangeBean__Group_10__3
-            {
-            pushFollow(FOLLOW_36);
-            rule__DataInterchangeBean__Group_10__2__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_10__3();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__2"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__2__Impl"
-    // InternalDataDSL.g:7233:1: rule__DataInterchangeBean__Group_10__2__Impl : ( ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )* ) ;
-    public final void rule__DataInterchangeBean__Group_10__2__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7237:1: ( ( ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )* ) )
-            // InternalDataDSL.g:7238:1: ( ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )* )
-            {
-            // InternalDataDSL.g:7238:1: ( ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )* )
-            // InternalDataDSL.g:7239:2: ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_10_2()); 
-            }
-            // InternalDataDSL.g:7240:2: ( rule__DataInterchangeBean__ExportExposesAssignment_10_2 )*
-            loop83:
-            do {
-                int alt83=2;
-                int LA83_0 = input.LA(1);
-
-                if ( (LA83_0==111) ) {
-                    alt83=1;
-                }
-
-
-                switch (alt83) {
-            	case 1 :
-            	    // InternalDataDSL.g:7240:3: rule__DataInterchangeBean__ExportExposesAssignment_10_2
-            	    {
-            	    pushFollow(FOLLOW_37);
-            	    rule__DataInterchangeBean__ExportExposesAssignment_10_2();
-
-            	    state._fsp--;
-            	    if (state.failed) return ;
-
-            	    }
-            	    break;
-
-            	default :
-            	    break loop83;
-                }
-            } while (true);
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_10_2()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__2__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__3"
-    // InternalDataDSL.g:7248:1: rule__DataInterchangeBean__Group_10__3 : rule__DataInterchangeBean__Group_10__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_10__3() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7252:1: ( rule__DataInterchangeBean__Group_10__3__Impl )
-            // InternalDataDSL.g:7253:2: rule__DataInterchangeBean__Group_10__3__Impl
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_10__3__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__3"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_10__3__Impl"
-    // InternalDataDSL.g:7259:1: rule__DataInterchangeBean__Group_10__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_10__3__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7263:1: ( ( '}' ) )
-            // InternalDataDSL.g:7264:1: ( '}' )
-            {
-            // InternalDataDSL.g:7264:1: ( '}' )
-            // InternalDataDSL.g:7265:2: '}'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3()); 
-            }
-            match(input,75,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_10__3__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__0"
-    // InternalDataDSL.g:7275:1: rule__DataInterchangeBean__Group_11__0 : rule__DataInterchangeBean__Group_11__0__Impl rule__DataInterchangeBean__Group_11__1 ;
-    public final void rule__DataInterchangeBean__Group_11__0() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7279:1: ( rule__DataInterchangeBean__Group_11__0__Impl rule__DataInterchangeBean__Group_11__1 )
-            // InternalDataDSL.g:7280:2: rule__DataInterchangeBean__Group_11__0__Impl rule__DataInterchangeBean__Group_11__1
-            {
-            pushFollow(FOLLOW_8);
-            rule__DataInterchangeBean__Group_11__0__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_11__1();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__0"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__0__Impl"
-    // InternalDataDSL.g:7287:1: rule__DataInterchangeBean__Group_11__0__Impl : ( 'mapping' ) ;
-    public final void rule__DataInterchangeBean__Group_11__0__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7291:1: ( ( 'mapping' ) )
-            // InternalDataDSL.g:7292:1: ( 'mapping' )
-            {
-            // InternalDataDSL.g:7292:1: ( 'mapping' )
-            // InternalDataDSL.g:7293:2: 'mapping'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0()); 
-            }
-            match(input,97,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__0__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__1"
-    // InternalDataDSL.g:7302:1: rule__DataInterchangeBean__Group_11__1 : rule__DataInterchangeBean__Group_11__1__Impl rule__DataInterchangeBean__Group_11__2 ;
-    public final void rule__DataInterchangeBean__Group_11__1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7306:1: ( rule__DataInterchangeBean__Group_11__1__Impl rule__DataInterchangeBean__Group_11__2 )
-            // InternalDataDSL.g:7307:2: rule__DataInterchangeBean__Group_11__1__Impl rule__DataInterchangeBean__Group_11__2
-            {
-            pushFollow(FOLLOW_38);
-            rule__DataInterchangeBean__Group_11__1__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_11__2();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__1"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__1__Impl"
-    // InternalDataDSL.g:7314:1: rule__DataInterchangeBean__Group_11__1__Impl : ( '{' ) ;
-    public final void rule__DataInterchangeBean__Group_11__1__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7318:1: ( ( '{' ) )
-            // InternalDataDSL.g:7319:1: ( '{' )
-            {
-            // InternalDataDSL.g:7319:1: ( '{' )
-            // InternalDataDSL.g:7320:2: '{'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1()); 
-            }
-            match(input,74,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__1__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__2"
-    // InternalDataDSL.g:7329:1: rule__DataInterchangeBean__Group_11__2 : rule__DataInterchangeBean__Group_11__2__Impl rule__DataInterchangeBean__Group_11__3 ;
-    public final void rule__DataInterchangeBean__Group_11__2() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7333:1: ( rule__DataInterchangeBean__Group_11__2__Impl rule__DataInterchangeBean__Group_11__3 )
-            // InternalDataDSL.g:7334:2: rule__DataInterchangeBean__Group_11__2__Impl rule__DataInterchangeBean__Group_11__3
-            {
-            pushFollow(FOLLOW_38);
-            rule__DataInterchangeBean__Group_11__2__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_11__3();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__2"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__2__Impl"
-    // InternalDataDSL.g:7341:1: rule__DataInterchangeBean__Group_11__2__Impl : ( ( rule__DataInterchangeBean__MappingsAssignment_11_2 )* ) ;
-    public final void rule__DataInterchangeBean__Group_11__2__Impl() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7345:1: ( ( ( rule__DataInterchangeBean__MappingsAssignment_11_2 )* ) )
-            // InternalDataDSL.g:7346:1: ( ( rule__DataInterchangeBean__MappingsAssignment_11_2 )* )
-            {
-            // InternalDataDSL.g:7346:1: ( ( rule__DataInterchangeBean__MappingsAssignment_11_2 )* )
-            // InternalDataDSL.g:7347:2: ( rule__DataInterchangeBean__MappingsAssignment_11_2 )*
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_11_2()); 
-            }
-            // InternalDataDSL.g:7348:2: ( rule__DataInterchangeBean__MappingsAssignment_11_2 )*
+            // InternalDataDSL.g:7489:2: ( rule__DataInterchangeBean__ExpressionAssignment_8_0_2 )*
             loop84:
             do {
                 int alt84=2;
                 int LA84_0 = input.LA(1);
 
-                if ( (LA84_0==116||LA84_0==118) ) {
+                if ( (LA84_0==111||LA84_0==117) ) {
                     alt84=1;
                 }
 
 
                 switch (alt84) {
             	case 1 :
-            	    // InternalDataDSL.g:7348:3: rule__DataInterchangeBean__MappingsAssignment_11_2
+            	    // InternalDataDSL.g:7489:3: rule__DataInterchangeBean__ExpressionAssignment_8_0_2
             	    {
-            	    pushFollow(FOLLOW_39);
-            	    rule__DataInterchangeBean__MappingsAssignment_11_2();
+            	    pushFollow(FOLLOW_34);
+            	    rule__DataInterchangeBean__ExpressionAssignment_8_0_2();
 
             	    state._fsp--;
             	    if (state.failed) return ;
@@ -25875,7 +26538,7 @@
             } while (true);
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_11_2()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionAssignment_8_0_2()); 
             }
 
             }
@@ -25895,21 +26558,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__2__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__2__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__3"
-    // InternalDataDSL.g:7356:1: rule__DataInterchangeBean__Group_11__3 : rule__DataInterchangeBean__Group_11__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_11__3() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__3"
+    // InternalDataDSL.g:7497:1: rule__DataInterchangeBean__Group_8_0__3 : rule__DataInterchangeBean__Group_8_0__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7360:1: ( rule__DataInterchangeBean__Group_11__3__Impl )
-            // InternalDataDSL.g:7361:2: rule__DataInterchangeBean__Group_11__3__Impl
+            // InternalDataDSL.g:7501:1: ( rule__DataInterchangeBean__Group_8_0__3__Impl )
+            // InternalDataDSL.g:7502:2: rule__DataInterchangeBean__Group_8_0__3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_11__3__Impl();
+            rule__DataInterchangeBean__Group_8_0__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -25928,28 +26591,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__3"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__3"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_11__3__Impl"
-    // InternalDataDSL.g:7367:1: rule__DataInterchangeBean__Group_11__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_11__3__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_0__3__Impl"
+    // InternalDataDSL.g:7508:1: rule__DataInterchangeBean__Group_8_0__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7371:1: ( ( '}' ) )
-            // InternalDataDSL.g:7372:1: ( '}' )
+            // InternalDataDSL.g:7512:1: ( ( '}' ) )
+            // InternalDataDSL.g:7513:1: ( '}' )
             {
-            // InternalDataDSL.g:7372:1: ( '}' )
-            // InternalDataDSL.g:7373:2: '}'
+            // InternalDataDSL.g:7513:1: ( '}' )
+            // InternalDataDSL.g:7514:2: '}'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3()); 
             }
             match(input,75,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3()); 
             }
 
             }
@@ -25969,26 +26632,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_11__3__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_0__3__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__0"
-    // InternalDataDSL.g:7383:1: rule__DataInterchangeBean__Group_12__0 : rule__DataInterchangeBean__Group_12__0__Impl rule__DataInterchangeBean__Group_12__1 ;
-    public final void rule__DataInterchangeBean__Group_12__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__0"
+    // InternalDataDSL.g:7524:1: rule__DataInterchangeBean__Group_8_1__0 : rule__DataInterchangeBean__Group_8_1__0__Impl rule__DataInterchangeBean__Group_8_1__1 ;
+    public final void rule__DataInterchangeBean__Group_8_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7387:1: ( rule__DataInterchangeBean__Group_12__0__Impl rule__DataInterchangeBean__Group_12__1 )
-            // InternalDataDSL.g:7388:2: rule__DataInterchangeBean__Group_12__0__Impl rule__DataInterchangeBean__Group_12__1
+            // InternalDataDSL.g:7528:1: ( rule__DataInterchangeBean__Group_8_1__0__Impl rule__DataInterchangeBean__Group_8_1__1 )
+            // InternalDataDSL.g:7529:2: rule__DataInterchangeBean__Group_8_1__0__Impl rule__DataInterchangeBean__Group_8_1__1
             {
             pushFollow(FOLLOW_8);
-            rule__DataInterchangeBean__Group_12__0__Impl();
+            rule__DataInterchangeBean__Group_8_1__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_12__1();
+            rule__DataInterchangeBean__Group_8_1__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26007,28 +26670,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__0"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__0"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__0__Impl"
-    // InternalDataDSL.g:7395:1: rule__DataInterchangeBean__Group_12__0__Impl : ( 'keys' ) ;
-    public final void rule__DataInterchangeBean__Group_12__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__0__Impl"
+    // InternalDataDSL.g:7536:1: rule__DataInterchangeBean__Group_8_1__0__Impl : ( 'lookup' ) ;
+    public final void rule__DataInterchangeBean__Group_8_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7399:1: ( ( 'keys' ) )
-            // InternalDataDSL.g:7400:1: ( 'keys' )
+            // InternalDataDSL.g:7540:1: ( ( 'lookup' ) )
+            // InternalDataDSL.g:7541:1: ( 'lookup' )
             {
-            // InternalDataDSL.g:7400:1: ( 'keys' )
-            // InternalDataDSL.g:7401:2: 'keys'
+            // InternalDataDSL.g:7541:1: ( 'lookup' )
+            // InternalDataDSL.g:7542:2: 'lookup'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0()); 
             }
-            match(input,98,FOLLOW_2); if (state.failed) return ;
+            match(input,96,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0()); 
             }
 
             }
@@ -26048,26 +26711,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__0__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__1"
-    // InternalDataDSL.g:7410:1: rule__DataInterchangeBean__Group_12__1 : rule__DataInterchangeBean__Group_12__1__Impl rule__DataInterchangeBean__Group_12__2 ;
-    public final void rule__DataInterchangeBean__Group_12__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__1"
+    // InternalDataDSL.g:7551:1: rule__DataInterchangeBean__Group_8_1__1 : rule__DataInterchangeBean__Group_8_1__1__Impl rule__DataInterchangeBean__Group_8_1__2 ;
+    public final void rule__DataInterchangeBean__Group_8_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7414:1: ( rule__DataInterchangeBean__Group_12__1__Impl rule__DataInterchangeBean__Group_12__2 )
-            // InternalDataDSL.g:7415:2: rule__DataInterchangeBean__Group_12__1__Impl rule__DataInterchangeBean__Group_12__2
+            // InternalDataDSL.g:7555:1: ( rule__DataInterchangeBean__Group_8_1__1__Impl rule__DataInterchangeBean__Group_8_1__2 )
+            // InternalDataDSL.g:7556:2: rule__DataInterchangeBean__Group_8_1__1__Impl rule__DataInterchangeBean__Group_8_1__2
             {
-            pushFollow(FOLLOW_40);
-            rule__DataInterchangeBean__Group_12__1__Impl();
+            pushFollow(FOLLOW_35);
+            rule__DataInterchangeBean__Group_8_1__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_12__2();
+            rule__DataInterchangeBean__Group_8_1__2();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26086,28 +26749,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__1"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__1__Impl"
-    // InternalDataDSL.g:7422:1: rule__DataInterchangeBean__Group_12__1__Impl : ( '{' ) ;
-    public final void rule__DataInterchangeBean__Group_12__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__1__Impl"
+    // InternalDataDSL.g:7563:1: rule__DataInterchangeBean__Group_8_1__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7426:1: ( ( '{' ) )
-            // InternalDataDSL.g:7427:1: ( '{' )
+            // InternalDataDSL.g:7567:1: ( ( '{' ) )
+            // InternalDataDSL.g:7568:1: ( '{' )
             {
-            // InternalDataDSL.g:7427:1: ( '{' )
-            // InternalDataDSL.g:7428:2: '{'
+            // InternalDataDSL.g:7568:1: ( '{' )
+            // InternalDataDSL.g:7569:2: '{'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1()); 
             }
             match(input,74,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1()); 
             }
 
             }
@@ -26127,26 +26790,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__1__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__2"
-    // InternalDataDSL.g:7437:1: rule__DataInterchangeBean__Group_12__2 : rule__DataInterchangeBean__Group_12__2__Impl rule__DataInterchangeBean__Group_12__3 ;
-    public final void rule__DataInterchangeBean__Group_12__2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__2"
+    // InternalDataDSL.g:7578:1: rule__DataInterchangeBean__Group_8_1__2 : rule__DataInterchangeBean__Group_8_1__2__Impl rule__DataInterchangeBean__Group_8_1__3 ;
+    public final void rule__DataInterchangeBean__Group_8_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7441:1: ( rule__DataInterchangeBean__Group_12__2__Impl rule__DataInterchangeBean__Group_12__3 )
-            // InternalDataDSL.g:7442:2: rule__DataInterchangeBean__Group_12__2__Impl rule__DataInterchangeBean__Group_12__3
+            // InternalDataDSL.g:7582:1: ( rule__DataInterchangeBean__Group_8_1__2__Impl rule__DataInterchangeBean__Group_8_1__3 )
+            // InternalDataDSL.g:7583:2: rule__DataInterchangeBean__Group_8_1__2__Impl rule__DataInterchangeBean__Group_8_1__3
             {
-            pushFollow(FOLLOW_40);
-            rule__DataInterchangeBean__Group_12__2__Impl();
+            pushFollow(FOLLOW_35);
+            rule__DataInterchangeBean__Group_8_1__2__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_12__3();
+            rule__DataInterchangeBean__Group_8_1__3();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26165,42 +26828,42 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__2"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__2__Impl"
-    // InternalDataDSL.g:7449:1: rule__DataInterchangeBean__Group_12__2__Impl : ( ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )* ) ;
-    public final void rule__DataInterchangeBean__Group_12__2__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__2__Impl"
+    // InternalDataDSL.g:7590:1: rule__DataInterchangeBean__Group_8_1__2__Impl : ( ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7453:1: ( ( ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )* ) )
-            // InternalDataDSL.g:7454:1: ( ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )* )
+            // InternalDataDSL.g:7594:1: ( ( ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )* ) )
+            // InternalDataDSL.g:7595:1: ( ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )* )
             {
-            // InternalDataDSL.g:7454:1: ( ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )* )
-            // InternalDataDSL.g:7455:2: ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )*
+            // InternalDataDSL.g:7595:1: ( ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )* )
+            // InternalDataDSL.g:7596:2: ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )*
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_12_2()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_1_2()); 
             }
-            // InternalDataDSL.g:7456:2: ( rule__DataInterchangeBean__LookupKeysAssignment_12_2 )*
+            // InternalDataDSL.g:7597:2: ( rule__DataInterchangeBean__LookupAssignment_8_1_2 )*
             loop85:
             do {
                 int alt85=2;
                 int LA85_0 = input.LA(1);
 
-                if ( (LA85_0==100) ) {
+                if ( (LA85_0==103) ) {
                     alt85=1;
                 }
 
 
                 switch (alt85) {
             	case 1 :
-            	    // InternalDataDSL.g:7456:3: rule__DataInterchangeBean__LookupKeysAssignment_12_2
+            	    // InternalDataDSL.g:7597:3: rule__DataInterchangeBean__LookupAssignment_8_1_2
             	    {
-            	    pushFollow(FOLLOW_41);
-            	    rule__DataInterchangeBean__LookupKeysAssignment_12_2();
+            	    pushFollow(FOLLOW_36);
+            	    rule__DataInterchangeBean__LookupAssignment_8_1_2();
 
             	    state._fsp--;
             	    if (state.failed) return ;
@@ -26214,7 +26877,7 @@
             } while (true);
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_12_2()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLookupAssignment_8_1_2()); 
             }
 
             }
@@ -26234,21 +26897,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__2__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__2__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__3"
-    // InternalDataDSL.g:7464:1: rule__DataInterchangeBean__Group_12__3 : rule__DataInterchangeBean__Group_12__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_12__3() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__3"
+    // InternalDataDSL.g:7605:1: rule__DataInterchangeBean__Group_8_1__3 : rule__DataInterchangeBean__Group_8_1__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7468:1: ( rule__DataInterchangeBean__Group_12__3__Impl )
-            // InternalDataDSL.g:7469:2: rule__DataInterchangeBean__Group_12__3__Impl
+            // InternalDataDSL.g:7609:1: ( rule__DataInterchangeBean__Group_8_1__3__Impl )
+            // InternalDataDSL.g:7610:2: rule__DataInterchangeBean__Group_8_1__3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_12__3__Impl();
+            rule__DataInterchangeBean__Group_8_1__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26267,28 +26930,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__3"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__3"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_12__3__Impl"
-    // InternalDataDSL.g:7475:1: rule__DataInterchangeBean__Group_12__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_12__3__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_1__3__Impl"
+    // InternalDataDSL.g:7616:1: rule__DataInterchangeBean__Group_8_1__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7479:1: ( ( '}' ) )
-            // InternalDataDSL.g:7480:1: ( '}' )
+            // InternalDataDSL.g:7620:1: ( ( '}' ) )
+            // InternalDataDSL.g:7621:1: ( '}' )
             {
-            // InternalDataDSL.g:7480:1: ( '}' )
-            // InternalDataDSL.g:7481:2: '}'
+            // InternalDataDSL.g:7621:1: ( '}' )
+            // InternalDataDSL.g:7622:2: '}'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3()); 
             }
             match(input,75,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3()); 
             }
 
             }
@@ -26308,26 +26971,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_12__3__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_1__3__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__0"
-    // InternalDataDSL.g:7491:1: rule__DataInterchangeBean__Group_13__0 : rule__DataInterchangeBean__Group_13__0__Impl rule__DataInterchangeBean__Group_13__1 ;
-    public final void rule__DataInterchangeBean__Group_13__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__0"
+    // InternalDataDSL.g:7632:1: rule__DataInterchangeBean__Group_8_2__0 : rule__DataInterchangeBean__Group_8_2__0__Impl rule__DataInterchangeBean__Group_8_2__1 ;
+    public final void rule__DataInterchangeBean__Group_8_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7495:1: ( rule__DataInterchangeBean__Group_13__0__Impl rule__DataInterchangeBean__Group_13__1 )
-            // InternalDataDSL.g:7496:2: rule__DataInterchangeBean__Group_13__0__Impl rule__DataInterchangeBean__Group_13__1
+            // InternalDataDSL.g:7636:1: ( rule__DataInterchangeBean__Group_8_2__0__Impl rule__DataInterchangeBean__Group_8_2__1 )
+            // InternalDataDSL.g:7637:2: rule__DataInterchangeBean__Group_8_2__0__Impl rule__DataInterchangeBean__Group_8_2__1
             {
             pushFollow(FOLLOW_8);
-            rule__DataInterchangeBean__Group_13__0__Impl();
+            rule__DataInterchangeBean__Group_8_2__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_13__1();
+            rule__DataInterchangeBean__Group_8_2__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26346,28 +27009,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__0"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__0"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__0__Impl"
-    // InternalDataDSL.g:7503:1: rule__DataInterchangeBean__Group_13__0__Impl : ( 'exportFilter' ) ;
-    public final void rule__DataInterchangeBean__Group_13__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__0__Impl"
+    // InternalDataDSL.g:7644:1: rule__DataInterchangeBean__Group_8_2__0__Impl : ( 'format' ) ;
+    public final void rule__DataInterchangeBean__Group_8_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7507:1: ( ( 'exportFilter' ) )
-            // InternalDataDSL.g:7508:1: ( 'exportFilter' )
+            // InternalDataDSL.g:7648:1: ( ( 'format' ) )
+            // InternalDataDSL.g:7649:1: ( 'format' )
             {
-            // InternalDataDSL.g:7508:1: ( 'exportFilter' )
-            // InternalDataDSL.g:7509:2: 'exportFilter'
+            // InternalDataDSL.g:7649:1: ( 'format' )
+            // InternalDataDSL.g:7650:2: 'format'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0()); 
             }
-            match(input,99,FOLLOW_2); if (state.failed) return ;
+            match(input,97,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0()); 
             }
 
             }
@@ -26387,26 +27050,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__0__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__1"
-    // InternalDataDSL.g:7518:1: rule__DataInterchangeBean__Group_13__1 : rule__DataInterchangeBean__Group_13__1__Impl rule__DataInterchangeBean__Group_13__2 ;
-    public final void rule__DataInterchangeBean__Group_13__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__1"
+    // InternalDataDSL.g:7659:1: rule__DataInterchangeBean__Group_8_2__1 : rule__DataInterchangeBean__Group_8_2__1__Impl rule__DataInterchangeBean__Group_8_2__2 ;
+    public final void rule__DataInterchangeBean__Group_8_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7522:1: ( rule__DataInterchangeBean__Group_13__1__Impl rule__DataInterchangeBean__Group_13__2 )
-            // InternalDataDSL.g:7523:2: rule__DataInterchangeBean__Group_13__1__Impl rule__DataInterchangeBean__Group_13__2
+            // InternalDataDSL.g:7663:1: ( rule__DataInterchangeBean__Group_8_2__1__Impl rule__DataInterchangeBean__Group_8_2__2 )
+            // InternalDataDSL.g:7664:2: rule__DataInterchangeBean__Group_8_2__1__Impl rule__DataInterchangeBean__Group_8_2__2
             {
-            pushFollow(FOLLOW_42);
-            rule__DataInterchangeBean__Group_13__1__Impl();
+            pushFollow(FOLLOW_35);
+            rule__DataInterchangeBean__Group_8_2__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_13__2();
+            rule__DataInterchangeBean__Group_8_2__2();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26425,28 +27088,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__1"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__1__Impl"
-    // InternalDataDSL.g:7530:1: rule__DataInterchangeBean__Group_13__1__Impl : ( '{' ) ;
-    public final void rule__DataInterchangeBean__Group_13__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__1__Impl"
+    // InternalDataDSL.g:7671:1: rule__DataInterchangeBean__Group_8_2__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7534:1: ( ( '{' ) )
-            // InternalDataDSL.g:7535:1: ( '{' )
+            // InternalDataDSL.g:7675:1: ( ( '{' ) )
+            // InternalDataDSL.g:7676:1: ( '{' )
             {
-            // InternalDataDSL.g:7535:1: ( '{' )
-            // InternalDataDSL.g:7536:2: '{'
+            // InternalDataDSL.g:7676:1: ( '{' )
+            // InternalDataDSL.g:7677:2: '{'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1()); 
             }
             match(input,74,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1()); 
             }
 
             }
@@ -26466,26 +27129,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__1__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__2"
-    // InternalDataDSL.g:7545:1: rule__DataInterchangeBean__Group_13__2 : rule__DataInterchangeBean__Group_13__2__Impl rule__DataInterchangeBean__Group_13__3 ;
-    public final void rule__DataInterchangeBean__Group_13__2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__2"
+    // InternalDataDSL.g:7686:1: rule__DataInterchangeBean__Group_8_2__2 : rule__DataInterchangeBean__Group_8_2__2__Impl rule__DataInterchangeBean__Group_8_2__3 ;
+    public final void rule__DataInterchangeBean__Group_8_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7549:1: ( rule__DataInterchangeBean__Group_13__2__Impl rule__DataInterchangeBean__Group_13__3 )
-            // InternalDataDSL.g:7550:2: rule__DataInterchangeBean__Group_13__2__Impl rule__DataInterchangeBean__Group_13__3
+            // InternalDataDSL.g:7690:1: ( rule__DataInterchangeBean__Group_8_2__2__Impl rule__DataInterchangeBean__Group_8_2__3 )
+            // InternalDataDSL.g:7691:2: rule__DataInterchangeBean__Group_8_2__2__Impl rule__DataInterchangeBean__Group_8_2__3
             {
-            pushFollow(FOLLOW_43);
-            rule__DataInterchangeBean__Group_13__2__Impl();
+            pushFollow(FOLLOW_35);
+            rule__DataInterchangeBean__Group_8_2__2__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_13__3();
+            rule__DataInterchangeBean__Group_8_2__3();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26504,72 +27167,90 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__2"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__2__Impl"
-    // InternalDataDSL.g:7557:1: rule__DataInterchangeBean__Group_13__2__Impl : ( ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 ) ) ;
-    public final void rule__DataInterchangeBean__Group_13__2__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__2__Impl"
+    // InternalDataDSL.g:7698:1: rule__DataInterchangeBean__Group_8_2__2__Impl : ( ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7561:1: ( ( ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 ) ) )
-            // InternalDataDSL.g:7562:1: ( ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 ) )
+            // InternalDataDSL.g:7702:1: ( ( ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )* ) )
+            // InternalDataDSL.g:7703:1: ( ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )* )
             {
-            // InternalDataDSL.g:7562:1: ( ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 ) )
-            // InternalDataDSL.g:7563:2: ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 )
+            // InternalDataDSL.g:7703:1: ( ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )* )
+            // InternalDataDSL.g:7704:2: ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )*
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_13_2()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_8_2_2()); 
             }
-            // InternalDataDSL.g:7564:2: ( rule__DataInterchangeBean__ExportFilterAssignment_13_2 )
-            // InternalDataDSL.g:7564:3: rule__DataInterchangeBean__ExportFilterAssignment_13_2
+            // InternalDataDSL.g:7705:2: ( rule__DataInterchangeBean__FormatAssignment_8_2_2 )*
+            loop86:
+            do {
+                int alt86=2;
+                int LA86_0 = input.LA(1);
+
+                if ( (LA86_0==103) ) {
+                    alt86=1;
+                }
+
+
+                switch (alt86) {
+            	case 1 :
+            	    // InternalDataDSL.g:7705:3: rule__DataInterchangeBean__FormatAssignment_8_2_2
+            	    {
+            	    pushFollow(FOLLOW_36);
+            	    rule__DataInterchangeBean__FormatAssignment_8_2_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop86;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getFormatAssignment_8_2_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__3"
+    // InternalDataDSL.g:7713:1: rule__DataInterchangeBean__Group_8_2__3 : rule__DataInterchangeBean__Group_8_2__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_2__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7717:1: ( rule__DataInterchangeBean__Group_8_2__3__Impl )
+            // InternalDataDSL.g:7718:2: rule__DataInterchangeBean__Group_8_2__3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__ExportFilterAssignment_13_2();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_13_2()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__2__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__3"
-    // InternalDataDSL.g:7572:1: rule__DataInterchangeBean__Group_13__3 : rule__DataInterchangeBean__Group_13__3__Impl ;
-    public final void rule__DataInterchangeBean__Group_13__3() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:7576:1: ( rule__DataInterchangeBean__Group_13__3__Impl )
-            // InternalDataDSL.g:7577:2: rule__DataInterchangeBean__Group_13__3__Impl
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeBean__Group_13__3__Impl();
+            rule__DataInterchangeBean__Group_8_2__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -26588,28 +27269,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__3"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__3"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__Group_13__3__Impl"
-    // InternalDataDSL.g:7583:1: rule__DataInterchangeBean__Group_13__3__Impl : ( '}' ) ;
-    public final void rule__DataInterchangeBean__Group_13__3__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_2__3__Impl"
+    // InternalDataDSL.g:7724:1: rule__DataInterchangeBean__Group_8_2__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7587:1: ( ( '}' ) )
-            // InternalDataDSL.g:7588:1: ( '}' )
+            // InternalDataDSL.g:7728:1: ( ( '}' ) )
+            // InternalDataDSL.g:7729:1: ( '}' )
             {
-            // InternalDataDSL.g:7588:1: ( '}' )
-            // InternalDataDSL.g:7589:2: '}'
+            // InternalDataDSL.g:7729:1: ( '}' )
+            // InternalDataDSL.g:7730:2: '}'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3()); 
             }
             match(input,75,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3()); 
             }
 
             }
@@ -26629,20 +27310,1358 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__Group_13__3__Impl"
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_2__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__0"
+    // InternalDataDSL.g:7740:1: rule__DataInterchangeBean__Group_8_3__0 : rule__DataInterchangeBean__Group_8_3__0__Impl rule__DataInterchangeBean__Group_8_3__1 ;
+    public final void rule__DataInterchangeBean__Group_8_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7744:1: ( rule__DataInterchangeBean__Group_8_3__0__Impl rule__DataInterchangeBean__Group_8_3__1 )
+            // InternalDataDSL.g:7745:2: rule__DataInterchangeBean__Group_8_3__0__Impl rule__DataInterchangeBean__Group_8_3__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeBean__Group_8_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__0__Impl"
+    // InternalDataDSL.g:7752:1: rule__DataInterchangeBean__Group_8_3__0__Impl : ( 'expose' ) ;
+    public final void rule__DataInterchangeBean__Group_8_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7756:1: ( ( 'expose' ) )
+            // InternalDataDSL.g:7757:1: ( 'expose' )
+            {
+            // InternalDataDSL.g:7757:1: ( 'expose' )
+            // InternalDataDSL.g:7758:2: 'expose'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0()); 
+            }
+            match(input,98,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__1"
+    // InternalDataDSL.g:7767:1: rule__DataInterchangeBean__Group_8_3__1 : rule__DataInterchangeBean__Group_8_3__1__Impl rule__DataInterchangeBean__Group_8_3__2 ;
+    public final void rule__DataInterchangeBean__Group_8_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7771:1: ( rule__DataInterchangeBean__Group_8_3__1__Impl rule__DataInterchangeBean__Group_8_3__2 )
+            // InternalDataDSL.g:7772:2: rule__DataInterchangeBean__Group_8_3__1__Impl rule__DataInterchangeBean__Group_8_3__2
+            {
+            pushFollow(FOLLOW_37);
+            rule__DataInterchangeBean__Group_8_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_3__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__1__Impl"
+    // InternalDataDSL.g:7779:1: rule__DataInterchangeBean__Group_8_3__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7783:1: ( ( '{' ) )
+            // InternalDataDSL.g:7784:1: ( '{' )
+            {
+            // InternalDataDSL.g:7784:1: ( '{' )
+            // InternalDataDSL.g:7785:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__2"
+    // InternalDataDSL.g:7794:1: rule__DataInterchangeBean__Group_8_3__2 : rule__DataInterchangeBean__Group_8_3__2__Impl rule__DataInterchangeBean__Group_8_3__3 ;
+    public final void rule__DataInterchangeBean__Group_8_3__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7798:1: ( rule__DataInterchangeBean__Group_8_3__2__Impl rule__DataInterchangeBean__Group_8_3__3 )
+            // InternalDataDSL.g:7799:2: rule__DataInterchangeBean__Group_8_3__2__Impl rule__DataInterchangeBean__Group_8_3__3
+            {
+            pushFollow(FOLLOW_37);
+            rule__DataInterchangeBean__Group_8_3__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_3__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__2"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__2__Impl"
+    // InternalDataDSL.g:7806:1: rule__DataInterchangeBean__Group_8_3__2__Impl : ( ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_3__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7810:1: ( ( ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )* ) )
+            // InternalDataDSL.g:7811:1: ( ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )* )
+            {
+            // InternalDataDSL.g:7811:1: ( ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )* )
+            // InternalDataDSL.g:7812:2: ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_8_3_2()); 
+            }
+            // InternalDataDSL.g:7813:2: ( rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 )*
+            loop87:
+            do {
+                int alt87=2;
+                int LA87_0 = input.LA(1);
+
+                if ( (LA87_0==114) ) {
+                    alt87=1;
+                }
+
+
+                switch (alt87) {
+            	case 1 :
+            	    // InternalDataDSL.g:7813:3: rule__DataInterchangeBean__ExportExposesAssignment_8_3_2
+            	    {
+            	    pushFollow(FOLLOW_38);
+            	    rule__DataInterchangeBean__ExportExposesAssignment_8_3_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop87;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesAssignment_8_3_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__3"
+    // InternalDataDSL.g:7821:1: rule__DataInterchangeBean__Group_8_3__3 : rule__DataInterchangeBean__Group_8_3__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_3__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7825:1: ( rule__DataInterchangeBean__Group_8_3__3__Impl )
+            // InternalDataDSL.g:7826:2: rule__DataInterchangeBean__Group_8_3__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_3__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__3"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_3__3__Impl"
+    // InternalDataDSL.g:7832:1: rule__DataInterchangeBean__Group_8_3__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_3__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7836:1: ( ( '}' ) )
+            // InternalDataDSL.g:7837:1: ( '}' )
+            {
+            // InternalDataDSL.g:7837:1: ( '}' )
+            // InternalDataDSL.g:7838:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_3__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__0"
+    // InternalDataDSL.g:7848:1: rule__DataInterchangeBean__Group_8_4__0 : rule__DataInterchangeBean__Group_8_4__0__Impl rule__DataInterchangeBean__Group_8_4__1 ;
+    public final void rule__DataInterchangeBean__Group_8_4__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7852:1: ( rule__DataInterchangeBean__Group_8_4__0__Impl rule__DataInterchangeBean__Group_8_4__1 )
+            // InternalDataDSL.g:7853:2: rule__DataInterchangeBean__Group_8_4__0__Impl rule__DataInterchangeBean__Group_8_4__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeBean__Group_8_4__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_4__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__0__Impl"
+    // InternalDataDSL.g:7860:1: rule__DataInterchangeBean__Group_8_4__0__Impl : ( 'mapping' ) ;
+    public final void rule__DataInterchangeBean__Group_8_4__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7864:1: ( ( 'mapping' ) )
+            // InternalDataDSL.g:7865:1: ( 'mapping' )
+            {
+            // InternalDataDSL.g:7865:1: ( 'mapping' )
+            // InternalDataDSL.g:7866:2: 'mapping'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0()); 
+            }
+            match(input,99,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__1"
+    // InternalDataDSL.g:7875:1: rule__DataInterchangeBean__Group_8_4__1 : rule__DataInterchangeBean__Group_8_4__1__Impl rule__DataInterchangeBean__Group_8_4__2 ;
+    public final void rule__DataInterchangeBean__Group_8_4__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7879:1: ( rule__DataInterchangeBean__Group_8_4__1__Impl rule__DataInterchangeBean__Group_8_4__2 )
+            // InternalDataDSL.g:7880:2: rule__DataInterchangeBean__Group_8_4__1__Impl rule__DataInterchangeBean__Group_8_4__2
+            {
+            pushFollow(FOLLOW_39);
+            rule__DataInterchangeBean__Group_8_4__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_4__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__1__Impl"
+    // InternalDataDSL.g:7887:1: rule__DataInterchangeBean__Group_8_4__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_4__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7891:1: ( ( '{' ) )
+            // InternalDataDSL.g:7892:1: ( '{' )
+            {
+            // InternalDataDSL.g:7892:1: ( '{' )
+            // InternalDataDSL.g:7893:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__2"
+    // InternalDataDSL.g:7902:1: rule__DataInterchangeBean__Group_8_4__2 : rule__DataInterchangeBean__Group_8_4__2__Impl rule__DataInterchangeBean__Group_8_4__3 ;
+    public final void rule__DataInterchangeBean__Group_8_4__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7906:1: ( rule__DataInterchangeBean__Group_8_4__2__Impl rule__DataInterchangeBean__Group_8_4__3 )
+            // InternalDataDSL.g:7907:2: rule__DataInterchangeBean__Group_8_4__2__Impl rule__DataInterchangeBean__Group_8_4__3
+            {
+            pushFollow(FOLLOW_39);
+            rule__DataInterchangeBean__Group_8_4__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_4__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__2"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__2__Impl"
+    // InternalDataDSL.g:7914:1: rule__DataInterchangeBean__Group_8_4__2__Impl : ( ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_4__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7918:1: ( ( ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )* ) )
+            // InternalDataDSL.g:7919:1: ( ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )* )
+            {
+            // InternalDataDSL.g:7919:1: ( ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )* )
+            // InternalDataDSL.g:7920:2: ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_8_4_2()); 
+            }
+            // InternalDataDSL.g:7921:2: ( rule__DataInterchangeBean__MappingsAssignment_8_4_2 )*
+            loop88:
+            do {
+                int alt88=2;
+                int LA88_0 = input.LA(1);
+
+                if ( (LA88_0==120||LA88_0==122||LA88_0==124) ) {
+                    alt88=1;
+                }
+
+
+                switch (alt88) {
+            	case 1 :
+            	    // InternalDataDSL.g:7921:3: rule__DataInterchangeBean__MappingsAssignment_8_4_2
+            	    {
+            	    pushFollow(FOLLOW_40);
+            	    rule__DataInterchangeBean__MappingsAssignment_8_4_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop88;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMappingsAssignment_8_4_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__3"
+    // InternalDataDSL.g:7929:1: rule__DataInterchangeBean__Group_8_4__3 : rule__DataInterchangeBean__Group_8_4__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_4__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7933:1: ( rule__DataInterchangeBean__Group_8_4__3__Impl )
+            // InternalDataDSL.g:7934:2: rule__DataInterchangeBean__Group_8_4__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_4__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__3"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_4__3__Impl"
+    // InternalDataDSL.g:7940:1: rule__DataInterchangeBean__Group_8_4__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_4__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7944:1: ( ( '}' ) )
+            // InternalDataDSL.g:7945:1: ( '}' )
+            {
+            // InternalDataDSL.g:7945:1: ( '}' )
+            // InternalDataDSL.g:7946:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_4__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__0"
+    // InternalDataDSL.g:7956:1: rule__DataInterchangeBean__Group_8_5__0 : rule__DataInterchangeBean__Group_8_5__0__Impl rule__DataInterchangeBean__Group_8_5__1 ;
+    public final void rule__DataInterchangeBean__Group_8_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7960:1: ( rule__DataInterchangeBean__Group_8_5__0__Impl rule__DataInterchangeBean__Group_8_5__1 )
+            // InternalDataDSL.g:7961:2: rule__DataInterchangeBean__Group_8_5__0__Impl rule__DataInterchangeBean__Group_8_5__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeBean__Group_8_5__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_5__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__0__Impl"
+    // InternalDataDSL.g:7968:1: rule__DataInterchangeBean__Group_8_5__0__Impl : ( 'keys' ) ;
+    public final void rule__DataInterchangeBean__Group_8_5__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7972:1: ( ( 'keys' ) )
+            // InternalDataDSL.g:7973:1: ( 'keys' )
+            {
+            // InternalDataDSL.g:7973:1: ( 'keys' )
+            // InternalDataDSL.g:7974:2: 'keys'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0()); 
+            }
+            match(input,100,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__1"
+    // InternalDataDSL.g:7983:1: rule__DataInterchangeBean__Group_8_5__1 : rule__DataInterchangeBean__Group_8_5__1__Impl rule__DataInterchangeBean__Group_8_5__2 ;
+    public final void rule__DataInterchangeBean__Group_8_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7987:1: ( rule__DataInterchangeBean__Group_8_5__1__Impl rule__DataInterchangeBean__Group_8_5__2 )
+            // InternalDataDSL.g:7988:2: rule__DataInterchangeBean__Group_8_5__1__Impl rule__DataInterchangeBean__Group_8_5__2
+            {
+            pushFollow(FOLLOW_41);
+            rule__DataInterchangeBean__Group_8_5__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_5__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__1__Impl"
+    // InternalDataDSL.g:7995:1: rule__DataInterchangeBean__Group_8_5__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_5__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:7999:1: ( ( '{' ) )
+            // InternalDataDSL.g:8000:1: ( '{' )
+            {
+            // InternalDataDSL.g:8000:1: ( '{' )
+            // InternalDataDSL.g:8001:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__2"
+    // InternalDataDSL.g:8010:1: rule__DataInterchangeBean__Group_8_5__2 : rule__DataInterchangeBean__Group_8_5__2__Impl rule__DataInterchangeBean__Group_8_5__3 ;
+    public final void rule__DataInterchangeBean__Group_8_5__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8014:1: ( rule__DataInterchangeBean__Group_8_5__2__Impl rule__DataInterchangeBean__Group_8_5__3 )
+            // InternalDataDSL.g:8015:2: rule__DataInterchangeBean__Group_8_5__2__Impl rule__DataInterchangeBean__Group_8_5__3
+            {
+            pushFollow(FOLLOW_41);
+            rule__DataInterchangeBean__Group_8_5__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_5__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__2"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__2__Impl"
+    // InternalDataDSL.g:8022:1: rule__DataInterchangeBean__Group_8_5__2__Impl : ( ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )* ) ;
+    public final void rule__DataInterchangeBean__Group_8_5__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8026:1: ( ( ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )* ) )
+            // InternalDataDSL.g:8027:1: ( ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )* )
+            {
+            // InternalDataDSL.g:8027:1: ( ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )* )
+            // InternalDataDSL.g:8028:2: ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )*
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_8_5_2()); 
+            }
+            // InternalDataDSL.g:8029:2: ( rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 )*
+            loop89:
+            do {
+                int alt89=2;
+                int LA89_0 = input.LA(1);
+
+                if ( (LA89_0==102) ) {
+                    alt89=1;
+                }
+
+
+                switch (alt89) {
+            	case 1 :
+            	    // InternalDataDSL.g:8029:3: rule__DataInterchangeBean__LookupKeysAssignment_8_5_2
+            	    {
+            	    pushFollow(FOLLOW_42);
+            	    rule__DataInterchangeBean__LookupKeysAssignment_8_5_2();
+
+            	    state._fsp--;
+            	    if (state.failed) return ;
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop89;
+                }
+            } while (true);
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysAssignment_8_5_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__3"
+    // InternalDataDSL.g:8037:1: rule__DataInterchangeBean__Group_8_5__3 : rule__DataInterchangeBean__Group_8_5__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_5__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8041:1: ( rule__DataInterchangeBean__Group_8_5__3__Impl )
+            // InternalDataDSL.g:8042:2: rule__DataInterchangeBean__Group_8_5__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_5__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__3"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_5__3__Impl"
+    // InternalDataDSL.g:8048:1: rule__DataInterchangeBean__Group_8_5__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_5__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8052:1: ( ( '}' ) )
+            // InternalDataDSL.g:8053:1: ( '}' )
+            {
+            // InternalDataDSL.g:8053:1: ( '}' )
+            // InternalDataDSL.g:8054:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_5__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__0"
+    // InternalDataDSL.g:8064:1: rule__DataInterchangeBean__Group_8_6__0 : rule__DataInterchangeBean__Group_8_6__0__Impl rule__DataInterchangeBean__Group_8_6__1 ;
+    public final void rule__DataInterchangeBean__Group_8_6__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8068:1: ( rule__DataInterchangeBean__Group_8_6__0__Impl rule__DataInterchangeBean__Group_8_6__1 )
+            // InternalDataDSL.g:8069:2: rule__DataInterchangeBean__Group_8_6__0__Impl rule__DataInterchangeBean__Group_8_6__1
+            {
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeBean__Group_8_6__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_6__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__0__Impl"
+    // InternalDataDSL.g:8076:1: rule__DataInterchangeBean__Group_8_6__0__Impl : ( 'exportFilter' ) ;
+    public final void rule__DataInterchangeBean__Group_8_6__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8080:1: ( ( 'exportFilter' ) )
+            // InternalDataDSL.g:8081:1: ( 'exportFilter' )
+            {
+            // InternalDataDSL.g:8081:1: ( 'exportFilter' )
+            // InternalDataDSL.g:8082:2: 'exportFilter'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0()); 
+            }
+            match(input,101,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__1"
+    // InternalDataDSL.g:8091:1: rule__DataInterchangeBean__Group_8_6__1 : rule__DataInterchangeBean__Group_8_6__1__Impl rule__DataInterchangeBean__Group_8_6__2 ;
+    public final void rule__DataInterchangeBean__Group_8_6__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8095:1: ( rule__DataInterchangeBean__Group_8_6__1__Impl rule__DataInterchangeBean__Group_8_6__2 )
+            // InternalDataDSL.g:8096:2: rule__DataInterchangeBean__Group_8_6__1__Impl rule__DataInterchangeBean__Group_8_6__2
+            {
+            pushFollow(FOLLOW_43);
+            rule__DataInterchangeBean__Group_8_6__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_6__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__1__Impl"
+    // InternalDataDSL.g:8103:1: rule__DataInterchangeBean__Group_8_6__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeBean__Group_8_6__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8107:1: ( ( '{' ) )
+            // InternalDataDSL.g:8108:1: ( '{' )
+            {
+            // InternalDataDSL.g:8108:1: ( '{' )
+            // InternalDataDSL.g:8109:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__2"
+    // InternalDataDSL.g:8118:1: rule__DataInterchangeBean__Group_8_6__2 : rule__DataInterchangeBean__Group_8_6__2__Impl rule__DataInterchangeBean__Group_8_6__3 ;
+    public final void rule__DataInterchangeBean__Group_8_6__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8122:1: ( rule__DataInterchangeBean__Group_8_6__2__Impl rule__DataInterchangeBean__Group_8_6__3 )
+            // InternalDataDSL.g:8123:2: rule__DataInterchangeBean__Group_8_6__2__Impl rule__DataInterchangeBean__Group_8_6__3
+            {
+            pushFollow(FOLLOW_44);
+            rule__DataInterchangeBean__Group_8_6__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_6__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__2"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__2__Impl"
+    // InternalDataDSL.g:8130:1: rule__DataInterchangeBean__Group_8_6__2__Impl : ( ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 ) ) ;
+    public final void rule__DataInterchangeBean__Group_8_6__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8134:1: ( ( ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 ) ) )
+            // InternalDataDSL.g:8135:1: ( ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 ) )
+            {
+            // InternalDataDSL.g:8135:1: ( ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 ) )
+            // InternalDataDSL.g:8136:2: ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_8_6_2()); 
+            }
+            // InternalDataDSL.g:8137:2: ( rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 )
+            // InternalDataDSL.g:8137:3: rule__DataInterchangeBean__ExportFilterAssignment_8_6_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__ExportFilterAssignment_8_6_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterAssignment_8_6_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__3"
+    // InternalDataDSL.g:8145:1: rule__DataInterchangeBean__Group_8_6__3 : rule__DataInterchangeBean__Group_8_6__3__Impl ;
+    public final void rule__DataInterchangeBean__Group_8_6__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8149:1: ( rule__DataInterchangeBean__Group_8_6__3__Impl )
+            // InternalDataDSL.g:8150:2: rule__DataInterchangeBean__Group_8_6__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeBean__Group_8_6__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__3"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__Group_8_6__3__Impl"
+    // InternalDataDSL.g:8156:1: rule__DataInterchangeBean__Group_8_6__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeBean__Group_8_6__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8160:1: ( ( '}' ) )
+            // InternalDataDSL.g:8161:1: ( '}' )
+            {
+            // InternalDataDSL.g:8161:1: ( '}' )
+            // InternalDataDSL.g:8162:2: '}'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__Group_8_6__3__Impl"
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__0"
-    // InternalDataDSL.g:7599:1: rule__DataInterchangeKey__Group__0 : rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1 ;
+    // InternalDataDSL.g:8172:1: rule__DataInterchangeKey__Group__0 : rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1 ;
     public final void rule__DataInterchangeKey__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7603:1: ( rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1 )
-            // InternalDataDSL.g:7604:2: rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1
+            // InternalDataDSL.g:8176:1: ( rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1 )
+            // InternalDataDSL.g:8177:2: rule__DataInterchangeKey__Group__0__Impl rule__DataInterchangeKey__Group__1
             {
-            pushFollow(FOLLOW_44);
+            pushFollow(FOLLOW_45);
             rule__DataInterchangeKey__Group__0__Impl();
 
             state._fsp--;
@@ -26671,23 +28690,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__0__Impl"
-    // InternalDataDSL.g:7611:1: rule__DataInterchangeKey__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:8184:1: rule__DataInterchangeKey__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeKey__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7615:1: ( ( () ) )
-            // InternalDataDSL.g:7616:1: ( () )
+            // InternalDataDSL.g:8188:1: ( ( () ) )
+            // InternalDataDSL.g:8189:1: ( () )
             {
-            // InternalDataDSL.g:7616:1: ( () )
-            // InternalDataDSL.g:7617:2: ()
+            // InternalDataDSL.g:8189:1: ( () )
+            // InternalDataDSL.g:8190:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getDataInterchangeKeyAction_0()); 
             }
-            // InternalDataDSL.g:7618:2: ()
-            // InternalDataDSL.g:7618:3: 
+            // InternalDataDSL.g:8191:2: ()
+            // InternalDataDSL.g:8191:3: 
             {
             }
 
@@ -26712,14 +28731,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__1"
-    // InternalDataDSL.g:7626:1: rule__DataInterchangeKey__Group__1 : rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2 ;
+    // InternalDataDSL.g:8199:1: rule__DataInterchangeKey__Group__1 : rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2 ;
     public final void rule__DataInterchangeKey__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7630:1: ( rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2 )
-            // InternalDataDSL.g:7631:2: rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2
+            // InternalDataDSL.g:8203:1: ( rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2 )
+            // InternalDataDSL.g:8204:2: rule__DataInterchangeKey__Group__1__Impl rule__DataInterchangeKey__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeKey__Group__1__Impl();
@@ -26750,22 +28769,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__1__Impl"
-    // InternalDataDSL.g:7638:1: rule__DataInterchangeKey__Group__1__Impl : ( 'key' ) ;
+    // InternalDataDSL.g:8211:1: rule__DataInterchangeKey__Group__1__Impl : ( 'key' ) ;
     public final void rule__DataInterchangeKey__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7642:1: ( ( 'key' ) )
-            // InternalDataDSL.g:7643:1: ( 'key' )
+            // InternalDataDSL.g:8215:1: ( ( 'key' ) )
+            // InternalDataDSL.g:8216:1: ( 'key' )
             {
-            // InternalDataDSL.g:7643:1: ( 'key' )
-            // InternalDataDSL.g:7644:2: 'key'
+            // InternalDataDSL.g:8216:1: ( 'key' )
+            // InternalDataDSL.g:8217:2: 'key'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getKeyKeyword_1()); 
             }
-            match(input,100,FOLLOW_2); if (state.failed) return ;
+            match(input,102,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeKeyAccess().getKeyKeyword_1()); 
             }
@@ -26791,14 +28810,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__2"
-    // InternalDataDSL.g:7653:1: rule__DataInterchangeKey__Group__2 : rule__DataInterchangeKey__Group__2__Impl ;
+    // InternalDataDSL.g:8226:1: rule__DataInterchangeKey__Group__2 : rule__DataInterchangeKey__Group__2__Impl ;
     public final void rule__DataInterchangeKey__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7657:1: ( rule__DataInterchangeKey__Group__2__Impl )
-            // InternalDataDSL.g:7658:2: rule__DataInterchangeKey__Group__2__Impl
+            // InternalDataDSL.g:8230:1: ( rule__DataInterchangeKey__Group__2__Impl )
+            // InternalDataDSL.g:8231:2: rule__DataInterchangeKey__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeKey__Group__2__Impl();
@@ -26824,23 +28843,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeKey__Group__2__Impl"
-    // InternalDataDSL.g:7664:1: rule__DataInterchangeKey__Group__2__Impl : ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:8237:1: rule__DataInterchangeKey__Group__2__Impl : ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeKey__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7668:1: ( ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:7669:1: ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:8241:1: ( ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:8242:1: ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:7669:1: ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) )
-            // InternalDataDSL.g:7670:2: ( rule__DataInterchangeKey__PropertyAssignment_2 )
+            // InternalDataDSL.g:8242:1: ( ( rule__DataInterchangeKey__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:8243:2: ( rule__DataInterchangeKey__PropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:7671:2: ( rule__DataInterchangeKey__PropertyAssignment_2 )
-            // InternalDataDSL.g:7671:3: rule__DataInterchangeKey__PropertyAssignment_2
+            // InternalDataDSL.g:8244:2: ( rule__DataInterchangeKey__PropertyAssignment_2 )
+            // InternalDataDSL.g:8244:3: rule__DataInterchangeKey__PropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeKey__PropertyAssignment_2();
@@ -26875,16 +28894,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__0"
-    // InternalDataDSL.g:7680:1: rule__DataInterchangeLookup__Group__0 : rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1 ;
+    // InternalDataDSL.g:8253:1: rule__DataInterchangeLookup__Group__0 : rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1 ;
     public final void rule__DataInterchangeLookup__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7684:1: ( rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1 )
-            // InternalDataDSL.g:7685:2: rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1
+            // InternalDataDSL.g:8257:1: ( rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1 )
+            // InternalDataDSL.g:8258:2: rule__DataInterchangeLookup__Group__0__Impl rule__DataInterchangeLookup__Group__1
             {
-            pushFollow(FOLLOW_45);
+            pushFollow(FOLLOW_46);
             rule__DataInterchangeLookup__Group__0__Impl();
 
             state._fsp--;
@@ -26913,23 +28932,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__0__Impl"
-    // InternalDataDSL.g:7692:1: rule__DataInterchangeLookup__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:8265:1: rule__DataInterchangeLookup__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeLookup__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7696:1: ( ( () ) )
-            // InternalDataDSL.g:7697:1: ( () )
+            // InternalDataDSL.g:8269:1: ( ( () ) )
+            // InternalDataDSL.g:8270:1: ( () )
             {
-            // InternalDataDSL.g:7697:1: ( () )
-            // InternalDataDSL.g:7698:2: ()
+            // InternalDataDSL.g:8270:1: ( () )
+            // InternalDataDSL.g:8271:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getDataInterchangeLookupAction_0()); 
             }
-            // InternalDataDSL.g:7699:2: ()
-            // InternalDataDSL.g:7699:3: 
+            // InternalDataDSL.g:8272:2: ()
+            // InternalDataDSL.g:8272:3: 
             {
             }
 
@@ -26954,14 +28973,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__1"
-    // InternalDataDSL.g:7707:1: rule__DataInterchangeLookup__Group__1 : rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2 ;
+    // InternalDataDSL.g:8280:1: rule__DataInterchangeLookup__Group__1 : rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2 ;
     public final void rule__DataInterchangeLookup__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7711:1: ( rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2 )
-            // InternalDataDSL.g:7712:2: rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2
+            // InternalDataDSL.g:8284:1: ( rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2 )
+            // InternalDataDSL.g:8285:2: rule__DataInterchangeLookup__Group__1__Impl rule__DataInterchangeLookup__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeLookup__Group__1__Impl();
@@ -26992,22 +29011,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__1__Impl"
-    // InternalDataDSL.g:7719:1: rule__DataInterchangeLookup__Group__1__Impl : ( 'for' ) ;
+    // InternalDataDSL.g:8292:1: rule__DataInterchangeLookup__Group__1__Impl : ( 'for' ) ;
     public final void rule__DataInterchangeLookup__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7723:1: ( ( 'for' ) )
-            // InternalDataDSL.g:7724:1: ( 'for' )
+            // InternalDataDSL.g:8296:1: ( ( 'for' ) )
+            // InternalDataDSL.g:8297:1: ( 'for' )
             {
-            // InternalDataDSL.g:7724:1: ( 'for' )
-            // InternalDataDSL.g:7725:2: 'for'
+            // InternalDataDSL.g:8297:1: ( 'for' )
+            // InternalDataDSL.g:8298:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getForKeyword_1()); 
             }
-            match(input,101,FOLLOW_2); if (state.failed) return ;
+            match(input,103,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeLookupAccess().getForKeyword_1()); 
             }
@@ -27033,16 +29052,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__2"
-    // InternalDataDSL.g:7734:1: rule__DataInterchangeLookup__Group__2 : rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3 ;
+    // InternalDataDSL.g:8307:1: rule__DataInterchangeLookup__Group__2 : rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3 ;
     public final void rule__DataInterchangeLookup__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7738:1: ( rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3 )
-            // InternalDataDSL.g:7739:2: rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3
+            // InternalDataDSL.g:8311:1: ( rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3 )
+            // InternalDataDSL.g:8312:2: rule__DataInterchangeLookup__Group__2__Impl rule__DataInterchangeLookup__Group__3
             {
-            pushFollow(FOLLOW_46);
+            pushFollow(FOLLOW_47);
             rule__DataInterchangeLookup__Group__2__Impl();
 
             state._fsp--;
@@ -27071,23 +29090,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__2__Impl"
-    // InternalDataDSL.g:7746:1: rule__DataInterchangeLookup__Group__2__Impl : ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:8319:1: rule__DataInterchangeLookup__Group__2__Impl : ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeLookup__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7750:1: ( ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:7751:1: ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:8323:1: ( ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:8324:1: ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:7751:1: ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) )
-            // InternalDataDSL.g:7752:2: ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:8324:1: ( ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:8325:2: ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getTargetPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:7753:2: ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 )
-            // InternalDataDSL.g:7753:3: rule__DataInterchangeLookup__TargetPropertyAssignment_2
+            // InternalDataDSL.g:8326:2: ( rule__DataInterchangeLookup__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:8326:3: rule__DataInterchangeLookup__TargetPropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeLookup__TargetPropertyAssignment_2();
@@ -27122,14 +29141,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__3"
-    // InternalDataDSL.g:7761:1: rule__DataInterchangeLookup__Group__3 : rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4 ;
+    // InternalDataDSL.g:8334:1: rule__DataInterchangeLookup__Group__3 : rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4 ;
     public final void rule__DataInterchangeLookup__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7765:1: ( rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4 )
-            // InternalDataDSL.g:7766:2: rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4
+            // InternalDataDSL.g:8338:1: ( rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4 )
+            // InternalDataDSL.g:8339:2: rule__DataInterchangeLookup__Group__3__Impl rule__DataInterchangeLookup__Group__4
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeLookup__Group__3__Impl();
@@ -27160,24 +29179,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__3__Impl"
-    // InternalDataDSL.g:7773:1: rule__DataInterchangeLookup__Group__3__Impl : ( 'on' ) ;
+    // InternalDataDSL.g:8346:1: rule__DataInterchangeLookup__Group__3__Impl : ( 'in' ) ;
     public final void rule__DataInterchangeLookup__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7777:1: ( ( 'on' ) )
-            // InternalDataDSL.g:7778:1: ( 'on' )
+            // InternalDataDSL.g:8350:1: ( ( 'in' ) )
+            // InternalDataDSL.g:8351:1: ( 'in' )
             {
-            // InternalDataDSL.g:7778:1: ( 'on' )
-            // InternalDataDSL.g:7779:2: 'on'
+            // InternalDataDSL.g:8351:1: ( 'in' )
+            // InternalDataDSL.g:8352:2: 'in'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3()); 
             }
-            match(input,102,FOLLOW_2); if (state.failed) return ;
+            match(input,104,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3()); 
             }
 
             }
@@ -27201,16 +29220,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__4"
-    // InternalDataDSL.g:7788:1: rule__DataInterchangeLookup__Group__4 : rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5 ;
+    // InternalDataDSL.g:8361:1: rule__DataInterchangeLookup__Group__4 : rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5 ;
     public final void rule__DataInterchangeLookup__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7792:1: ( rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5 )
-            // InternalDataDSL.g:7793:2: rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5
+            // InternalDataDSL.g:8365:1: ( rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5 )
+            // InternalDataDSL.g:8366:2: rule__DataInterchangeLookup__Group__4__Impl rule__DataInterchangeLookup__Group__5
             {
-            pushFollow(FOLLOW_47);
+            pushFollow(FOLLOW_48);
             rule__DataInterchangeLookup__Group__4__Impl();
 
             state._fsp--;
@@ -27239,23 +29258,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__4__Impl"
-    // InternalDataDSL.g:7800:1: rule__DataInterchangeLookup__Group__4__Impl : ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) ) ;
+    // InternalDataDSL.g:8373:1: rule__DataInterchangeLookup__Group__4__Impl : ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) ) ;
     public final void rule__DataInterchangeLookup__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7804:1: ( ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) ) )
-            // InternalDataDSL.g:7805:1: ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) )
+            // InternalDataDSL.g:8377:1: ( ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) ) )
+            // InternalDataDSL.g:8378:1: ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) )
             {
-            // InternalDataDSL.g:7805:1: ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) )
-            // InternalDataDSL.g:7806:2: ( rule__DataInterchangeLookup__EntityAssignment_4 )
+            // InternalDataDSL.g:8378:1: ( ( rule__DataInterchangeLookup__EntityAssignment_4 ) )
+            // InternalDataDSL.g:8379:2: ( rule__DataInterchangeLookup__EntityAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getEntityAssignment_4()); 
             }
-            // InternalDataDSL.g:7807:2: ( rule__DataInterchangeLookup__EntityAssignment_4 )
-            // InternalDataDSL.g:7807:3: rule__DataInterchangeLookup__EntityAssignment_4
+            // InternalDataDSL.g:8380:2: ( rule__DataInterchangeLookup__EntityAssignment_4 )
+            // InternalDataDSL.g:8380:3: rule__DataInterchangeLookup__EntityAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeLookup__EntityAssignment_4();
@@ -27290,16 +29309,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__5"
-    // InternalDataDSL.g:7815:1: rule__DataInterchangeLookup__Group__5 : rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6 ;
+    // InternalDataDSL.g:8388:1: rule__DataInterchangeLookup__Group__5 : rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6 ;
     public final void rule__DataInterchangeLookup__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7819:1: ( rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6 )
-            // InternalDataDSL.g:7820:2: rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6
+            // InternalDataDSL.g:8392:1: ( rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6 )
+            // InternalDataDSL.g:8393:2: rule__DataInterchangeLookup__Group__5__Impl rule__DataInterchangeLookup__Group__6
             {
-            pushFollow(FOLLOW_47);
+            pushFollow(FOLLOW_21);
             rule__DataInterchangeLookup__Group__5__Impl();
 
             state._fsp--;
@@ -27328,45 +29347,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__5__Impl"
-    // InternalDataDSL.g:7827:1: rule__DataInterchangeLookup__Group__5__Impl : ( ( rule__DataInterchangeLookup__Group_5__0 )? ) ;
+    // InternalDataDSL.g:8400:1: rule__DataInterchangeLookup__Group__5__Impl : ( 'createOn' ) ;
     public final void rule__DataInterchangeLookup__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7831:1: ( ( ( rule__DataInterchangeLookup__Group_5__0 )? ) )
-            // InternalDataDSL.g:7832:1: ( ( rule__DataInterchangeLookup__Group_5__0 )? )
+            // InternalDataDSL.g:8404:1: ( ( 'createOn' ) )
+            // InternalDataDSL.g:8405:1: ( 'createOn' )
             {
-            // InternalDataDSL.g:7832:1: ( ( rule__DataInterchangeLookup__Group_5__0 )? )
-            // InternalDataDSL.g:7833:2: ( rule__DataInterchangeLookup__Group_5__0 )?
+            // InternalDataDSL.g:8405:1: ( 'createOn' )
+            // InternalDataDSL.g:8406:2: 'createOn'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getGroup_5()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5()); 
             }
-            // InternalDataDSL.g:7834:2: ( rule__DataInterchangeLookup__Group_5__0 )?
-            int alt86=2;
-            int LA86_0 = input.LA(1);
-
-            if ( (LA86_0==92) ) {
-                alt86=1;
-            }
-            switch (alt86) {
-                case 1 :
-                    // InternalDataDSL.g:7834:3: rule__DataInterchangeLookup__Group_5__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__Group_5__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
+            match(input,94,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getGroup_5()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5()); 
             }
 
             }
@@ -27390,16 +29388,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__6"
-    // InternalDataDSL.g:7842:1: rule__DataInterchangeLookup__Group__6 : rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7 ;
+    // InternalDataDSL.g:8415:1: rule__DataInterchangeLookup__Group__6 : rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7 ;
     public final void rule__DataInterchangeLookup__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7846:1: ( rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7 )
-            // InternalDataDSL.g:7847:2: rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7
+            // InternalDataDSL.g:8419:1: ( rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7 )
+            // InternalDataDSL.g:8420:2: rule__DataInterchangeLookup__Group__6__Impl rule__DataInterchangeLookup__Group__7
             {
-            pushFollow(FOLLOW_7);
+            pushFollow(FOLLOW_49);
             rule__DataInterchangeLookup__Group__6__Impl();
 
             state._fsp--;
@@ -27428,24 +29426,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__6__Impl"
-    // InternalDataDSL.g:7854:1: rule__DataInterchangeLookup__Group__6__Impl : ( 'with' ) ;
+    // InternalDataDSL.g:8427:1: rule__DataInterchangeLookup__Group__6__Impl : ( ( rule__DataInterchangeLookup__ElementMapAssignment_6 ) ) ;
     public final void rule__DataInterchangeLookup__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7858:1: ( ( 'with' ) )
-            // InternalDataDSL.g:7859:1: ( 'with' )
+            // InternalDataDSL.g:8431:1: ( ( ( rule__DataInterchangeLookup__ElementMapAssignment_6 ) ) )
+            // InternalDataDSL.g:8432:1: ( ( rule__DataInterchangeLookup__ElementMapAssignment_6 ) )
             {
-            // InternalDataDSL.g:7859:1: ( 'with' )
-            // InternalDataDSL.g:7860:2: 'with'
+            // InternalDataDSL.g:8432:1: ( ( rule__DataInterchangeLookup__ElementMapAssignment_6 ) )
+            // InternalDataDSL.g:8433:2: ( rule__DataInterchangeLookup__ElementMapAssignment_6 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_6()); 
             }
-            match(input,103,FOLLOW_2); if (state.failed) return ;
+            // InternalDataDSL.g:8434:2: ( rule__DataInterchangeLookup__ElementMapAssignment_6 )
+            // InternalDataDSL.g:8434:3: rule__DataInterchangeLookup__ElementMapAssignment_6
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__ElementMapAssignment_6();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_6()); 
             }
 
             }
@@ -27469,16 +29477,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__7"
-    // InternalDataDSL.g:7869:1: rule__DataInterchangeLookup__Group__7 : rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8 ;
+    // InternalDataDSL.g:8442:1: rule__DataInterchangeLookup__Group__7 : rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8 ;
     public final void rule__DataInterchangeLookup__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7873:1: ( rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8 )
-            // InternalDataDSL.g:7874:2: rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8
+            // InternalDataDSL.g:8446:1: ( rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8 )
+            // InternalDataDSL.g:8447:2: rule__DataInterchangeLookup__Group__7__Impl rule__DataInterchangeLookup__Group__8
             {
-            pushFollow(FOLLOW_48);
+            pushFollow(FOLLOW_21);
             rule__DataInterchangeLookup__Group__7__Impl();
 
             state._fsp--;
@@ -27507,34 +29515,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__7__Impl"
-    // InternalDataDSL.g:7881:1: rule__DataInterchangeLookup__Group__7__Impl : ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 ) ) ;
+    // InternalDataDSL.g:8454:1: rule__DataInterchangeLookup__Group__7__Impl : ( 'mapFrom' ) ;
     public final void rule__DataInterchangeLookup__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7885:1: ( ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 ) ) )
-            // InternalDataDSL.g:7886:1: ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 ) )
+            // InternalDataDSL.g:8458:1: ( ( 'mapFrom' ) )
+            // InternalDataDSL.g:8459:1: ( 'mapFrom' )
             {
-            // InternalDataDSL.g:7886:1: ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 ) )
-            // InternalDataDSL.g:7887:2: ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 )
+            // InternalDataDSL.g:8459:1: ( 'mapFrom' )
+            // InternalDataDSL.g:8460:2: 'mapFrom'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_7()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7()); 
             }
-            // InternalDataDSL.g:7888:2: ( rule__DataInterchangeLookup__QueryPropertyAssignment_7 )
-            // InternalDataDSL.g:7888:3: rule__DataInterchangeLookup__QueryPropertyAssignment_7
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__QueryPropertyAssignment_7();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
+            match(input,105,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_7()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7()); 
             }
 
             }
@@ -27558,16 +29556,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__8"
-    // InternalDataDSL.g:7896:1: rule__DataInterchangeLookup__Group__8 : rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9 ;
+    // InternalDataDSL.g:8469:1: rule__DataInterchangeLookup__Group__8 : rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9 ;
     public final void rule__DataInterchangeLookup__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7900:1: ( rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9 )
-            // InternalDataDSL.g:7901:2: rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9
+            // InternalDataDSL.g:8473:1: ( rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9 )
+            // InternalDataDSL.g:8474:2: rule__DataInterchangeLookup__Group__8__Impl rule__DataInterchangeLookup__Group__9
             {
-            pushFollow(FOLLOW_48);
+            pushFollow(FOLLOW_50);
             rule__DataInterchangeLookup__Group__8__Impl();
 
             state._fsp--;
@@ -27596,45 +29594,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__8__Impl"
-    // InternalDataDSL.g:7908:1: rule__DataInterchangeLookup__Group__8__Impl : ( ( rule__DataInterchangeLookup__Group_8__0 )? ) ;
+    // InternalDataDSL.g:8481:1: rule__DataInterchangeLookup__Group__8__Impl : ( ( rule__DataInterchangeLookup__DataMapAssignment_8 ) ) ;
     public final void rule__DataInterchangeLookup__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7912:1: ( ( ( rule__DataInterchangeLookup__Group_8__0 )? ) )
-            // InternalDataDSL.g:7913:1: ( ( rule__DataInterchangeLookup__Group_8__0 )? )
+            // InternalDataDSL.g:8485:1: ( ( ( rule__DataInterchangeLookup__DataMapAssignment_8 ) ) )
+            // InternalDataDSL.g:8486:1: ( ( rule__DataInterchangeLookup__DataMapAssignment_8 ) )
             {
-            // InternalDataDSL.g:7913:1: ( ( rule__DataInterchangeLookup__Group_8__0 )? )
-            // InternalDataDSL.g:7914:2: ( rule__DataInterchangeLookup__Group_8__0 )?
+            // InternalDataDSL.g:8486:1: ( ( rule__DataInterchangeLookup__DataMapAssignment_8 ) )
+            // InternalDataDSL.g:8487:2: ( rule__DataInterchangeLookup__DataMapAssignment_8 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getGroup_8()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_8()); 
             }
-            // InternalDataDSL.g:7915:2: ( rule__DataInterchangeLookup__Group_8__0 )?
-            int alt87=2;
-            int LA87_0 = input.LA(1);
+            // InternalDataDSL.g:8488:2: ( rule__DataInterchangeLookup__DataMapAssignment_8 )
+            // InternalDataDSL.g:8488:3: rule__DataInterchangeLookup__DataMapAssignment_8
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__DataMapAssignment_8();
 
-            if ( (LA87_0==157) ) {
-                alt87=1;
-            }
-            switch (alt87) {
-                case 1 :
-                    // InternalDataDSL.g:7915:3: rule__DataInterchangeLookup__Group_8__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__Group_8__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
+            state._fsp--;
+            if (state.failed) return ;
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getGroup_8()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_8()); 
             }
 
             }
@@ -27658,16 +29645,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__9"
-    // InternalDataDSL.g:7923:1: rule__DataInterchangeLookup__Group__9 : rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10 ;
+    // InternalDataDSL.g:8496:1: rule__DataInterchangeLookup__Group__9 : rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10 ;
     public final void rule__DataInterchangeLookup__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7927:1: ( rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10 )
-            // InternalDataDSL.g:7928:2: rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10
+            // InternalDataDSL.g:8500:1: ( rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10 )
+            // InternalDataDSL.g:8501:2: rule__DataInterchangeLookup__Group__9__Impl rule__DataInterchangeLookup__Group__10
             {
-            pushFollow(FOLLOW_48);
+            pushFollow(FOLLOW_51);
             rule__DataInterchangeLookup__Group__9__Impl();
 
             state._fsp--;
@@ -27696,45 +29683,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__9__Impl"
-    // InternalDataDSL.g:7935:1: rule__DataInterchangeLookup__Group__9__Impl : ( ( rule__DataInterchangeLookup__Group_9__0 )? ) ;
+    // InternalDataDSL.g:8508:1: rule__DataInterchangeLookup__Group__9__Impl : ( ( rule__DataInterchangeLookup__UnorderedGroup_9 ) ) ;
     public final void rule__DataInterchangeLookup__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7939:1: ( ( ( rule__DataInterchangeLookup__Group_9__0 )? ) )
-            // InternalDataDSL.g:7940:1: ( ( rule__DataInterchangeLookup__Group_9__0 )? )
+            // InternalDataDSL.g:8512:1: ( ( ( rule__DataInterchangeLookup__UnorderedGroup_9 ) ) )
+            // InternalDataDSL.g:8513:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_9 ) )
             {
-            // InternalDataDSL.g:7940:1: ( ( rule__DataInterchangeLookup__Group_9__0 )? )
-            // InternalDataDSL.g:7941:2: ( rule__DataInterchangeLookup__Group_9__0 )?
+            // InternalDataDSL.g:8513:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_9 ) )
+            // InternalDataDSL.g:8514:2: ( rule__DataInterchangeLookup__UnorderedGroup_9 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getGroup_9()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9()); 
             }
-            // InternalDataDSL.g:7942:2: ( rule__DataInterchangeLookup__Group_9__0 )?
-            int alt88=2;
-            int LA88_0 = input.LA(1);
+            // InternalDataDSL.g:8515:2: ( rule__DataInterchangeLookup__UnorderedGroup_9 )
+            // InternalDataDSL.g:8515:3: rule__DataInterchangeLookup__UnorderedGroup_9
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__UnorderedGroup_9();
 
-            if ( (LA88_0==104) ) {
-                alt88=1;
-            }
-            switch (alt88) {
-                case 1 :
-                    // InternalDataDSL.g:7942:3: rule__DataInterchangeLookup__Group_9__0
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__Group_9__0();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
+            state._fsp--;
+            if (state.failed) return ;
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getGroup_9()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9()); 
             }
 
             }
@@ -27758,20 +29734,25 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__10"
-    // InternalDataDSL.g:7950:1: rule__DataInterchangeLookup__Group__10 : rule__DataInterchangeLookup__Group__10__Impl ;
+    // InternalDataDSL.g:8523:1: rule__DataInterchangeLookup__Group__10 : rule__DataInterchangeLookup__Group__10__Impl rule__DataInterchangeLookup__Group__11 ;
     public final void rule__DataInterchangeLookup__Group__10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7954:1: ( rule__DataInterchangeLookup__Group__10__Impl )
-            // InternalDataDSL.g:7955:2: rule__DataInterchangeLookup__Group__10__Impl
+            // InternalDataDSL.g:8527:1: ( rule__DataInterchangeLookup__Group__10__Impl rule__DataInterchangeLookup__Group__11 )
+            // InternalDataDSL.g:8528:2: rule__DataInterchangeLookup__Group__10__Impl rule__DataInterchangeLookup__Group__11
             {
-            pushFollow(FOLLOW_2);
+            pushFollow(FOLLOW_7);
             rule__DataInterchangeLookup__Group__10__Impl();
 
             state._fsp--;
             if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__Group__11();
+
+            state._fsp--;
+            if (state.failed) return ;
 
             }
 
@@ -27791,34 +29772,24 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__Group__10__Impl"
-    // InternalDataDSL.g:7961:1: rule__DataInterchangeLookup__Group__10__Impl : ( ( rule__DataInterchangeLookup__UnorderedGroup_10 ) ) ;
+    // InternalDataDSL.g:8535:1: rule__DataInterchangeLookup__Group__10__Impl : ( 'mapTo' ) ;
     public final void rule__DataInterchangeLookup__Group__10__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7965:1: ( ( ( rule__DataInterchangeLookup__UnorderedGroup_10 ) ) )
-            // InternalDataDSL.g:7966:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_10 ) )
+            // InternalDataDSL.g:8539:1: ( ( 'mapTo' ) )
+            // InternalDataDSL.g:8540:1: ( 'mapTo' )
             {
-            // InternalDataDSL.g:7966:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_10 ) )
-            // InternalDataDSL.g:7967:2: ( rule__DataInterchangeLookup__UnorderedGroup_10 )
+            // InternalDataDSL.g:8540:1: ( 'mapTo' )
+            // InternalDataDSL.g:8541:2: 'mapTo'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10()); 
             }
-            // InternalDataDSL.g:7968:2: ( rule__DataInterchangeLookup__UnorderedGroup_10 )
-            // InternalDataDSL.g:7968:3: rule__DataInterchangeLookup__UnorderedGroup_10
-            {
-            pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__UnorderedGroup_10();
-
-            state._fsp--;
-            if (state.failed) return ;
-
-            }
-
+            match(input,106,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10()); 
             }
 
             }
@@ -27841,23 +29812,23 @@
     // $ANTLR end "rule__DataInterchangeLookup__Group__10__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_5__0"
-    // InternalDataDSL.g:7977:1: rule__DataInterchangeLookup__Group_5__0 : rule__DataInterchangeLookup__Group_5__0__Impl rule__DataInterchangeLookup__Group_5__1 ;
-    public final void rule__DataInterchangeLookup__Group_5__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group__11"
+    // InternalDataDSL.g:8550:1: rule__DataInterchangeLookup__Group__11 : rule__DataInterchangeLookup__Group__11__Impl rule__DataInterchangeLookup__Group__12 ;
+    public final void rule__DataInterchangeLookup__Group__11() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7981:1: ( rule__DataInterchangeLookup__Group_5__0__Impl rule__DataInterchangeLookup__Group_5__1 )
-            // InternalDataDSL.g:7982:2: rule__DataInterchangeLookup__Group_5__0__Impl rule__DataInterchangeLookup__Group_5__1
+            // InternalDataDSL.g:8554:1: ( rule__DataInterchangeLookup__Group__11__Impl rule__DataInterchangeLookup__Group__12 )
+            // InternalDataDSL.g:8555:2: rule__DataInterchangeLookup__Group__11__Impl rule__DataInterchangeLookup__Group__12
             {
-            pushFollow(FOLLOW_21);
-            rule__DataInterchangeLookup__Group_5__0__Impl();
+            pushFollow(FOLLOW_52);
+            rule__DataInterchangeLookup__Group__11__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_5__1();
+            rule__DataInterchangeLookup__Group__12();
 
             state._fsp--;
             if (state.failed) return ;
@@ -27876,62 +29847,77 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_5__0"
+    // $ANTLR end "rule__DataInterchangeLookup__Group__11"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_5__0__Impl"
-    // InternalDataDSL.g:7989:1: rule__DataInterchangeLookup__Group_5__0__Impl : ( 'createOn' ) ;
-    public final void rule__DataInterchangeLookup__Group_5__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group__11__Impl"
+    // InternalDataDSL.g:8562:1: rule__DataInterchangeLookup__Group__11__Impl : ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 ) ) ;
+    public final void rule__DataInterchangeLookup__Group__11__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:7993:1: ( ( 'createOn' ) )
-            // InternalDataDSL.g:7994:1: ( 'createOn' )
+            // InternalDataDSL.g:8566:1: ( ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 ) ) )
+            // InternalDataDSL.g:8567:1: ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 ) )
             {
-            // InternalDataDSL.g:7994:1: ( 'createOn' )
-            // InternalDataDSL.g:7995:2: 'createOn'
+            // InternalDataDSL.g:8567:1: ( ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 ) )
+            // InternalDataDSL.g:8568:2: ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_11()); 
             }
-            match(input,92,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_5__0__Impl"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__Group_5__1"
-    // InternalDataDSL.g:8004:1: rule__DataInterchangeLookup__Group_5__1 : rule__DataInterchangeLookup__Group_5__1__Impl ;
-    public final void rule__DataInterchangeLookup__Group_5__1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:8008:1: ( rule__DataInterchangeLookup__Group_5__1__Impl )
-            // InternalDataDSL.g:8009:2: rule__DataInterchangeLookup__Group_5__1__Impl
+            // InternalDataDSL.g:8569:2: ( rule__DataInterchangeLookup__QueryPropertyAssignment_11 )
+            // InternalDataDSL.g:8569:3: rule__DataInterchangeLookup__QueryPropertyAssignment_11
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_5__1__Impl();
+            rule__DataInterchangeLookup__QueryPropertyAssignment_11();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyAssignment_11()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group__11__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group__12"
+    // InternalDataDSL.g:8577:1: rule__DataInterchangeLookup__Group__12 : rule__DataInterchangeLookup__Group__12__Impl rule__DataInterchangeLookup__Group__13 ;
+    public final void rule__DataInterchangeLookup__Group__12() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8581:1: ( rule__DataInterchangeLookup__Group__12__Impl rule__DataInterchangeLookup__Group__13 )
+            // InternalDataDSL.g:8582:2: rule__DataInterchangeLookup__Group__12__Impl rule__DataInterchangeLookup__Group__13
+            {
+            pushFollow(FOLLOW_52);
+            rule__DataInterchangeLookup__Group__12__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__Group__13();
 
             state._fsp--;
             if (state.failed) return ;
@@ -27950,38 +29936,144 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_5__1"
+    // $ANTLR end "rule__DataInterchangeLookup__Group__12"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_5__1__Impl"
-    // InternalDataDSL.g:8015:1: rule__DataInterchangeLookup__Group_5__1__Impl : ( ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 ) ) ;
-    public final void rule__DataInterchangeLookup__Group_5__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group__12__Impl"
+    // InternalDataDSL.g:8589:1: rule__DataInterchangeLookup__Group__12__Impl : ( ( rule__DataInterchangeLookup__Group_12__0 )? ) ;
+    public final void rule__DataInterchangeLookup__Group__12__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8019:1: ( ( ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 ) ) )
-            // InternalDataDSL.g:8020:1: ( ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 ) )
+            // InternalDataDSL.g:8593:1: ( ( ( rule__DataInterchangeLookup__Group_12__0 )? ) )
+            // InternalDataDSL.g:8594:1: ( ( rule__DataInterchangeLookup__Group_12__0 )? )
             {
-            // InternalDataDSL.g:8020:1: ( ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 ) )
-            // InternalDataDSL.g:8021:2: ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 )
+            // InternalDataDSL.g:8594:1: ( ( rule__DataInterchangeLookup__Group_12__0 )? )
+            // InternalDataDSL.g:8595:2: ( rule__DataInterchangeLookup__Group_12__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_5_1()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getGroup_12()); 
             }
-            // InternalDataDSL.g:8022:2: ( rule__DataInterchangeLookup__ElementMapAssignment_5_1 )
-            // InternalDataDSL.g:8022:3: rule__DataInterchangeLookup__ElementMapAssignment_5_1
+            // InternalDataDSL.g:8596:2: ( rule__DataInterchangeLookup__Group_12__0 )?
+            int alt90=2;
+            int LA90_0 = input.LA(1);
+
+            if ( (LA90_0==164) ) {
+                alt90=1;
+            }
+            switch (alt90) {
+                case 1 :
+                    // InternalDataDSL.g:8596:3: rule__DataInterchangeLookup__Group_12__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__Group_12__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getGroup_12()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group__12__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group__13"
+    // InternalDataDSL.g:8604:1: rule__DataInterchangeLookup__Group__13 : rule__DataInterchangeLookup__Group__13__Impl ;
+    public final void rule__DataInterchangeLookup__Group__13() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8608:1: ( rule__DataInterchangeLookup__Group__13__Impl )
+            // InternalDataDSL.g:8609:2: rule__DataInterchangeLookup__Group__13__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__ElementMapAssignment_5_1();
+            rule__DataInterchangeLookup__Group__13__Impl();
 
             state._fsp--;
             if (state.failed) return ;
 
             }
 
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group__13"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group__13__Impl"
+    // InternalDataDSL.g:8615:1: rule__DataInterchangeLookup__Group__13__Impl : ( ( rule__DataInterchangeLookup__Group_13__0 )? ) ;
+    public final void rule__DataInterchangeLookup__Group__13__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8619:1: ( ( ( rule__DataInterchangeLookup__Group_13__0 )? ) )
+            // InternalDataDSL.g:8620:1: ( ( rule__DataInterchangeLookup__Group_13__0 )? )
+            {
+            // InternalDataDSL.g:8620:1: ( ( rule__DataInterchangeLookup__Group_13__0 )? )
+            // InternalDataDSL.g:8621:2: ( rule__DataInterchangeLookup__Group_13__0 )?
+            {
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getElementMapAssignment_5_1()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getGroup_13()); 
+            }
+            // InternalDataDSL.g:8622:2: ( rule__DataInterchangeLookup__Group_13__0 )?
+            int alt91=2;
+            int LA91_0 = input.LA(1);
+
+            if ( (LA91_0==107) ) {
+                alt91=1;
+            }
+            switch (alt91) {
+                case 1 :
+                    // InternalDataDSL.g:8622:3: rule__DataInterchangeLookup__Group_13__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__Group_13__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getGroup_13()); 
             }
 
             }
@@ -28001,26 +30093,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_5__1__Impl"
+    // $ANTLR end "rule__DataInterchangeLookup__Group__13__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_8__0"
-    // InternalDataDSL.g:8031:1: rule__DataInterchangeLookup__Group_8__0 : rule__DataInterchangeLookup__Group_8__0__Impl rule__DataInterchangeLookup__Group_8__1 ;
-    public final void rule__DataInterchangeLookup__Group_8__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_12__0"
+    // InternalDataDSL.g:8631:1: rule__DataInterchangeLookup__Group_12__0 : rule__DataInterchangeLookup__Group_12__0__Impl rule__DataInterchangeLookup__Group_12__1 ;
+    public final void rule__DataInterchangeLookup__Group_12__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8035:1: ( rule__DataInterchangeLookup__Group_8__0__Impl rule__DataInterchangeLookup__Group_8__1 )
-            // InternalDataDSL.g:8036:2: rule__DataInterchangeLookup__Group_8__0__Impl rule__DataInterchangeLookup__Group_8__1
+            // InternalDataDSL.g:8635:1: ( rule__DataInterchangeLookup__Group_12__0__Impl rule__DataInterchangeLookup__Group_12__1 )
+            // InternalDataDSL.g:8636:2: rule__DataInterchangeLookup__Group_12__0__Impl rule__DataInterchangeLookup__Group_12__1
             {
             pushFollow(FOLLOW_22);
-            rule__DataInterchangeLookup__Group_8__0__Impl();
+            rule__DataInterchangeLookup__Group_12__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_8__1();
+            rule__DataInterchangeLookup__Group_12__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -28039,30 +30131,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_8__0"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_12__0"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_8__0__Impl"
-    // InternalDataDSL.g:8043:1: rule__DataInterchangeLookup__Group_8__0__Impl : ( ( rule__DataInterchangeLookup__CachedAssignment_8_0 ) ) ;
-    public final void rule__DataInterchangeLookup__Group_8__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_12__0__Impl"
+    // InternalDataDSL.g:8643:1: rule__DataInterchangeLookup__Group_12__0__Impl : ( ( rule__DataInterchangeLookup__CachedAssignment_12_0 ) ) ;
+    public final void rule__DataInterchangeLookup__Group_12__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8047:1: ( ( ( rule__DataInterchangeLookup__CachedAssignment_8_0 ) ) )
-            // InternalDataDSL.g:8048:1: ( ( rule__DataInterchangeLookup__CachedAssignment_8_0 ) )
+            // InternalDataDSL.g:8647:1: ( ( ( rule__DataInterchangeLookup__CachedAssignment_12_0 ) ) )
+            // InternalDataDSL.g:8648:1: ( ( rule__DataInterchangeLookup__CachedAssignment_12_0 ) )
             {
-            // InternalDataDSL.g:8048:1: ( ( rule__DataInterchangeLookup__CachedAssignment_8_0 ) )
-            // InternalDataDSL.g:8049:2: ( rule__DataInterchangeLookup__CachedAssignment_8_0 )
+            // InternalDataDSL.g:8648:1: ( ( rule__DataInterchangeLookup__CachedAssignment_12_0 ) )
+            // InternalDataDSL.g:8649:2: ( rule__DataInterchangeLookup__CachedAssignment_12_0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_8_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_12_0()); 
             }
-            // InternalDataDSL.g:8050:2: ( rule__DataInterchangeLookup__CachedAssignment_8_0 )
-            // InternalDataDSL.g:8050:3: rule__DataInterchangeLookup__CachedAssignment_8_0
+            // InternalDataDSL.g:8650:2: ( rule__DataInterchangeLookup__CachedAssignment_12_0 )
+            // InternalDataDSL.g:8650:3: rule__DataInterchangeLookup__CachedAssignment_12_0
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__CachedAssignment_8_0();
+            rule__DataInterchangeLookup__CachedAssignment_12_0();
 
             state._fsp--;
             if (state.failed) return ;
@@ -28070,7 +30162,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_8_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getCachedAssignment_12_0()); 
             }
 
             }
@@ -28090,21 +30182,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_8__0__Impl"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_12__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_8__1"
-    // InternalDataDSL.g:8058:1: rule__DataInterchangeLookup__Group_8__1 : rule__DataInterchangeLookup__Group_8__1__Impl ;
-    public final void rule__DataInterchangeLookup__Group_8__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_12__1"
+    // InternalDataDSL.g:8658:1: rule__DataInterchangeLookup__Group_12__1 : rule__DataInterchangeLookup__Group_12__1__Impl ;
+    public final void rule__DataInterchangeLookup__Group_12__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8062:1: ( rule__DataInterchangeLookup__Group_8__1__Impl )
-            // InternalDataDSL.g:8063:2: rule__DataInterchangeLookup__Group_8__1__Impl
+            // InternalDataDSL.g:8662:1: ( rule__DataInterchangeLookup__Group_12__1__Impl )
+            // InternalDataDSL.g:8663:2: rule__DataInterchangeLookup__Group_12__1__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_8__1__Impl();
+            rule__DataInterchangeLookup__Group_12__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -28123,30 +30215,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_8__1"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_12__1"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_8__1__Impl"
-    // InternalDataDSL.g:8069:1: rule__DataInterchangeLookup__Group_8__1__Impl : ( ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 ) ) ;
-    public final void rule__DataInterchangeLookup__Group_8__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_12__1__Impl"
+    // InternalDataDSL.g:8669:1: rule__DataInterchangeLookup__Group_12__1__Impl : ( ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 ) ) ;
+    public final void rule__DataInterchangeLookup__Group_12__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8073:1: ( ( ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 ) ) )
-            // InternalDataDSL.g:8074:1: ( ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 ) )
+            // InternalDataDSL.g:8673:1: ( ( ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 ) ) )
+            // InternalDataDSL.g:8674:1: ( ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 ) )
             {
-            // InternalDataDSL.g:8074:1: ( ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 ) )
-            // InternalDataDSL.g:8075:2: ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 )
+            // InternalDataDSL.g:8674:1: ( ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 ) )
+            // InternalDataDSL.g:8675:2: ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_8_1()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_12_1()); 
             }
-            // InternalDataDSL.g:8076:2: ( rule__DataInterchangeLookup__CacheSizeAssignment_8_1 )
-            // InternalDataDSL.g:8076:3: rule__DataInterchangeLookup__CacheSizeAssignment_8_1
+            // InternalDataDSL.g:8676:2: ( rule__DataInterchangeLookup__CacheSizeAssignment_12_1 )
+            // InternalDataDSL.g:8676:3: rule__DataInterchangeLookup__CacheSizeAssignment_12_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__CacheSizeAssignment_8_1();
+            rule__DataInterchangeLookup__CacheSizeAssignment_12_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -28154,7 +30246,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_8_1()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeAssignment_12_1()); 
             }
 
             }
@@ -28174,26 +30266,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_8__1__Impl"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_12__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_9__0"
-    // InternalDataDSL.g:8085:1: rule__DataInterchangeLookup__Group_9__0 : rule__DataInterchangeLookup__Group_9__0__Impl rule__DataInterchangeLookup__Group_9__1 ;
-    public final void rule__DataInterchangeLookup__Group_9__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__0"
+    // InternalDataDSL.g:8685:1: rule__DataInterchangeLookup__Group_13__0 : rule__DataInterchangeLookup__Group_13__0__Impl rule__DataInterchangeLookup__Group_13__1 ;
+    public final void rule__DataInterchangeLookup__Group_13__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8089:1: ( rule__DataInterchangeLookup__Group_9__0__Impl rule__DataInterchangeLookup__Group_9__1 )
-            // InternalDataDSL.g:8090:2: rule__DataInterchangeLookup__Group_9__0__Impl rule__DataInterchangeLookup__Group_9__1
+            // InternalDataDSL.g:8689:1: ( rule__DataInterchangeLookup__Group_13__0__Impl rule__DataInterchangeLookup__Group_13__1 )
+            // InternalDataDSL.g:8690:2: rule__DataInterchangeLookup__Group_13__0__Impl rule__DataInterchangeLookup__Group_13__1
             {
-            pushFollow(FOLLOW_21);
-            rule__DataInterchangeLookup__Group_9__0__Impl();
+            pushFollow(FOLLOW_8);
+            rule__DataInterchangeLookup__Group_13__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_9__1();
+            rule__DataInterchangeLookup__Group_13__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -28212,28 +30304,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_9__0"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__0"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_9__0__Impl"
-    // InternalDataDSL.g:8097:1: rule__DataInterchangeLookup__Group_9__0__Impl : ( 'mapTo' ) ;
-    public final void rule__DataInterchangeLookup__Group_9__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__0__Impl"
+    // InternalDataDSL.g:8697:1: rule__DataInterchangeLookup__Group_13__0__Impl : ( 'where' ) ;
+    public final void rule__DataInterchangeLookup__Group_13__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8101:1: ( ( 'mapTo' ) )
-            // InternalDataDSL.g:8102:1: ( 'mapTo' )
+            // InternalDataDSL.g:8701:1: ( ( 'where' ) )
+            // InternalDataDSL.g:8702:1: ( 'where' )
             {
-            // InternalDataDSL.g:8102:1: ( 'mapTo' )
-            // InternalDataDSL.g:8103:2: 'mapTo'
+            // InternalDataDSL.g:8702:1: ( 'where' )
+            // InternalDataDSL.g:8703:2: 'where'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0()); 
             }
-            match(input,104,FOLLOW_2); if (state.failed) return ;
+            match(input,107,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0()); 
             }
 
             }
@@ -28253,27 +30345,162 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_9__0__Impl"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_9__1"
-    // InternalDataDSL.g:8112:1: rule__DataInterchangeLookup__Group_9__1 : rule__DataInterchangeLookup__Group_9__1__Impl ;
-    public final void rule__DataInterchangeLookup__Group_9__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__1"
+    // InternalDataDSL.g:8712:1: rule__DataInterchangeLookup__Group_13__1 : rule__DataInterchangeLookup__Group_13__1__Impl rule__DataInterchangeLookup__Group_13__2 ;
+    public final void rule__DataInterchangeLookup__Group_13__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8116:1: ( rule__DataInterchangeLookup__Group_9__1__Impl )
-            // InternalDataDSL.g:8117:2: rule__DataInterchangeLookup__Group_9__1__Impl
+            // InternalDataDSL.g:8716:1: ( rule__DataInterchangeLookup__Group_13__1__Impl rule__DataInterchangeLookup__Group_13__2 )
+            // InternalDataDSL.g:8717:2: rule__DataInterchangeLookup__Group_13__1__Impl rule__DataInterchangeLookup__Group_13__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__DataInterchangeLookup__Group_13__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__Group_13__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__1__Impl"
+    // InternalDataDSL.g:8724:1: rule__DataInterchangeLookup__Group_13__1__Impl : ( '{' ) ;
+    public final void rule__DataInterchangeLookup__Group_13__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8728:1: ( ( '{' ) )
+            // InternalDataDSL.g:8729:1: ( '{' )
+            {
+            // InternalDataDSL.g:8729:1: ( '{' )
+            // InternalDataDSL.g:8730:2: '{'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1()); 
+            }
+            match(input,74,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__2"
+    // InternalDataDSL.g:8739:1: rule__DataInterchangeLookup__Group_13__2 : rule__DataInterchangeLookup__Group_13__2__Impl rule__DataInterchangeLookup__Group_13__3 ;
+    public final void rule__DataInterchangeLookup__Group_13__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8743:1: ( rule__DataInterchangeLookup__Group_13__2__Impl rule__DataInterchangeLookup__Group_13__3 )
+            // InternalDataDSL.g:8744:2: rule__DataInterchangeLookup__Group_13__2__Impl rule__DataInterchangeLookup__Group_13__3
+            {
+            pushFollow(FOLLOW_44);
+            rule__DataInterchangeLookup__Group_13__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__Group_13__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__2"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__2__Impl"
+    // InternalDataDSL.g:8751:1: rule__DataInterchangeLookup__Group_13__2__Impl : ( ( rule__DataInterchangeLookup__ConditionAssignment_13_2 ) ) ;
+    public final void rule__DataInterchangeLookup__Group_13__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8755:1: ( ( ( rule__DataInterchangeLookup__ConditionAssignment_13_2 ) ) )
+            // InternalDataDSL.g:8756:1: ( ( rule__DataInterchangeLookup__ConditionAssignment_13_2 ) )
+            {
+            // InternalDataDSL.g:8756:1: ( ( rule__DataInterchangeLookup__ConditionAssignment_13_2 ) )
+            // InternalDataDSL.g:8757:2: ( rule__DataInterchangeLookup__ConditionAssignment_13_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getConditionAssignment_13_2()); 
+            }
+            // InternalDataDSL.g:8758:2: ( rule__DataInterchangeLookup__ConditionAssignment_13_2 )
+            // InternalDataDSL.g:8758:3: rule__DataInterchangeLookup__ConditionAssignment_13_2
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__Group_9__1__Impl();
+            rule__DataInterchangeLookup__ConditionAssignment_13_2();
 
             state._fsp--;
             if (state.failed) return ;
 
             }
 
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getConditionAssignment_13_2()); 
+            }
+
+            }
+
+
+            }
+
         }
         catch (RecognitionException re) {
             reportError(re);
@@ -28286,38 +30513,61 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_9__1"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__2__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__Group_9__1__Impl"
-    // InternalDataDSL.g:8123:1: rule__DataInterchangeLookup__Group_9__1__Impl : ( ( rule__DataInterchangeLookup__DataMapAssignment_9_1 ) ) ;
-    public final void rule__DataInterchangeLookup__Group_9__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__3"
+    // InternalDataDSL.g:8766:1: rule__DataInterchangeLookup__Group_13__3 : rule__DataInterchangeLookup__Group_13__3__Impl ;
+    public final void rule__DataInterchangeLookup__Group_13__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8127:1: ( ( ( rule__DataInterchangeLookup__DataMapAssignment_9_1 ) ) )
-            // InternalDataDSL.g:8128:1: ( ( rule__DataInterchangeLookup__DataMapAssignment_9_1 ) )
-            {
-            // InternalDataDSL.g:8128:1: ( ( rule__DataInterchangeLookup__DataMapAssignment_9_1 ) )
-            // InternalDataDSL.g:8129:2: ( rule__DataInterchangeLookup__DataMapAssignment_9_1 )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_9_1()); 
-            }
-            // InternalDataDSL.g:8130:2: ( rule__DataInterchangeLookup__DataMapAssignment_9_1 )
-            // InternalDataDSL.g:8130:3: rule__DataInterchangeLookup__DataMapAssignment_9_1
+            // InternalDataDSL.g:8770:1: ( rule__DataInterchangeLookup__Group_13__3__Impl )
+            // InternalDataDSL.g:8771:2: rule__DataInterchangeLookup__Group_13__3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__DataMapAssignment_9_1();
+            rule__DataInterchangeLookup__Group_13__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
 
             }
 
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__3"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__Group_13__3__Impl"
+    // InternalDataDSL.g:8777:1: rule__DataInterchangeLookup__Group_13__3__Impl : ( '}' ) ;
+    public final void rule__DataInterchangeLookup__Group_13__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:8781:1: ( ( '}' ) )
+            // InternalDataDSL.g:8782:1: ( '}' )
+            {
+            // InternalDataDSL.g:8782:1: ( '}' )
+            // InternalDataDSL.g:8783:2: '}'
+            {
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getDataMapAssignment_9_1()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3()); 
+            }
+            match(input,75,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3()); 
             }
 
             }
@@ -28337,20 +30587,20 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__Group_9__1__Impl"
+    // $ANTLR end "rule__DataInterchangeLookup__Group_13__3__Impl"
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__0"
-    // InternalDataDSL.g:8139:1: rule__DataInterchangeMarkerPath__Group__0 : rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1 ;
+    // InternalDataDSL.g:8793:1: rule__DataInterchangeMarkerPath__Group__0 : rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1 ;
     public final void rule__DataInterchangeMarkerPath__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8143:1: ( rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1 )
-            // InternalDataDSL.g:8144:2: rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1
+            // InternalDataDSL.g:8797:1: ( rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1 )
+            // InternalDataDSL.g:8798:2: rule__DataInterchangeMarkerPath__Group__0__Impl rule__DataInterchangeMarkerPath__Group__1
             {
-            pushFollow(FOLLOW_49);
+            pushFollow(FOLLOW_50);
             rule__DataInterchangeMarkerPath__Group__0__Impl();
 
             state._fsp--;
@@ -28379,23 +30629,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__0__Impl"
-    // InternalDataDSL.g:8151:1: rule__DataInterchangeMarkerPath__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:8805:1: rule__DataInterchangeMarkerPath__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeMarkerPath__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8155:1: ( ( () ) )
-            // InternalDataDSL.g:8156:1: ( () )
+            // InternalDataDSL.g:8809:1: ( ( () ) )
+            // InternalDataDSL.g:8810:1: ( () )
             {
-            // InternalDataDSL.g:8156:1: ( () )
-            // InternalDataDSL.g:8157:2: ()
+            // InternalDataDSL.g:8810:1: ( () )
+            // InternalDataDSL.g:8811:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getDataInterchangeMarkerPathAction_0()); 
             }
-            // InternalDataDSL.g:8158:2: ()
-            // InternalDataDSL.g:8158:3: 
+            // InternalDataDSL.g:8812:2: ()
+            // InternalDataDSL.g:8812:3: 
             {
             }
 
@@ -28420,14 +30670,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__1"
-    // InternalDataDSL.g:8166:1: rule__DataInterchangeMarkerPath__Group__1 : rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2 ;
+    // InternalDataDSL.g:8820:1: rule__DataInterchangeMarkerPath__Group__1 : rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2 ;
     public final void rule__DataInterchangeMarkerPath__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8170:1: ( rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2 )
-            // InternalDataDSL.g:8171:2: rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2
+            // InternalDataDSL.g:8824:1: ( rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2 )
+            // InternalDataDSL.g:8825:2: rule__DataInterchangeMarkerPath__Group__1__Impl rule__DataInterchangeMarkerPath__Group__2
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchangeMarkerPath__Group__1__Impl();
@@ -28458,22 +30708,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__1__Impl"
-    // InternalDataDSL.g:8178:1: rule__DataInterchangeMarkerPath__Group__1__Impl : ( 'markerPath' ) ;
+    // InternalDataDSL.g:8832:1: rule__DataInterchangeMarkerPath__Group__1__Impl : ( 'markerPath' ) ;
     public final void rule__DataInterchangeMarkerPath__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8182:1: ( ( 'markerPath' ) )
-            // InternalDataDSL.g:8183:1: ( 'markerPath' )
+            // InternalDataDSL.g:8836:1: ( ( 'markerPath' ) )
+            // InternalDataDSL.g:8837:1: ( 'markerPath' )
             {
-            // InternalDataDSL.g:8183:1: ( 'markerPath' )
-            // InternalDataDSL.g:8184:2: 'markerPath'
+            // InternalDataDSL.g:8837:1: ( 'markerPath' )
+            // InternalDataDSL.g:8838:2: 'markerPath'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getMarkerPathKeyword_1()); 
             }
-            match(input,105,FOLLOW_2); if (state.failed) return ;
+            match(input,108,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeMarkerPathAccess().getMarkerPathKeyword_1()); 
             }
@@ -28499,16 +30749,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__2"
-    // InternalDataDSL.g:8193:1: rule__DataInterchangeMarkerPath__Group__2 : rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3 ;
+    // InternalDataDSL.g:8847:1: rule__DataInterchangeMarkerPath__Group__2 : rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3 ;
     public final void rule__DataInterchangeMarkerPath__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8197:1: ( rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3 )
-            // InternalDataDSL.g:8198:2: rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3
+            // InternalDataDSL.g:8851:1: ( rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3 )
+            // InternalDataDSL.g:8852:2: rule__DataInterchangeMarkerPath__Group__2__Impl rule__DataInterchangeMarkerPath__Group__3
             {
-            pushFollow(FOLLOW_50);
+            pushFollow(FOLLOW_53);
             rule__DataInterchangeMarkerPath__Group__2__Impl();
 
             state._fsp--;
@@ -28537,17 +30787,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__2__Impl"
-    // InternalDataDSL.g:8205:1: rule__DataInterchangeMarkerPath__Group__2__Impl : ( '{' ) ;
+    // InternalDataDSL.g:8859:1: rule__DataInterchangeMarkerPath__Group__2__Impl : ( '{' ) ;
     public final void rule__DataInterchangeMarkerPath__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8209:1: ( ( '{' ) )
-            // InternalDataDSL.g:8210:1: ( '{' )
+            // InternalDataDSL.g:8863:1: ( ( '{' ) )
+            // InternalDataDSL.g:8864:1: ( '{' )
             {
-            // InternalDataDSL.g:8210:1: ( '{' )
-            // InternalDataDSL.g:8211:2: '{'
+            // InternalDataDSL.g:8864:1: ( '{' )
+            // InternalDataDSL.g:8865:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getLeftCurlyBracketKeyword_2()); 
@@ -28578,16 +30828,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__3"
-    // InternalDataDSL.g:8220:1: rule__DataInterchangeMarkerPath__Group__3 : rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4 ;
+    // InternalDataDSL.g:8874:1: rule__DataInterchangeMarkerPath__Group__3 : rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4 ;
     public final void rule__DataInterchangeMarkerPath__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8224:1: ( rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4 )
-            // InternalDataDSL.g:8225:2: rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4
+            // InternalDataDSL.g:8878:1: ( rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4 )
+            // InternalDataDSL.g:8879:2: rule__DataInterchangeMarkerPath__Group__3__Impl rule__DataInterchangeMarkerPath__Group__4
             {
-            pushFollow(FOLLOW_50);
+            pushFollow(FOLLOW_53);
             rule__DataInterchangeMarkerPath__Group__3__Impl();
 
             state._fsp--;
@@ -28616,37 +30866,37 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__3__Impl"
-    // InternalDataDSL.g:8232:1: rule__DataInterchangeMarkerPath__Group__3__Impl : ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* ) ;
+    // InternalDataDSL.g:8886:1: rule__DataInterchangeMarkerPath__Group__3__Impl : ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* ) ;
     public final void rule__DataInterchangeMarkerPath__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8236:1: ( ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* ) )
-            // InternalDataDSL.g:8237:1: ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* )
+            // InternalDataDSL.g:8890:1: ( ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* ) )
+            // InternalDataDSL.g:8891:1: ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* )
             {
-            // InternalDataDSL.g:8237:1: ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* )
-            // InternalDataDSL.g:8238:2: ( rule__DataInterchangeMarkerPath__PathAssignment_3 )*
+            // InternalDataDSL.g:8891:1: ( ( rule__DataInterchangeMarkerPath__PathAssignment_3 )* )
+            // InternalDataDSL.g:8892:2: ( rule__DataInterchangeMarkerPath__PathAssignment_3 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getPathAssignment_3()); 
             }
-            // InternalDataDSL.g:8239:2: ( rule__DataInterchangeMarkerPath__PathAssignment_3 )*
-            loop89:
+            // InternalDataDSL.g:8893:2: ( rule__DataInterchangeMarkerPath__PathAssignment_3 )*
+            loop92:
             do {
-                int alt89=2;
-                int LA89_0 = input.LA(1);
+                int alt92=2;
+                int LA92_0 = input.LA(1);
 
-                if ( (LA89_0==106) ) {
-                    alt89=1;
+                if ( (LA92_0==109) ) {
+                    alt92=1;
                 }
 
 
-                switch (alt89) {
+                switch (alt92) {
             	case 1 :
-            	    // InternalDataDSL.g:8239:3: rule__DataInterchangeMarkerPath__PathAssignment_3
+            	    // InternalDataDSL.g:8893:3: rule__DataInterchangeMarkerPath__PathAssignment_3
             	    {
-            	    pushFollow(FOLLOW_51);
+            	    pushFollow(FOLLOW_54);
             	    rule__DataInterchangeMarkerPath__PathAssignment_3();
 
             	    state._fsp--;
@@ -28656,7 +30906,7 @@
             	    break;
 
             	default :
-            	    break loop89;
+            	    break loop92;
                 }
             } while (true);
 
@@ -28685,14 +30935,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__4"
-    // InternalDataDSL.g:8247:1: rule__DataInterchangeMarkerPath__Group__4 : rule__DataInterchangeMarkerPath__Group__4__Impl ;
+    // InternalDataDSL.g:8901:1: rule__DataInterchangeMarkerPath__Group__4 : rule__DataInterchangeMarkerPath__Group__4__Impl ;
     public final void rule__DataInterchangeMarkerPath__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8251:1: ( rule__DataInterchangeMarkerPath__Group__4__Impl )
-            // InternalDataDSL.g:8252:2: rule__DataInterchangeMarkerPath__Group__4__Impl
+            // InternalDataDSL.g:8905:1: ( rule__DataInterchangeMarkerPath__Group__4__Impl )
+            // InternalDataDSL.g:8906:2: rule__DataInterchangeMarkerPath__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerPath__Group__4__Impl();
@@ -28718,17 +30968,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__Group__4__Impl"
-    // InternalDataDSL.g:8258:1: rule__DataInterchangeMarkerPath__Group__4__Impl : ( '}' ) ;
+    // InternalDataDSL.g:8912:1: rule__DataInterchangeMarkerPath__Group__4__Impl : ( '}' ) ;
     public final void rule__DataInterchangeMarkerPath__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8262:1: ( ( '}' ) )
-            // InternalDataDSL.g:8263:1: ( '}' )
+            // InternalDataDSL.g:8916:1: ( ( '}' ) )
+            // InternalDataDSL.g:8917:1: ( '}' )
             {
-            // InternalDataDSL.g:8263:1: ( '}' )
-            // InternalDataDSL.g:8264:2: '}'
+            // InternalDataDSL.g:8917:1: ( '}' )
+            // InternalDataDSL.g:8918:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getRightCurlyBracketKeyword_4()); 
@@ -28759,16 +31009,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__0"
-    // InternalDataDSL.g:8274:1: rule__DataInterchangeMarkerEntity__Group__0 : rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1 ;
+    // InternalDataDSL.g:8928:1: rule__DataInterchangeMarkerEntity__Group__0 : rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1 ;
     public final void rule__DataInterchangeMarkerEntity__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8278:1: ( rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1 )
-            // InternalDataDSL.g:8279:2: rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1
+            // InternalDataDSL.g:8932:1: ( rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1 )
+            // InternalDataDSL.g:8933:2: rule__DataInterchangeMarkerEntity__Group__0__Impl rule__DataInterchangeMarkerEntity__Group__1
             {
-            pushFollow(FOLLOW_52);
+            pushFollow(FOLLOW_55);
             rule__DataInterchangeMarkerEntity__Group__0__Impl();
 
             state._fsp--;
@@ -28797,23 +31047,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__0__Impl"
-    // InternalDataDSL.g:8286:1: rule__DataInterchangeMarkerEntity__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:8940:1: rule__DataInterchangeMarkerEntity__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeMarkerEntity__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8290:1: ( ( () ) )
-            // InternalDataDSL.g:8291:1: ( () )
+            // InternalDataDSL.g:8944:1: ( ( () ) )
+            // InternalDataDSL.g:8945:1: ( () )
             {
-            // InternalDataDSL.g:8291:1: ( () )
-            // InternalDataDSL.g:8292:2: ()
+            // InternalDataDSL.g:8945:1: ( () )
+            // InternalDataDSL.g:8946:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getDataInterchangeMarkerEntityAction_0()); 
             }
-            // InternalDataDSL.g:8293:2: ()
-            // InternalDataDSL.g:8293:3: 
+            // InternalDataDSL.g:8947:2: ()
+            // InternalDataDSL.g:8947:3: 
             {
             }
 
@@ -28838,14 +31088,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__1"
-    // InternalDataDSL.g:8301:1: rule__DataInterchangeMarkerEntity__Group__1 : rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2 ;
+    // InternalDataDSL.g:8955:1: rule__DataInterchangeMarkerEntity__Group__1 : rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2 ;
     public final void rule__DataInterchangeMarkerEntity__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8305:1: ( rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2 )
-            // InternalDataDSL.g:8306:2: rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2
+            // InternalDataDSL.g:8959:1: ( rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2 )
+            // InternalDataDSL.g:8960:2: rule__DataInterchangeMarkerEntity__Group__1__Impl rule__DataInterchangeMarkerEntity__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeMarkerEntity__Group__1__Impl();
@@ -28876,22 +31126,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__1__Impl"
-    // InternalDataDSL.g:8313:1: rule__DataInterchangeMarkerEntity__Group__1__Impl : ( 'markerEntity' ) ;
+    // InternalDataDSL.g:8967:1: rule__DataInterchangeMarkerEntity__Group__1__Impl : ( 'markerEntity' ) ;
     public final void rule__DataInterchangeMarkerEntity__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8317:1: ( ( 'markerEntity' ) )
-            // InternalDataDSL.g:8318:1: ( 'markerEntity' )
+            // InternalDataDSL.g:8971:1: ( ( 'markerEntity' ) )
+            // InternalDataDSL.g:8972:1: ( 'markerEntity' )
             {
-            // InternalDataDSL.g:8318:1: ( 'markerEntity' )
-            // InternalDataDSL.g:8319:2: 'markerEntity'
+            // InternalDataDSL.g:8972:1: ( 'markerEntity' )
+            // InternalDataDSL.g:8973:2: 'markerEntity'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityKeyword_1()); 
             }
-            match(input,106,FOLLOW_2); if (state.failed) return ;
+            match(input,109,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityKeyword_1()); 
             }
@@ -28917,16 +31167,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__2"
-    // InternalDataDSL.g:8328:1: rule__DataInterchangeMarkerEntity__Group__2 : rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3 ;
+    // InternalDataDSL.g:8982:1: rule__DataInterchangeMarkerEntity__Group__2 : rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3 ;
     public final void rule__DataInterchangeMarkerEntity__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8332:1: ( rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3 )
-            // InternalDataDSL.g:8333:2: rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3
+            // InternalDataDSL.g:8986:1: ( rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3 )
+            // InternalDataDSL.g:8987:2: rule__DataInterchangeMarkerEntity__Group__2__Impl rule__DataInterchangeMarkerEntity__Group__3
             {
-            pushFollow(FOLLOW_53);
+            pushFollow(FOLLOW_56);
             rule__DataInterchangeMarkerEntity__Group__2__Impl();
 
             state._fsp--;
@@ -28955,23 +31205,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__2__Impl"
-    // InternalDataDSL.g:8340:1: rule__DataInterchangeMarkerEntity__Group__2__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) ) ;
+    // InternalDataDSL.g:8994:1: rule__DataInterchangeMarkerEntity__Group__2__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) ) ;
     public final void rule__DataInterchangeMarkerEntity__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8344:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) ) )
-            // InternalDataDSL.g:8345:1: ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) )
+            // InternalDataDSL.g:8998:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) ) )
+            // InternalDataDSL.g:8999:1: ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) )
             {
-            // InternalDataDSL.g:8345:1: ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) )
-            // InternalDataDSL.g:8346:2: ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 )
+            // InternalDataDSL.g:8999:1: ( ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 ) )
+            // InternalDataDSL.g:9000:2: ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityAssignment_2()); 
             }
-            // InternalDataDSL.g:8347:2: ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 )
-            // InternalDataDSL.g:8347:3: rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2
+            // InternalDataDSL.g:9001:2: ( rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 )
+            // InternalDataDSL.g:9001:3: rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2();
@@ -29006,14 +31256,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__3"
-    // InternalDataDSL.g:8355:1: rule__DataInterchangeMarkerEntity__Group__3 : rule__DataInterchangeMarkerEntity__Group__3__Impl ;
+    // InternalDataDSL.g:9009:1: rule__DataInterchangeMarkerEntity__Group__3 : rule__DataInterchangeMarkerEntity__Group__3__Impl ;
     public final void rule__DataInterchangeMarkerEntity__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8359:1: ( rule__DataInterchangeMarkerEntity__Group__3__Impl )
-            // InternalDataDSL.g:8360:2: rule__DataInterchangeMarkerEntity__Group__3__Impl
+            // InternalDataDSL.g:9013:1: ( rule__DataInterchangeMarkerEntity__Group__3__Impl )
+            // InternalDataDSL.g:9014:2: rule__DataInterchangeMarkerEntity__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__Group__3__Impl();
@@ -29039,31 +31289,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group__3__Impl"
-    // InternalDataDSL.g:8366:1: rule__DataInterchangeMarkerEntity__Group__3__Impl : ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? ) ;
+    // InternalDataDSL.g:9020:1: rule__DataInterchangeMarkerEntity__Group__3__Impl : ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? ) ;
     public final void rule__DataInterchangeMarkerEntity__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8370:1: ( ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? ) )
-            // InternalDataDSL.g:8371:1: ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? )
+            // InternalDataDSL.g:9024:1: ( ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? ) )
+            // InternalDataDSL.g:9025:1: ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? )
             {
-            // InternalDataDSL.g:8371:1: ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? )
-            // InternalDataDSL.g:8372:2: ( rule__DataInterchangeMarkerEntity__Group_3__0 )?
+            // InternalDataDSL.g:9025:1: ( ( rule__DataInterchangeMarkerEntity__Group_3__0 )? )
+            // InternalDataDSL.g:9026:2: ( rule__DataInterchangeMarkerEntity__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:8373:2: ( rule__DataInterchangeMarkerEntity__Group_3__0 )?
-            int alt90=2;
-            int LA90_0 = input.LA(1);
+            // InternalDataDSL.g:9027:2: ( rule__DataInterchangeMarkerEntity__Group_3__0 )?
+            int alt93=2;
+            int LA93_0 = input.LA(1);
 
-            if ( (LA90_0==160) ) {
-                alt90=1;
+            if ( (LA93_0==165) ) {
+                alt93=1;
             }
-            switch (alt90) {
+            switch (alt93) {
                 case 1 :
-                    // InternalDataDSL.g:8373:3: rule__DataInterchangeMarkerEntity__Group_3__0
+                    // InternalDataDSL.g:9027:3: rule__DataInterchangeMarkerEntity__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeMarkerEntity__Group_3__0();
@@ -29101,14 +31351,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group_3__0"
-    // InternalDataDSL.g:8382:1: rule__DataInterchangeMarkerEntity__Group_3__0 : rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1 ;
+    // InternalDataDSL.g:9036:1: rule__DataInterchangeMarkerEntity__Group_3__0 : rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1 ;
     public final void rule__DataInterchangeMarkerEntity__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8386:1: ( rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1 )
-            // InternalDataDSL.g:8387:2: rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1
+            // InternalDataDSL.g:9040:1: ( rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1 )
+            // InternalDataDSL.g:9041:2: rule__DataInterchangeMarkerEntity__Group_3__0__Impl rule__DataInterchangeMarkerEntity__Group_3__1
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeMarkerEntity__Group_3__0__Impl();
@@ -29139,23 +31389,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group_3__0__Impl"
-    // InternalDataDSL.g:8394:1: rule__DataInterchangeMarkerEntity__Group_3__0__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:9048:1: rule__DataInterchangeMarkerEntity__Group_3__0__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) ) ;
     public final void rule__DataInterchangeMarkerEntity__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8398:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) ) )
-            // InternalDataDSL.g:8399:1: ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) )
+            // InternalDataDSL.g:9052:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) ) )
+            // InternalDataDSL.g:9053:1: ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:8399:1: ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) )
-            // InternalDataDSL.g:8400:2: ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 )
+            // InternalDataDSL.g:9053:1: ( ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 ) )
+            // InternalDataDSL.g:9054:2: ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestAssignment_3_0()); 
             }
-            // InternalDataDSL.g:8401:2: ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 )
-            // InternalDataDSL.g:8401:3: rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0
+            // InternalDataDSL.g:9055:2: ( rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 )
+            // InternalDataDSL.g:9055:3: rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0();
@@ -29190,14 +31440,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group_3__1"
-    // InternalDataDSL.g:8409:1: rule__DataInterchangeMarkerEntity__Group_3__1 : rule__DataInterchangeMarkerEntity__Group_3__1__Impl ;
+    // InternalDataDSL.g:9063:1: rule__DataInterchangeMarkerEntity__Group_3__1 : rule__DataInterchangeMarkerEntity__Group_3__1__Impl ;
     public final void rule__DataInterchangeMarkerEntity__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8413:1: ( rule__DataInterchangeMarkerEntity__Group_3__1__Impl )
-            // InternalDataDSL.g:8414:2: rule__DataInterchangeMarkerEntity__Group_3__1__Impl
+            // InternalDataDSL.g:9067:1: ( rule__DataInterchangeMarkerEntity__Group_3__1__Impl )
+            // InternalDataDSL.g:9068:2: rule__DataInterchangeMarkerEntity__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__Group_3__1__Impl();
@@ -29223,23 +31473,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__Group_3__1__Impl"
-    // InternalDataDSL.g:8420:1: rule__DataInterchangeMarkerEntity__Group_3__1__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) ) ;
+    // InternalDataDSL.g:9074:1: rule__DataInterchangeMarkerEntity__Group_3__1__Impl : ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) ) ;
     public final void rule__DataInterchangeMarkerEntity__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8424:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) ) )
-            // InternalDataDSL.g:8425:1: ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) )
+            // InternalDataDSL.g:9078:1: ( ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) ) )
+            // InternalDataDSL.g:9079:1: ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:8425:1: ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) )
-            // InternalDataDSL.g:8426:2: ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 )
+            // InternalDataDSL.g:9079:1: ( ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 ) )
+            // InternalDataDSL.g:9080:2: ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerPropertyAssignment_3_1()); 
             }
-            // InternalDataDSL.g:8427:2: ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 )
-            // InternalDataDSL.g:8427:3: rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1
+            // InternalDataDSL.g:9081:2: ( rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 )
+            // InternalDataDSL.g:9081:3: rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1();
@@ -29274,16 +31524,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__0"
-    // InternalDataDSL.g:8436:1: rule__DataInterchangeFormat__Group__0 : rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1 ;
+    // InternalDataDSL.g:9090:1: rule__DataInterchangeFormat__Group__0 : rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1 ;
     public final void rule__DataInterchangeFormat__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8440:1: ( rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1 )
-            // InternalDataDSL.g:8441:2: rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1
+            // InternalDataDSL.g:9094:1: ( rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1 )
+            // InternalDataDSL.g:9095:2: rule__DataInterchangeFormat__Group__0__Impl rule__DataInterchangeFormat__Group__1
             {
-            pushFollow(FOLLOW_45);
+            pushFollow(FOLLOW_46);
             rule__DataInterchangeFormat__Group__0__Impl();
 
             state._fsp--;
@@ -29312,23 +31562,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__0__Impl"
-    // InternalDataDSL.g:8448:1: rule__DataInterchangeFormat__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:9102:1: rule__DataInterchangeFormat__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeFormat__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8452:1: ( ( () ) )
-            // InternalDataDSL.g:8453:1: ( () )
+            // InternalDataDSL.g:9106:1: ( ( () ) )
+            // InternalDataDSL.g:9107:1: ( () )
             {
-            // InternalDataDSL.g:8453:1: ( () )
-            // InternalDataDSL.g:8454:2: ()
+            // InternalDataDSL.g:9107:1: ( () )
+            // InternalDataDSL.g:9108:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getDataInterchangeFormatAction_0()); 
             }
-            // InternalDataDSL.g:8455:2: ()
-            // InternalDataDSL.g:8455:3: 
+            // InternalDataDSL.g:9109:2: ()
+            // InternalDataDSL.g:9109:3: 
             {
             }
 
@@ -29353,14 +31603,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__1"
-    // InternalDataDSL.g:8463:1: rule__DataInterchangeFormat__Group__1 : rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2 ;
+    // InternalDataDSL.g:9117:1: rule__DataInterchangeFormat__Group__1 : rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2 ;
     public final void rule__DataInterchangeFormat__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8467:1: ( rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2 )
-            // InternalDataDSL.g:8468:2: rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2
+            // InternalDataDSL.g:9121:1: ( rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2 )
+            // InternalDataDSL.g:9122:2: rule__DataInterchangeFormat__Group__1__Impl rule__DataInterchangeFormat__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeFormat__Group__1__Impl();
@@ -29391,22 +31641,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__1__Impl"
-    // InternalDataDSL.g:8475:1: rule__DataInterchangeFormat__Group__1__Impl : ( 'for' ) ;
+    // InternalDataDSL.g:9129:1: rule__DataInterchangeFormat__Group__1__Impl : ( 'for' ) ;
     public final void rule__DataInterchangeFormat__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8479:1: ( ( 'for' ) )
-            // InternalDataDSL.g:8480:1: ( 'for' )
+            // InternalDataDSL.g:9133:1: ( ( 'for' ) )
+            // InternalDataDSL.g:9134:1: ( 'for' )
             {
-            // InternalDataDSL.g:8480:1: ( 'for' )
-            // InternalDataDSL.g:8481:2: 'for'
+            // InternalDataDSL.g:9134:1: ( 'for' )
+            // InternalDataDSL.g:9135:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getForKeyword_1()); 
             }
-            match(input,101,FOLLOW_2); if (state.failed) return ;
+            match(input,103,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeFormatAccess().getForKeyword_1()); 
             }
@@ -29432,16 +31682,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__2"
-    // InternalDataDSL.g:8490:1: rule__DataInterchangeFormat__Group__2 : rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3 ;
+    // InternalDataDSL.g:9144:1: rule__DataInterchangeFormat__Group__2 : rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3 ;
     public final void rule__DataInterchangeFormat__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8494:1: ( rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3 )
-            // InternalDataDSL.g:8495:2: rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3
+            // InternalDataDSL.g:9148:1: ( rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3 )
+            // InternalDataDSL.g:9149:2: rule__DataInterchangeFormat__Group__2__Impl rule__DataInterchangeFormat__Group__3
             {
-            pushFollow(FOLLOW_54);
+            pushFollow(FOLLOW_57);
             rule__DataInterchangeFormat__Group__2__Impl();
 
             state._fsp--;
@@ -29470,23 +31720,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__2__Impl"
-    // InternalDataDSL.g:8502:1: rule__DataInterchangeFormat__Group__2__Impl : ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:9156:1: rule__DataInterchangeFormat__Group__2__Impl : ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeFormat__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8506:1: ( ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:8507:1: ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:9160:1: ( ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:9161:1: ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:8507:1: ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) )
-            // InternalDataDSL.g:8508:2: ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:9161:1: ( ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:9162:2: ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getTargetPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:8509:2: ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 )
-            // InternalDataDSL.g:8509:3: rule__DataInterchangeFormat__TargetPropertyAssignment_2
+            // InternalDataDSL.g:9163:2: ( rule__DataInterchangeFormat__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:9163:3: rule__DataInterchangeFormat__TargetPropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFormat__TargetPropertyAssignment_2();
@@ -29521,14 +31771,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__3"
-    // InternalDataDSL.g:8517:1: rule__DataInterchangeFormat__Group__3 : rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4 ;
+    // InternalDataDSL.g:9171:1: rule__DataInterchangeFormat__Group__3 : rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4 ;
     public final void rule__DataInterchangeFormat__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8521:1: ( rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4 )
-            // InternalDataDSL.g:8522:2: rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4
+            // InternalDataDSL.g:9175:1: ( rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4 )
+            // InternalDataDSL.g:9176:2: rule__DataInterchangeFormat__Group__3__Impl rule__DataInterchangeFormat__Group__4
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeFormat__Group__3__Impl();
@@ -29559,22 +31809,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__3__Impl"
-    // InternalDataDSL.g:8529:1: rule__DataInterchangeFormat__Group__3__Impl : ( 'coding' ) ;
+    // InternalDataDSL.g:9183:1: rule__DataInterchangeFormat__Group__3__Impl : ( 'coding' ) ;
     public final void rule__DataInterchangeFormat__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8533:1: ( ( 'coding' ) )
-            // InternalDataDSL.g:8534:1: ( 'coding' )
+            // InternalDataDSL.g:9187:1: ( ( 'coding' ) )
+            // InternalDataDSL.g:9188:1: ( 'coding' )
             {
-            // InternalDataDSL.g:8534:1: ( 'coding' )
-            // InternalDataDSL.g:8535:2: 'coding'
+            // InternalDataDSL.g:9188:1: ( 'coding' )
+            // InternalDataDSL.g:9189:2: 'coding'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getCodingKeyword_3()); 
             }
-            match(input,107,FOLLOW_2); if (state.failed) return ;
+            match(input,110,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeFormatAccess().getCodingKeyword_3()); 
             }
@@ -29600,14 +31850,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__4"
-    // InternalDataDSL.g:8544:1: rule__DataInterchangeFormat__Group__4 : rule__DataInterchangeFormat__Group__4__Impl ;
+    // InternalDataDSL.g:9198:1: rule__DataInterchangeFormat__Group__4 : rule__DataInterchangeFormat__Group__4__Impl ;
     public final void rule__DataInterchangeFormat__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8548:1: ( rule__DataInterchangeFormat__Group__4__Impl )
-            // InternalDataDSL.g:8549:2: rule__DataInterchangeFormat__Group__4__Impl
+            // InternalDataDSL.g:9202:1: ( rule__DataInterchangeFormat__Group__4__Impl )
+            // InternalDataDSL.g:9203:2: rule__DataInterchangeFormat__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFormat__Group__4__Impl();
@@ -29633,23 +31883,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__Group__4__Impl"
-    // InternalDataDSL.g:8555:1: rule__DataInterchangeFormat__Group__4__Impl : ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) ) ;
+    // InternalDataDSL.g:9209:1: rule__DataInterchangeFormat__Group__4__Impl : ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) ) ;
     public final void rule__DataInterchangeFormat__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8559:1: ( ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) ) )
-            // InternalDataDSL.g:8560:1: ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) )
+            // InternalDataDSL.g:9213:1: ( ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) ) )
+            // InternalDataDSL.g:9214:1: ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) )
             {
-            // InternalDataDSL.g:8560:1: ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) )
-            // InternalDataDSL.g:8561:2: ( rule__DataInterchangeFormat__FormatAssignment_4 )
+            // InternalDataDSL.g:9214:1: ( ( rule__DataInterchangeFormat__FormatAssignment_4 ) )
+            // InternalDataDSL.g:9215:2: ( rule__DataInterchangeFormat__FormatAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getFormatAssignment_4()); 
             }
-            // InternalDataDSL.g:8562:2: ( rule__DataInterchangeFormat__FormatAssignment_4 )
-            // InternalDataDSL.g:8562:3: rule__DataInterchangeFormat__FormatAssignment_4
+            // InternalDataDSL.g:9216:2: ( rule__DataInterchangeFormat__FormatAssignment_4 )
+            // InternalDataDSL.g:9216:3: rule__DataInterchangeFormat__FormatAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFormat__FormatAssignment_4();
@@ -29684,16 +31934,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__0"
-    // InternalDataDSL.g:8571:1: rule__DataInterchangeEntityExpression__Group__0 : rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1 ;
+    // InternalDataDSL.g:9225:1: rule__DataInterchangeEntityExpression__Group__0 : rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1 ;
     public final void rule__DataInterchangeEntityExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8575:1: ( rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1 )
-            // InternalDataDSL.g:8576:2: rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1
+            // InternalDataDSL.g:9229:1: ( rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1 )
+            // InternalDataDSL.g:9230:2: rule__DataInterchangeEntityExpression__Group__0__Impl rule__DataInterchangeEntityExpression__Group__1
             {
-            pushFollow(FOLLOW_55);
+            pushFollow(FOLLOW_58);
             rule__DataInterchangeEntityExpression__Group__0__Impl();
 
             state._fsp--;
@@ -29722,23 +31972,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__0__Impl"
-    // InternalDataDSL.g:8583:1: rule__DataInterchangeEntityExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:9237:1: rule__DataInterchangeEntityExpression__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeEntityExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8587:1: ( ( () ) )
-            // InternalDataDSL.g:8588:1: ( () )
+            // InternalDataDSL.g:9241:1: ( ( () ) )
+            // InternalDataDSL.g:9242:1: ( () )
             {
-            // InternalDataDSL.g:8588:1: ( () )
-            // InternalDataDSL.g:8589:2: ()
+            // InternalDataDSL.g:9242:1: ( () )
+            // InternalDataDSL.g:9243:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getDataInterchangeEntityExpressionAction_0()); 
             }
-            // InternalDataDSL.g:8590:2: ()
-            // InternalDataDSL.g:8590:3: 
+            // InternalDataDSL.g:9244:2: ()
+            // InternalDataDSL.g:9244:3: 
             {
             }
 
@@ -29763,14 +32013,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__1"
-    // InternalDataDSL.g:8598:1: rule__DataInterchangeEntityExpression__Group__1 : rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2 ;
+    // InternalDataDSL.g:9252:1: rule__DataInterchangeEntityExpression__Group__1 : rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2 ;
     public final void rule__DataInterchangeEntityExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8602:1: ( rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2 )
-            // InternalDataDSL.g:8603:2: rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2
+            // InternalDataDSL.g:9256:1: ( rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2 )
+            // InternalDataDSL.g:9257:2: rule__DataInterchangeEntityExpression__Group__1__Impl rule__DataInterchangeEntityExpression__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeEntityExpression__Group__1__Impl();
@@ -29801,22 +32051,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__1__Impl"
-    // InternalDataDSL.g:8610:1: rule__DataInterchangeEntityExpression__Group__1__Impl : ( 'copy' ) ;
+    // InternalDataDSL.g:9264:1: rule__DataInterchangeEntityExpression__Group__1__Impl : ( 'copy' ) ;
     public final void rule__DataInterchangeEntityExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8614:1: ( ( 'copy' ) )
-            // InternalDataDSL.g:8615:1: ( 'copy' )
+            // InternalDataDSL.g:9268:1: ( ( 'copy' ) )
+            // InternalDataDSL.g:9269:1: ( 'copy' )
             {
-            // InternalDataDSL.g:8615:1: ( 'copy' )
-            // InternalDataDSL.g:8616:2: 'copy'
+            // InternalDataDSL.g:9269:1: ( 'copy' )
+            // InternalDataDSL.g:9270:2: 'copy'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getCopyKeyword_1()); 
             }
-            match(input,108,FOLLOW_2); if (state.failed) return ;
+            match(input,111,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeEntityExpressionAccess().getCopyKeyword_1()); 
             }
@@ -29842,16 +32092,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__2"
-    // InternalDataDSL.g:8625:1: rule__DataInterchangeEntityExpression__Group__2 : rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3 ;
+    // InternalDataDSL.g:9279:1: rule__DataInterchangeEntityExpression__Group__2 : rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3 ;
     public final void rule__DataInterchangeEntityExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8629:1: ( rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3 )
-            // InternalDataDSL.g:8630:2: rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3
+            // InternalDataDSL.g:9283:1: ( rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3 )
+            // InternalDataDSL.g:9284:2: rule__DataInterchangeEntityExpression__Group__2__Impl rule__DataInterchangeEntityExpression__Group__3
             {
-            pushFollow(FOLLOW_56);
+            pushFollow(FOLLOW_59);
             rule__DataInterchangeEntityExpression__Group__2__Impl();
 
             state._fsp--;
@@ -29880,23 +32130,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__2__Impl"
-    // InternalDataDSL.g:8637:1: rule__DataInterchangeEntityExpression__Group__2__Impl : ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:9291:1: rule__DataInterchangeEntityExpression__Group__2__Impl : ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeEntityExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8641:1: ( ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:8642:1: ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:9295:1: ( ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:9296:1: ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:8642:1: ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) )
-            // InternalDataDSL.g:8643:2: ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:9296:1: ( ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:9297:2: ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getTargetPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:8644:2: ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 )
-            // InternalDataDSL.g:8644:3: rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2
+            // InternalDataDSL.g:9298:2: ( rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:9298:3: rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2();
@@ -29931,14 +32181,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__3"
-    // InternalDataDSL.g:8652:1: rule__DataInterchangeEntityExpression__Group__3 : rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4 ;
+    // InternalDataDSL.g:9306:1: rule__DataInterchangeEntityExpression__Group__3 : rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4 ;
     public final void rule__DataInterchangeEntityExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8656:1: ( rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4 )
-            // InternalDataDSL.g:8657:2: rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4
+            // InternalDataDSL.g:9310:1: ( rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4 )
+            // InternalDataDSL.g:9311:2: rule__DataInterchangeEntityExpression__Group__3__Impl rule__DataInterchangeEntityExpression__Group__4
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeEntityExpression__Group__3__Impl();
@@ -29969,22 +32219,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__3__Impl"
-    // InternalDataDSL.g:8664:1: rule__DataInterchangeEntityExpression__Group__3__Impl : ( 'from' ) ;
+    // InternalDataDSL.g:9318:1: rule__DataInterchangeEntityExpression__Group__3__Impl : ( 'from' ) ;
     public final void rule__DataInterchangeEntityExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8668:1: ( ( 'from' ) )
-            // InternalDataDSL.g:8669:1: ( 'from' )
+            // InternalDataDSL.g:9322:1: ( ( 'from' ) )
+            // InternalDataDSL.g:9323:1: ( 'from' )
             {
-            // InternalDataDSL.g:8669:1: ( 'from' )
-            // InternalDataDSL.g:8670:2: 'from'
+            // InternalDataDSL.g:9323:1: ( 'from' )
+            // InternalDataDSL.g:9324:2: 'from'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getFromKeyword_3()); 
             }
-            match(input,109,FOLLOW_2); if (state.failed) return ;
+            match(input,112,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeEntityExpressionAccess().getFromKeyword_3()); 
             }
@@ -30010,16 +32260,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__4"
-    // InternalDataDSL.g:8679:1: rule__DataInterchangeEntityExpression__Group__4 : rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5 ;
+    // InternalDataDSL.g:9333:1: rule__DataInterchangeEntityExpression__Group__4 : rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5 ;
     public final void rule__DataInterchangeEntityExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8683:1: ( rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5 )
-            // InternalDataDSL.g:8684:2: rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5
+            // InternalDataDSL.g:9337:1: ( rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5 )
+            // InternalDataDSL.g:9338:2: rule__DataInterchangeEntityExpression__Group__4__Impl rule__DataInterchangeEntityExpression__Group__5
             {
-            pushFollow(FOLLOW_57);
+            pushFollow(FOLLOW_60);
             rule__DataInterchangeEntityExpression__Group__4__Impl();
 
             state._fsp--;
@@ -30048,23 +32298,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__4__Impl"
-    // InternalDataDSL.g:8691:1: rule__DataInterchangeEntityExpression__Group__4__Impl : ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) ) ;
+    // InternalDataDSL.g:9345:1: rule__DataInterchangeEntityExpression__Group__4__Impl : ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) ) ;
     public final void rule__DataInterchangeEntityExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8695:1: ( ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) ) )
-            // InternalDataDSL.g:8696:1: ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) )
+            // InternalDataDSL.g:9349:1: ( ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) ) )
+            // InternalDataDSL.g:9350:1: ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) )
             {
-            // InternalDataDSL.g:8696:1: ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) )
-            // InternalDataDSL.g:8697:2: ( rule__DataInterchangeEntityExpression__EntityAssignment_4 )
+            // InternalDataDSL.g:9350:1: ( ( rule__DataInterchangeEntityExpression__EntityAssignment_4 ) )
+            // InternalDataDSL.g:9351:2: ( rule__DataInterchangeEntityExpression__EntityAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getEntityAssignment_4()); 
             }
-            // InternalDataDSL.g:8698:2: ( rule__DataInterchangeEntityExpression__EntityAssignment_4 )
-            // InternalDataDSL.g:8698:3: rule__DataInterchangeEntityExpression__EntityAssignment_4
+            // InternalDataDSL.g:9352:2: ( rule__DataInterchangeEntityExpression__EntityAssignment_4 )
+            // InternalDataDSL.g:9352:3: rule__DataInterchangeEntityExpression__EntityAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeEntityExpression__EntityAssignment_4();
@@ -30099,14 +32349,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__5"
-    // InternalDataDSL.g:8706:1: rule__DataInterchangeEntityExpression__Group__5 : rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6 ;
+    // InternalDataDSL.g:9360:1: rule__DataInterchangeEntityExpression__Group__5 : rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6 ;
     public final void rule__DataInterchangeEntityExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8710:1: ( rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6 )
-            // InternalDataDSL.g:8711:2: rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6
+            // InternalDataDSL.g:9364:1: ( rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6 )
+            // InternalDataDSL.g:9365:2: rule__DataInterchangeEntityExpression__Group__5__Impl rule__DataInterchangeEntityExpression__Group__6
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeEntityExpression__Group__5__Impl();
@@ -30137,22 +32387,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__5__Impl"
-    // InternalDataDSL.g:8718:1: rule__DataInterchangeEntityExpression__Group__5__Impl : ( 'property' ) ;
+    // InternalDataDSL.g:9372:1: rule__DataInterchangeEntityExpression__Group__5__Impl : ( 'property' ) ;
     public final void rule__DataInterchangeEntityExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8722:1: ( ( 'property' ) )
-            // InternalDataDSL.g:8723:1: ( 'property' )
+            // InternalDataDSL.g:9376:1: ( ( 'property' ) )
+            // InternalDataDSL.g:9377:1: ( 'property' )
             {
-            // InternalDataDSL.g:8723:1: ( 'property' )
-            // InternalDataDSL.g:8724:2: 'property'
+            // InternalDataDSL.g:9377:1: ( 'property' )
+            // InternalDataDSL.g:9378:2: 'property'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyKeyword_5()); 
             }
-            match(input,110,FOLLOW_2); if (state.failed) return ;
+            match(input,113,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyKeyword_5()); 
             }
@@ -30178,14 +32428,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__6"
-    // InternalDataDSL.g:8733:1: rule__DataInterchangeEntityExpression__Group__6 : rule__DataInterchangeEntityExpression__Group__6__Impl ;
+    // InternalDataDSL.g:9387:1: rule__DataInterchangeEntityExpression__Group__6 : rule__DataInterchangeEntityExpression__Group__6__Impl ;
     public final void rule__DataInterchangeEntityExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8737:1: ( rule__DataInterchangeEntityExpression__Group__6__Impl )
-            // InternalDataDSL.g:8738:2: rule__DataInterchangeEntityExpression__Group__6__Impl
+            // InternalDataDSL.g:9391:1: ( rule__DataInterchangeEntityExpression__Group__6__Impl )
+            // InternalDataDSL.g:9392:2: rule__DataInterchangeEntityExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeEntityExpression__Group__6__Impl();
@@ -30211,23 +32461,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__Group__6__Impl"
-    // InternalDataDSL.g:8744:1: rule__DataInterchangeEntityExpression__Group__6__Impl : ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) ) ;
+    // InternalDataDSL.g:9398:1: rule__DataInterchangeEntityExpression__Group__6__Impl : ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) ) ;
     public final void rule__DataInterchangeEntityExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8748:1: ( ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) ) )
-            // InternalDataDSL.g:8749:1: ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) )
+            // InternalDataDSL.g:9402:1: ( ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) ) )
+            // InternalDataDSL.g:9403:1: ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) )
             {
-            // InternalDataDSL.g:8749:1: ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) )
-            // InternalDataDSL.g:8750:2: ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 )
+            // InternalDataDSL.g:9403:1: ( ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 ) )
+            // InternalDataDSL.g:9404:2: ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyAssignment_6()); 
             }
-            // InternalDataDSL.g:8751:2: ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 )
-            // InternalDataDSL.g:8751:3: rule__DataInterchangeEntityExpression__PropertyAssignment_6
+            // InternalDataDSL.g:9405:2: ( rule__DataInterchangeEntityExpression__PropertyAssignment_6 )
+            // InternalDataDSL.g:9405:3: rule__DataInterchangeEntityExpression__PropertyAssignment_6
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeEntityExpression__PropertyAssignment_6();
@@ -30262,16 +32512,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__0"
-    // InternalDataDSL.g:8760:1: rule__DataInterchangeExpose__Group__0 : rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1 ;
+    // InternalDataDSL.g:9414:1: rule__DataInterchangeExpose__Group__0 : rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1 ;
     public final void rule__DataInterchangeExpose__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8764:1: ( rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1 )
-            // InternalDataDSL.g:8765:2: rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1
+            // InternalDataDSL.g:9418:1: ( rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1 )
+            // InternalDataDSL.g:9419:2: rule__DataInterchangeExpose__Group__0__Impl rule__DataInterchangeExpose__Group__1
             {
-            pushFollow(FOLLOW_58);
+            pushFollow(FOLLOW_61);
             rule__DataInterchangeExpose__Group__0__Impl();
 
             state._fsp--;
@@ -30300,23 +32550,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__0__Impl"
-    // InternalDataDSL.g:8772:1: rule__DataInterchangeExpose__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:9426:1: rule__DataInterchangeExpose__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeExpose__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8776:1: ( ( () ) )
-            // InternalDataDSL.g:8777:1: ( () )
+            // InternalDataDSL.g:9430:1: ( ( () ) )
+            // InternalDataDSL.g:9431:1: ( () )
             {
-            // InternalDataDSL.g:8777:1: ( () )
-            // InternalDataDSL.g:8778:2: ()
+            // InternalDataDSL.g:9431:1: ( () )
+            // InternalDataDSL.g:9432:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getDataInterchangeExposeAction_0()); 
             }
-            // InternalDataDSL.g:8779:2: ()
-            // InternalDataDSL.g:8779:3: 
+            // InternalDataDSL.g:9433:2: ()
+            // InternalDataDSL.g:9433:3: 
             {
             }
 
@@ -30341,14 +32591,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__1"
-    // InternalDataDSL.g:8787:1: rule__DataInterchangeExpose__Group__1 : rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2 ;
+    // InternalDataDSL.g:9441:1: rule__DataInterchangeExpose__Group__1 : rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2 ;
     public final void rule__DataInterchangeExpose__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8791:1: ( rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2 )
-            // InternalDataDSL.g:8792:2: rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2
+            // InternalDataDSL.g:9445:1: ( rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2 )
+            // InternalDataDSL.g:9446:2: rule__DataInterchangeExpose__Group__1__Impl rule__DataInterchangeExpose__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeExpose__Group__1__Impl();
@@ -30379,22 +32629,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__1__Impl"
-    // InternalDataDSL.g:8799:1: rule__DataInterchangeExpose__Group__1__Impl : ( 'ref' ) ;
+    // InternalDataDSL.g:9453:1: rule__DataInterchangeExpose__Group__1__Impl : ( 'ref' ) ;
     public final void rule__DataInterchangeExpose__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8803:1: ( ( 'ref' ) )
-            // InternalDataDSL.g:8804:1: ( 'ref' )
+            // InternalDataDSL.g:9457:1: ( ( 'ref' ) )
+            // InternalDataDSL.g:9458:1: ( 'ref' )
             {
-            // InternalDataDSL.g:8804:1: ( 'ref' )
-            // InternalDataDSL.g:8805:2: 'ref'
+            // InternalDataDSL.g:9458:1: ( 'ref' )
+            // InternalDataDSL.g:9459:2: 'ref'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefKeyword_1()); 
             }
-            match(input,111,FOLLOW_2); if (state.failed) return ;
+            match(input,114,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeExposeAccess().getRefKeyword_1()); 
             }
@@ -30420,16 +32670,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__2"
-    // InternalDataDSL.g:8814:1: rule__DataInterchangeExpose__Group__2 : rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3 ;
+    // InternalDataDSL.g:9468:1: rule__DataInterchangeExpose__Group__2 : rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3 ;
     public final void rule__DataInterchangeExpose__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8818:1: ( rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3 )
-            // InternalDataDSL.g:8819:2: rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3
+            // InternalDataDSL.g:9472:1: ( rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3 )
+            // InternalDataDSL.g:9473:2: rule__DataInterchangeExpose__Group__2__Impl rule__DataInterchangeExpose__Group__3
             {
-            pushFollow(FOLLOW_59);
+            pushFollow(FOLLOW_62);
             rule__DataInterchangeExpose__Group__2__Impl();
 
             state._fsp--;
@@ -30458,23 +32708,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__2__Impl"
-    // InternalDataDSL.g:8826:1: rule__DataInterchangeExpose__Group__2__Impl : ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) ) ;
+    // InternalDataDSL.g:9480:1: rule__DataInterchangeExpose__Group__2__Impl : ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) ) ;
     public final void rule__DataInterchangeExpose__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8830:1: ( ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) ) )
-            // InternalDataDSL.g:8831:1: ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) )
+            // InternalDataDSL.g:9484:1: ( ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) ) )
+            // InternalDataDSL.g:9485:1: ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) )
             {
-            // InternalDataDSL.g:8831:1: ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) )
-            // InternalDataDSL.g:8832:2: ( rule__DataInterchangeExpose__RefEntityAssignment_2 )
+            // InternalDataDSL.g:9485:1: ( ( rule__DataInterchangeExpose__RefEntityAssignment_2 ) )
+            // InternalDataDSL.g:9486:2: ( rule__DataInterchangeExpose__RefEntityAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefEntityAssignment_2()); 
             }
-            // InternalDataDSL.g:8833:2: ( rule__DataInterchangeExpose__RefEntityAssignment_2 )
-            // InternalDataDSL.g:8833:3: rule__DataInterchangeExpose__RefEntityAssignment_2
+            // InternalDataDSL.g:9487:2: ( rule__DataInterchangeExpose__RefEntityAssignment_2 )
+            // InternalDataDSL.g:9487:3: rule__DataInterchangeExpose__RefEntityAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__RefEntityAssignment_2();
@@ -30509,14 +32759,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__3"
-    // InternalDataDSL.g:8841:1: rule__DataInterchangeExpose__Group__3 : rule__DataInterchangeExpose__Group__3__Impl ;
+    // InternalDataDSL.g:9495:1: rule__DataInterchangeExpose__Group__3 : rule__DataInterchangeExpose__Group__3__Impl ;
     public final void rule__DataInterchangeExpose__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8845:1: ( rule__DataInterchangeExpose__Group__3__Impl )
-            // InternalDataDSL.g:8846:2: rule__DataInterchangeExpose__Group__3__Impl
+            // InternalDataDSL.g:9499:1: ( rule__DataInterchangeExpose__Group__3__Impl )
+            // InternalDataDSL.g:9500:2: rule__DataInterchangeExpose__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__Group__3__Impl();
@@ -30542,23 +32792,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group__3__Impl"
-    // InternalDataDSL.g:8852:1: rule__DataInterchangeExpose__Group__3__Impl : ( ( rule__DataInterchangeExpose__Alternatives_3 ) ) ;
+    // InternalDataDSL.g:9506:1: rule__DataInterchangeExpose__Group__3__Impl : ( ( rule__DataInterchangeExpose__Alternatives_3 ) ) ;
     public final void rule__DataInterchangeExpose__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8856:1: ( ( ( rule__DataInterchangeExpose__Alternatives_3 ) ) )
-            // InternalDataDSL.g:8857:1: ( ( rule__DataInterchangeExpose__Alternatives_3 ) )
+            // InternalDataDSL.g:9510:1: ( ( ( rule__DataInterchangeExpose__Alternatives_3 ) ) )
+            // InternalDataDSL.g:9511:1: ( ( rule__DataInterchangeExpose__Alternatives_3 ) )
             {
-            // InternalDataDSL.g:8857:1: ( ( rule__DataInterchangeExpose__Alternatives_3 ) )
-            // InternalDataDSL.g:8858:2: ( rule__DataInterchangeExpose__Alternatives_3 )
+            // InternalDataDSL.g:9511:1: ( ( rule__DataInterchangeExpose__Alternatives_3 ) )
+            // InternalDataDSL.g:9512:2: ( rule__DataInterchangeExpose__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getAlternatives_3()); 
             }
-            // InternalDataDSL.g:8859:2: ( rule__DataInterchangeExpose__Alternatives_3 )
-            // InternalDataDSL.g:8859:3: rule__DataInterchangeExpose__Alternatives_3
+            // InternalDataDSL.g:9513:2: ( rule__DataInterchangeExpose__Alternatives_3 )
+            // InternalDataDSL.g:9513:3: rule__DataInterchangeExpose__Alternatives_3
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__Alternatives_3();
@@ -30593,14 +32843,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_0__0"
-    // InternalDataDSL.g:8868:1: rule__DataInterchangeExpose__Group_3_0__0 : rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1 ;
+    // InternalDataDSL.g:9522:1: rule__DataInterchangeExpose__Group_3_0__0 : rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1 ;
     public final void rule__DataInterchangeExpose__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8872:1: ( rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1 )
-            // InternalDataDSL.g:8873:2: rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1
+            // InternalDataDSL.g:9526:1: ( rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1 )
+            // InternalDataDSL.g:9527:2: rule__DataInterchangeExpose__Group_3_0__0__Impl rule__DataInterchangeExpose__Group_3_0__1
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeExpose__Group_3_0__0__Impl();
@@ -30631,22 +32881,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_0__0__Impl"
-    // InternalDataDSL.g:8880:1: rule__DataInterchangeExpose__Group_3_0__0__Impl : ( 'on' ) ;
+    // InternalDataDSL.g:9534:1: rule__DataInterchangeExpose__Group_3_0__0__Impl : ( 'on' ) ;
     public final void rule__DataInterchangeExpose__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8884:1: ( ( 'on' ) )
-            // InternalDataDSL.g:8885:1: ( 'on' )
+            // InternalDataDSL.g:9538:1: ( ( 'on' ) )
+            // InternalDataDSL.g:9539:1: ( 'on' )
             {
-            // InternalDataDSL.g:8885:1: ( 'on' )
-            // InternalDataDSL.g:8886:2: 'on'
+            // InternalDataDSL.g:9539:1: ( 'on' )
+            // InternalDataDSL.g:9540:2: 'on'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getOnKeyword_3_0_0()); 
             }
-            match(input,102,FOLLOW_2); if (state.failed) return ;
+            match(input,115,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeExposeAccess().getOnKeyword_3_0_0()); 
             }
@@ -30672,14 +32922,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_0__1"
-    // InternalDataDSL.g:8895:1: rule__DataInterchangeExpose__Group_3_0__1 : rule__DataInterchangeExpose__Group_3_0__1__Impl ;
+    // InternalDataDSL.g:9549:1: rule__DataInterchangeExpose__Group_3_0__1 : rule__DataInterchangeExpose__Group_3_0__1__Impl ;
     public final void rule__DataInterchangeExpose__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8899:1: ( rule__DataInterchangeExpose__Group_3_0__1__Impl )
-            // InternalDataDSL.g:8900:2: rule__DataInterchangeExpose__Group_3_0__1__Impl
+            // InternalDataDSL.g:9553:1: ( rule__DataInterchangeExpose__Group_3_0__1__Impl )
+            // InternalDataDSL.g:9554:2: rule__DataInterchangeExpose__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__Group_3_0__1__Impl();
@@ -30705,23 +32955,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_0__1__Impl"
-    // InternalDataDSL.g:8906:1: rule__DataInterchangeExpose__Group_3_0__1__Impl : ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) ) ;
+    // InternalDataDSL.g:9560:1: rule__DataInterchangeExpose__Group_3_0__1__Impl : ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) ) ;
     public final void rule__DataInterchangeExpose__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8910:1: ( ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) ) )
-            // InternalDataDSL.g:8911:1: ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) )
+            // InternalDataDSL.g:9564:1: ( ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) ) )
+            // InternalDataDSL.g:9565:1: ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) )
             {
-            // InternalDataDSL.g:8911:1: ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) )
-            // InternalDataDSL.g:8912:2: ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 )
+            // InternalDataDSL.g:9565:1: ( ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 ) )
+            // InternalDataDSL.g:9566:2: ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefPropertyAssignment_3_0_1()); 
             }
-            // InternalDataDSL.g:8913:2: ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 )
-            // InternalDataDSL.g:8913:3: rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1
+            // InternalDataDSL.g:9567:2: ( rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 )
+            // InternalDataDSL.g:9567:3: rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1();
@@ -30756,14 +33006,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__0"
-    // InternalDataDSL.g:8922:1: rule__DataInterchangeExpose__Group_3_1__0 : rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1 ;
+    // InternalDataDSL.g:9576:1: rule__DataInterchangeExpose__Group_3_1__0 : rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1 ;
     public final void rule__DataInterchangeExpose__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8926:1: ( rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1 )
-            // InternalDataDSL.g:8927:2: rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1
+            // InternalDataDSL.g:9580:1: ( rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1 )
+            // InternalDataDSL.g:9581:2: rule__DataInterchangeExpose__Group_3_1__0__Impl rule__DataInterchangeExpose__Group_3_1__1
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchangeExpose__Group_3_1__0__Impl();
@@ -30794,22 +33044,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__0__Impl"
-    // InternalDataDSL.g:8934:1: rule__DataInterchangeExpose__Group_3_1__0__Impl : ( 'expose' ) ;
+    // InternalDataDSL.g:9588:1: rule__DataInterchangeExpose__Group_3_1__0__Impl : ( 'expose' ) ;
     public final void rule__DataInterchangeExpose__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8938:1: ( ( 'expose' ) )
-            // InternalDataDSL.g:8939:1: ( 'expose' )
+            // InternalDataDSL.g:9592:1: ( ( 'expose' ) )
+            // InternalDataDSL.g:9593:1: ( 'expose' )
             {
-            // InternalDataDSL.g:8939:1: ( 'expose' )
-            // InternalDataDSL.g:8940:2: 'expose'
+            // InternalDataDSL.g:9593:1: ( 'expose' )
+            // InternalDataDSL.g:9594:2: 'expose'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getExposeKeyword_3_1_0()); 
             }
-            match(input,96,FOLLOW_2); if (state.failed) return ;
+            match(input,98,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeExposeAccess().getExposeKeyword_3_1_0()); 
             }
@@ -30835,16 +33085,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__1"
-    // InternalDataDSL.g:8949:1: rule__DataInterchangeExpose__Group_3_1__1 : rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2 ;
+    // InternalDataDSL.g:9603:1: rule__DataInterchangeExpose__Group_3_1__1 : rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2 ;
     public final void rule__DataInterchangeExpose__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8953:1: ( rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2 )
-            // InternalDataDSL.g:8954:2: rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2
+            // InternalDataDSL.g:9607:1: ( rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2 )
+            // InternalDataDSL.g:9608:2: rule__DataInterchangeExpose__Group_3_1__1__Impl rule__DataInterchangeExpose__Group_3_1__2
             {
-            pushFollow(FOLLOW_58);
+            pushFollow(FOLLOW_61);
             rule__DataInterchangeExpose__Group_3_1__1__Impl();
 
             state._fsp--;
@@ -30873,17 +33123,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__1__Impl"
-    // InternalDataDSL.g:8961:1: rule__DataInterchangeExpose__Group_3_1__1__Impl : ( '{' ) ;
+    // InternalDataDSL.g:9615:1: rule__DataInterchangeExpose__Group_3_1__1__Impl : ( '{' ) ;
     public final void rule__DataInterchangeExpose__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8965:1: ( ( '{' ) )
-            // InternalDataDSL.g:8966:1: ( '{' )
+            // InternalDataDSL.g:9619:1: ( ( '{' ) )
+            // InternalDataDSL.g:9620:1: ( '{' )
             {
-            // InternalDataDSL.g:8966:1: ( '{' )
-            // InternalDataDSL.g:8967:2: '{'
+            // InternalDataDSL.g:9620:1: ( '{' )
+            // InternalDataDSL.g:9621:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getLeftCurlyBracketKeyword_3_1_1()); 
@@ -30914,16 +33164,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__2"
-    // InternalDataDSL.g:8976:1: rule__DataInterchangeExpose__Group_3_1__2 : rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3 ;
+    // InternalDataDSL.g:9630:1: rule__DataInterchangeExpose__Group_3_1__2 : rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3 ;
     public final void rule__DataInterchangeExpose__Group_3_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8980:1: ( rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3 )
-            // InternalDataDSL.g:8981:2: rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3
+            // InternalDataDSL.g:9634:1: ( rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3 )
+            // InternalDataDSL.g:9635:2: rule__DataInterchangeExpose__Group_3_1__2__Impl rule__DataInterchangeExpose__Group_3_1__3
             {
-            pushFollow(FOLLOW_43);
+            pushFollow(FOLLOW_44);
             rule__DataInterchangeExpose__Group_3_1__2__Impl();
 
             state._fsp--;
@@ -30952,23 +33202,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__2__Impl"
-    // InternalDataDSL.g:8988:1: rule__DataInterchangeExpose__Group_3_1__2__Impl : ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) ) ;
+    // InternalDataDSL.g:9642:1: rule__DataInterchangeExpose__Group_3_1__2__Impl : ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) ) ;
     public final void rule__DataInterchangeExpose__Group_3_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:8992:1: ( ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) ) )
-            // InternalDataDSL.g:8993:1: ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) )
+            // InternalDataDSL.g:9646:1: ( ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) ) )
+            // InternalDataDSL.g:9647:1: ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) )
             {
-            // InternalDataDSL.g:8993:1: ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) )
-            // InternalDataDSL.g:8994:2: ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 )
+            // InternalDataDSL.g:9647:1: ( ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 ) )
+            // InternalDataDSL.g:9648:2: ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getSubExposeAssignment_3_1_2()); 
             }
-            // InternalDataDSL.g:8995:2: ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 )
-            // InternalDataDSL.g:8995:3: rule__DataInterchangeExpose__SubExposeAssignment_3_1_2
+            // InternalDataDSL.g:9649:2: ( rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 )
+            // InternalDataDSL.g:9649:3: rule__DataInterchangeExpose__SubExposeAssignment_3_1_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__SubExposeAssignment_3_1_2();
@@ -31003,14 +33253,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__3"
-    // InternalDataDSL.g:9003:1: rule__DataInterchangeExpose__Group_3_1__3 : rule__DataInterchangeExpose__Group_3_1__3__Impl ;
+    // InternalDataDSL.g:9657:1: rule__DataInterchangeExpose__Group_3_1__3 : rule__DataInterchangeExpose__Group_3_1__3__Impl ;
     public final void rule__DataInterchangeExpose__Group_3_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9007:1: ( rule__DataInterchangeExpose__Group_3_1__3__Impl )
-            // InternalDataDSL.g:9008:2: rule__DataInterchangeExpose__Group_3_1__3__Impl
+            // InternalDataDSL.g:9661:1: ( rule__DataInterchangeExpose__Group_3_1__3__Impl )
+            // InternalDataDSL.g:9662:2: rule__DataInterchangeExpose__Group_3_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExpose__Group_3_1__3__Impl();
@@ -31036,17 +33286,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__Group_3_1__3__Impl"
-    // InternalDataDSL.g:9014:1: rule__DataInterchangeExpose__Group_3_1__3__Impl : ( '}' ) ;
+    // InternalDataDSL.g:9668:1: rule__DataInterchangeExpose__Group_3_1__3__Impl : ( '}' ) ;
     public final void rule__DataInterchangeExpose__Group_3_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9018:1: ( ( '}' ) )
-            // InternalDataDSL.g:9019:1: ( '}' )
+            // InternalDataDSL.g:9672:1: ( ( '}' ) )
+            // InternalDataDSL.g:9673:1: ( '}' )
             {
-            // InternalDataDSL.g:9019:1: ( '}' )
-            // InternalDataDSL.g:9020:2: '}'
+            // InternalDataDSL.g:9673:1: ( '}' )
+            // InternalDataDSL.g:9674:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRightCurlyBracketKeyword_3_1_3()); 
@@ -31077,16 +33327,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__0"
-    // InternalDataDSL.g:9030:1: rule__DataInterchangeExportFilter__Group__0 : rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1 ;
+    // InternalDataDSL.g:9684:1: rule__DataInterchangeExportFilter__Group__0 : rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1 ;
     public final void rule__DataInterchangeExportFilter__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9034:1: ( rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1 )
-            // InternalDataDSL.g:9035:2: rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1
+            // InternalDataDSL.g:9688:1: ( rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1 )
+            // InternalDataDSL.g:9689:2: rule__DataInterchangeExportFilter__Group__0__Impl rule__DataInterchangeExportFilter__Group__1
             {
-            pushFollow(FOLLOW_42);
+            pushFollow(FOLLOW_43);
             rule__DataInterchangeExportFilter__Group__0__Impl();
 
             state._fsp--;
@@ -31115,23 +33365,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__0__Impl"
-    // InternalDataDSL.g:9042:1: rule__DataInterchangeExportFilter__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:9696:1: rule__DataInterchangeExportFilter__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeExportFilter__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9046:1: ( ( () ) )
-            // InternalDataDSL.g:9047:1: ( () )
+            // InternalDataDSL.g:9700:1: ( ( () ) )
+            // InternalDataDSL.g:9701:1: ( () )
             {
-            // InternalDataDSL.g:9047:1: ( () )
-            // InternalDataDSL.g:9048:2: ()
+            // InternalDataDSL.g:9701:1: ( () )
+            // InternalDataDSL.g:9702:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getDataInterchangeExportFilterAction_0()); 
             }
-            // InternalDataDSL.g:9049:2: ()
-            // InternalDataDSL.g:9049:3: 
+            // InternalDataDSL.g:9703:2: ()
+            // InternalDataDSL.g:9703:3: 
             {
             }
 
@@ -31156,16 +33406,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__1"
-    // InternalDataDSL.g:9057:1: rule__DataInterchangeExportFilter__Group__1 : rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2 ;
+    // InternalDataDSL.g:9711:1: rule__DataInterchangeExportFilter__Group__1 : rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2 ;
     public final void rule__DataInterchangeExportFilter__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9061:1: ( rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2 )
-            // InternalDataDSL.g:9062:2: rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2
+            // InternalDataDSL.g:9715:1: ( rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2 )
+            // InternalDataDSL.g:9716:2: rule__DataInterchangeExportFilter__Group__1__Impl rule__DataInterchangeExportFilter__Group__2
             {
-            pushFollow(FOLLOW_42);
+            pushFollow(FOLLOW_43);
             rule__DataInterchangeExportFilter__Group__1__Impl();
 
             state._fsp--;
@@ -31194,31 +33444,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__1__Impl"
-    // InternalDataDSL.g:9069:1: rule__DataInterchangeExportFilter__Group__1__Impl : ( ( rule__DataInterchangeExportFilter__Group_1__0 )? ) ;
+    // InternalDataDSL.g:9723:1: rule__DataInterchangeExportFilter__Group__1__Impl : ( ( rule__DataInterchangeExportFilter__Group_1__0 )? ) ;
     public final void rule__DataInterchangeExportFilter__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9073:1: ( ( ( rule__DataInterchangeExportFilter__Group_1__0 )? ) )
-            // InternalDataDSL.g:9074:1: ( ( rule__DataInterchangeExportFilter__Group_1__0 )? )
+            // InternalDataDSL.g:9727:1: ( ( ( rule__DataInterchangeExportFilter__Group_1__0 )? ) )
+            // InternalDataDSL.g:9728:1: ( ( rule__DataInterchangeExportFilter__Group_1__0 )? )
             {
-            // InternalDataDSL.g:9074:1: ( ( rule__DataInterchangeExportFilter__Group_1__0 )? )
-            // InternalDataDSL.g:9075:2: ( rule__DataInterchangeExportFilter__Group_1__0 )?
+            // InternalDataDSL.g:9728:1: ( ( rule__DataInterchangeExportFilter__Group_1__0 )? )
+            // InternalDataDSL.g:9729:2: ( rule__DataInterchangeExportFilter__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:9076:2: ( rule__DataInterchangeExportFilter__Group_1__0 )?
-            int alt91=2;
-            int LA91_0 = input.LA(1);
+            // InternalDataDSL.g:9730:2: ( rule__DataInterchangeExportFilter__Group_1__0 )?
+            int alt94=2;
+            int LA94_0 = input.LA(1);
 
-            if ( (LA91_0==112) ) {
-                alt91=1;
+            if ( (LA94_0==107) ) {
+                alt94=1;
             }
-            switch (alt91) {
+            switch (alt94) {
                 case 1 :
-                    // InternalDataDSL.g:9076:3: rule__DataInterchangeExportFilter__Group_1__0
+                    // InternalDataDSL.g:9730:3: rule__DataInterchangeExportFilter__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeExportFilter__Group_1__0();
@@ -31256,14 +33506,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__2"
-    // InternalDataDSL.g:9084:1: rule__DataInterchangeExportFilter__Group__2 : rule__DataInterchangeExportFilter__Group__2__Impl ;
+    // InternalDataDSL.g:9738:1: rule__DataInterchangeExportFilter__Group__2 : rule__DataInterchangeExportFilter__Group__2__Impl ;
     public final void rule__DataInterchangeExportFilter__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9088:1: ( rule__DataInterchangeExportFilter__Group__2__Impl )
-            // InternalDataDSL.g:9089:2: rule__DataInterchangeExportFilter__Group__2__Impl
+            // InternalDataDSL.g:9742:1: ( rule__DataInterchangeExportFilter__Group__2__Impl )
+            // InternalDataDSL.g:9743:2: rule__DataInterchangeExportFilter__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportFilter__Group__2__Impl();
@@ -31289,31 +33539,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group__2__Impl"
-    // InternalDataDSL.g:9095:1: rule__DataInterchangeExportFilter__Group__2__Impl : ( ( rule__DataInterchangeExportFilter__Group_2__0 )? ) ;
+    // InternalDataDSL.g:9749:1: rule__DataInterchangeExportFilter__Group__2__Impl : ( ( rule__DataInterchangeExportFilter__Group_2__0 )? ) ;
     public final void rule__DataInterchangeExportFilter__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9099:1: ( ( ( rule__DataInterchangeExportFilter__Group_2__0 )? ) )
-            // InternalDataDSL.g:9100:1: ( ( rule__DataInterchangeExportFilter__Group_2__0 )? )
+            // InternalDataDSL.g:9753:1: ( ( ( rule__DataInterchangeExportFilter__Group_2__0 )? ) )
+            // InternalDataDSL.g:9754:1: ( ( rule__DataInterchangeExportFilter__Group_2__0 )? )
             {
-            // InternalDataDSL.g:9100:1: ( ( rule__DataInterchangeExportFilter__Group_2__0 )? )
-            // InternalDataDSL.g:9101:2: ( rule__DataInterchangeExportFilter__Group_2__0 )?
+            // InternalDataDSL.g:9754:1: ( ( rule__DataInterchangeExportFilter__Group_2__0 )? )
+            // InternalDataDSL.g:9755:2: ( rule__DataInterchangeExportFilter__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getGroup_2()); 
             }
-            // InternalDataDSL.g:9102:2: ( rule__DataInterchangeExportFilter__Group_2__0 )?
-            int alt92=2;
-            int LA92_0 = input.LA(1);
+            // InternalDataDSL.g:9756:2: ( rule__DataInterchangeExportFilter__Group_2__0 )?
+            int alt95=2;
+            int LA95_0 = input.LA(1);
 
-            if ( (LA92_0==113) ) {
-                alt92=1;
+            if ( (LA95_0==116) ) {
+                alt95=1;
             }
-            switch (alt92) {
+            switch (alt95) {
                 case 1 :
-                    // InternalDataDSL.g:9102:3: rule__DataInterchangeExportFilter__Group_2__0
+                    // InternalDataDSL.g:9756:3: rule__DataInterchangeExportFilter__Group_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeExportFilter__Group_2__0();
@@ -31351,14 +33601,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__0"
-    // InternalDataDSL.g:9111:1: rule__DataInterchangeExportFilter__Group_1__0 : rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1 ;
+    // InternalDataDSL.g:9765:1: rule__DataInterchangeExportFilter__Group_1__0 : rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1 ;
     public final void rule__DataInterchangeExportFilter__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9115:1: ( rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1 )
-            // InternalDataDSL.g:9116:2: rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1
+            // InternalDataDSL.g:9769:1: ( rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1 )
+            // InternalDataDSL.g:9770:2: rule__DataInterchangeExportFilter__Group_1__0__Impl rule__DataInterchangeExportFilter__Group_1__1
             {
             pushFollow(FOLLOW_8);
             rule__DataInterchangeExportFilter__Group_1__0__Impl();
@@ -31389,22 +33639,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__0__Impl"
-    // InternalDataDSL.g:9123:1: rule__DataInterchangeExportFilter__Group_1__0__Impl : ( 'where' ) ;
+    // InternalDataDSL.g:9777:1: rule__DataInterchangeExportFilter__Group_1__0__Impl : ( 'where' ) ;
     public final void rule__DataInterchangeExportFilter__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9127:1: ( ( 'where' ) )
-            // InternalDataDSL.g:9128:1: ( 'where' )
+            // InternalDataDSL.g:9781:1: ( ( 'where' ) )
+            // InternalDataDSL.g:9782:1: ( 'where' )
             {
-            // InternalDataDSL.g:9128:1: ( 'where' )
-            // InternalDataDSL.g:9129:2: 'where'
+            // InternalDataDSL.g:9782:1: ( 'where' )
+            // InternalDataDSL.g:9783:2: 'where'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getWhereKeyword_1_0()); 
             }
-            match(input,112,FOLLOW_2); if (state.failed) return ;
+            match(input,107,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeExportFilterAccess().getWhereKeyword_1_0()); 
             }
@@ -31430,14 +33680,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__1"
-    // InternalDataDSL.g:9138:1: rule__DataInterchangeExportFilter__Group_1__1 : rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2 ;
+    // InternalDataDSL.g:9792:1: rule__DataInterchangeExportFilter__Group_1__1 : rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2 ;
     public final void rule__DataInterchangeExportFilter__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9142:1: ( rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2 )
-            // InternalDataDSL.g:9143:2: rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2
+            // InternalDataDSL.g:9796:1: ( rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2 )
+            // InternalDataDSL.g:9797:2: rule__DataInterchangeExportFilter__Group_1__1__Impl rule__DataInterchangeExportFilter__Group_1__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeExportFilter__Group_1__1__Impl();
@@ -31468,17 +33718,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__1__Impl"
-    // InternalDataDSL.g:9150:1: rule__DataInterchangeExportFilter__Group_1__1__Impl : ( '{' ) ;
+    // InternalDataDSL.g:9804:1: rule__DataInterchangeExportFilter__Group_1__1__Impl : ( '{' ) ;
     public final void rule__DataInterchangeExportFilter__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9154:1: ( ( '{' ) )
-            // InternalDataDSL.g:9155:1: ( '{' )
+            // InternalDataDSL.g:9808:1: ( ( '{' ) )
+            // InternalDataDSL.g:9809:1: ( '{' )
             {
-            // InternalDataDSL.g:9155:1: ( '{' )
-            // InternalDataDSL.g:9156:2: '{'
+            // InternalDataDSL.g:9809:1: ( '{' )
+            // InternalDataDSL.g:9810:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getLeftCurlyBracketKeyword_1_1()); 
@@ -31509,16 +33759,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__2"
-    // InternalDataDSL.g:9165:1: rule__DataInterchangeExportFilter__Group_1__2 : rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3 ;
+    // InternalDataDSL.g:9819:1: rule__DataInterchangeExportFilter__Group_1__2 : rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3 ;
     public final void rule__DataInterchangeExportFilter__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9169:1: ( rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3 )
-            // InternalDataDSL.g:9170:2: rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3
+            // InternalDataDSL.g:9823:1: ( rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3 )
+            // InternalDataDSL.g:9824:2: rule__DataInterchangeExportFilter__Group_1__2__Impl rule__DataInterchangeExportFilter__Group_1__3
             {
-            pushFollow(FOLLOW_43);
+            pushFollow(FOLLOW_44);
             rule__DataInterchangeExportFilter__Group_1__2__Impl();
 
             state._fsp--;
@@ -31547,23 +33797,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__2__Impl"
-    // InternalDataDSL.g:9177:1: rule__DataInterchangeExportFilter__Group_1__2__Impl : ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) ) ;
+    // InternalDataDSL.g:9831:1: rule__DataInterchangeExportFilter__Group_1__2__Impl : ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) ) ;
     public final void rule__DataInterchangeExportFilter__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9181:1: ( ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) ) )
-            // InternalDataDSL.g:9182:1: ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) )
+            // InternalDataDSL.g:9835:1: ( ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) ) )
+            // InternalDataDSL.g:9836:1: ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) )
             {
-            // InternalDataDSL.g:9182:1: ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) )
-            // InternalDataDSL.g:9183:2: ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 )
+            // InternalDataDSL.g:9836:1: ( ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 ) )
+            // InternalDataDSL.g:9837:2: ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getConditionAssignment_1_2()); 
             }
-            // InternalDataDSL.g:9184:2: ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 )
-            // InternalDataDSL.g:9184:3: rule__DataInterchangeExportFilter__ConditionAssignment_1_2
+            // InternalDataDSL.g:9838:2: ( rule__DataInterchangeExportFilter__ConditionAssignment_1_2 )
+            // InternalDataDSL.g:9838:3: rule__DataInterchangeExportFilter__ConditionAssignment_1_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportFilter__ConditionAssignment_1_2();
@@ -31598,14 +33848,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__3"
-    // InternalDataDSL.g:9192:1: rule__DataInterchangeExportFilter__Group_1__3 : rule__DataInterchangeExportFilter__Group_1__3__Impl ;
+    // InternalDataDSL.g:9846:1: rule__DataInterchangeExportFilter__Group_1__3 : rule__DataInterchangeExportFilter__Group_1__3__Impl ;
     public final void rule__DataInterchangeExportFilter__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9196:1: ( rule__DataInterchangeExportFilter__Group_1__3__Impl )
-            // InternalDataDSL.g:9197:2: rule__DataInterchangeExportFilter__Group_1__3__Impl
+            // InternalDataDSL.g:9850:1: ( rule__DataInterchangeExportFilter__Group_1__3__Impl )
+            // InternalDataDSL.g:9851:2: rule__DataInterchangeExportFilter__Group_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportFilter__Group_1__3__Impl();
@@ -31631,17 +33881,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_1__3__Impl"
-    // InternalDataDSL.g:9203:1: rule__DataInterchangeExportFilter__Group_1__3__Impl : ( '}' ) ;
+    // InternalDataDSL.g:9857:1: rule__DataInterchangeExportFilter__Group_1__3__Impl : ( '}' ) ;
     public final void rule__DataInterchangeExportFilter__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9207:1: ( ( '}' ) )
-            // InternalDataDSL.g:9208:1: ( '}' )
+            // InternalDataDSL.g:9861:1: ( ( '}' ) )
+            // InternalDataDSL.g:9862:1: ( '}' )
             {
-            // InternalDataDSL.g:9208:1: ( '}' )
-            // InternalDataDSL.g:9209:2: '}'
+            // InternalDataDSL.g:9862:1: ( '}' )
+            // InternalDataDSL.g:9863:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getRightCurlyBracketKeyword_1_3()); 
@@ -31672,14 +33922,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_2__0"
-    // InternalDataDSL.g:9219:1: rule__DataInterchangeExportFilter__Group_2__0 : rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1 ;
+    // InternalDataDSL.g:9873:1: rule__DataInterchangeExportFilter__Group_2__0 : rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1 ;
     public final void rule__DataInterchangeExportFilter__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9223:1: ( rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1 )
-            // InternalDataDSL.g:9224:2: rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1
+            // InternalDataDSL.g:9877:1: ( rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1 )
+            // InternalDataDSL.g:9878:2: rule__DataInterchangeExportFilter__Group_2__0__Impl rule__DataInterchangeExportFilter__Group_2__1
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeExportFilter__Group_2__0__Impl();
@@ -31710,22 +33960,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_2__0__Impl"
-    // InternalDataDSL.g:9231:1: rule__DataInterchangeExportFilter__Group_2__0__Impl : ( 'hide' ) ;
+    // InternalDataDSL.g:9885:1: rule__DataInterchangeExportFilter__Group_2__0__Impl : ( 'hide' ) ;
     public final void rule__DataInterchangeExportFilter__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9235:1: ( ( 'hide' ) )
-            // InternalDataDSL.g:9236:1: ( 'hide' )
+            // InternalDataDSL.g:9889:1: ( ( 'hide' ) )
+            // InternalDataDSL.g:9890:1: ( 'hide' )
             {
-            // InternalDataDSL.g:9236:1: ( 'hide' )
-            // InternalDataDSL.g:9237:2: 'hide'
+            // InternalDataDSL.g:9890:1: ( 'hide' )
+            // InternalDataDSL.g:9891:2: 'hide'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getHideKeyword_2_0()); 
             }
-            match(input,113,FOLLOW_2); if (state.failed) return ;
+            match(input,116,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeExportFilterAccess().getHideKeyword_2_0()); 
             }
@@ -31751,14 +34001,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_2__1"
-    // InternalDataDSL.g:9246:1: rule__DataInterchangeExportFilter__Group_2__1 : rule__DataInterchangeExportFilter__Group_2__1__Impl ;
+    // InternalDataDSL.g:9900:1: rule__DataInterchangeExportFilter__Group_2__1 : rule__DataInterchangeExportFilter__Group_2__1__Impl ;
     public final void rule__DataInterchangeExportFilter__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9250:1: ( rule__DataInterchangeExportFilter__Group_2__1__Impl )
-            // InternalDataDSL.g:9251:2: rule__DataInterchangeExportFilter__Group_2__1__Impl
+            // InternalDataDSL.g:9904:1: ( rule__DataInterchangeExportFilter__Group_2__1__Impl )
+            // InternalDataDSL.g:9905:2: rule__DataInterchangeExportFilter__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportFilter__Group_2__1__Impl();
@@ -31784,35 +34034,35 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__Group_2__1__Impl"
-    // InternalDataDSL.g:9257:1: rule__DataInterchangeExportFilter__Group_2__1__Impl : ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* ) ;
+    // InternalDataDSL.g:9911:1: rule__DataInterchangeExportFilter__Group_2__1__Impl : ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* ) ;
     public final void rule__DataInterchangeExportFilter__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9261:1: ( ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* ) )
-            // InternalDataDSL.g:9262:1: ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* )
+            // InternalDataDSL.g:9915:1: ( ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* ) )
+            // InternalDataDSL.g:9916:1: ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* )
             {
-            // InternalDataDSL.g:9262:1: ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* )
-            // InternalDataDSL.g:9263:2: ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )*
+            // InternalDataDSL.g:9916:1: ( ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )* )
+            // InternalDataDSL.g:9917:2: ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getHiddenpropertiesAssignment_2_1()); 
             }
-            // InternalDataDSL.g:9264:2: ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )*
-            loop93:
+            // InternalDataDSL.g:9918:2: ( rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 )*
+            loop96:
             do {
-                int alt93=2;
-                int LA93_0 = input.LA(1);
+                int alt96=2;
+                int LA96_0 = input.LA(1);
 
-                if ( (LA93_0==RULE_ID) ) {
-                    alt93=1;
+                if ( (LA96_0==RULE_ID) ) {
+                    alt96=1;
                 }
 
 
-                switch (alt93) {
+                switch (alt96) {
             	case 1 :
-            	    // InternalDataDSL.g:9264:3: rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1
+            	    // InternalDataDSL.g:9918:3: rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1
             	    {
             	    pushFollow(FOLLOW_4);
             	    rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1();
@@ -31824,7 +34074,7 @@
             	    break;
 
             	default :
-            	    break loop93;
+            	    break loop96;
                 }
             } while (true);
 
@@ -31852,23 +34102,23 @@
     // $ANTLR end "rule__DataInterchangeExportFilter__Group_2__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__0"
-    // InternalDataDSL.g:9273:1: rule__DataInterchangeFilterCondition__Group__0 : rule__DataInterchangeFilterCondition__Group__0__Impl rule__DataInterchangeFilterCondition__Group__1 ;
-    public final void rule__DataInterchangeFilterCondition__Group__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__0"
+    // InternalDataDSL.g:9927:1: rule__DataInterchangeExportFilterCondition__Group__0 : rule__DataInterchangeExportFilterCondition__Group__0__Impl rule__DataInterchangeExportFilterCondition__Group__1 ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9277:1: ( rule__DataInterchangeFilterCondition__Group__0__Impl rule__DataInterchangeFilterCondition__Group__1 )
-            // InternalDataDSL.g:9278:2: rule__DataInterchangeFilterCondition__Group__0__Impl rule__DataInterchangeFilterCondition__Group__1
+            // InternalDataDSL.g:9931:1: ( rule__DataInterchangeExportFilterCondition__Group__0__Impl rule__DataInterchangeExportFilterCondition__Group__1 )
+            // InternalDataDSL.g:9932:2: rule__DataInterchangeExportFilterCondition__Group__0__Impl rule__DataInterchangeExportFilterCondition__Group__1
             {
-            pushFollow(FOLLOW_60);
-            rule__DataInterchangeFilterCondition__Group__0__Impl();
+            pushFollow(FOLLOW_63);
+            rule__DataInterchangeExportFilterCondition__Group__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group__1();
+            rule__DataInterchangeExportFilterCondition__Group__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -31887,30 +34137,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__0"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__0"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__0__Impl"
-    // InternalDataDSL.g:9285:1: rule__DataInterchangeFilterCondition__Group__0__Impl : ( ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 ) ) ;
-    public final void rule__DataInterchangeFilterCondition__Group__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__0__Impl"
+    // InternalDataDSL.g:9939:1: rule__DataInterchangeExportFilterCondition__Group__0__Impl : ( ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 ) ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9289:1: ( ( ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 ) ) )
-            // InternalDataDSL.g:9290:1: ( ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 ) )
+            // InternalDataDSL.g:9943:1: ( ( ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 ) ) )
+            // InternalDataDSL.g:9944:1: ( ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 ) )
             {
-            // InternalDataDSL.g:9290:1: ( ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 ) )
-            // InternalDataDSL.g:9291:2: ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 )
+            // InternalDataDSL.g:9944:1: ( ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 ) )
+            // InternalDataDSL.g:9945:2: ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyAssignment_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyAssignment_0()); 
             }
-            // InternalDataDSL.g:9292:2: ( rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 )
-            // InternalDataDSL.g:9292:3: rule__DataInterchangeFilterCondition__RefPropertyAssignment_0
+            // InternalDataDSL.g:9946:2: ( rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 )
+            // InternalDataDSL.g:9946:3: rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__RefPropertyAssignment_0();
+            rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0();
 
             state._fsp--;
             if (state.failed) return ;
@@ -31918,7 +34168,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyAssignment_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyAssignment_0()); 
             }
 
             }
@@ -31938,26 +34188,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__0__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__1"
-    // InternalDataDSL.g:9300:1: rule__DataInterchangeFilterCondition__Group__1 : rule__DataInterchangeFilterCondition__Group__1__Impl rule__DataInterchangeFilterCondition__Group__2 ;
-    public final void rule__DataInterchangeFilterCondition__Group__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__1"
+    // InternalDataDSL.g:9954:1: rule__DataInterchangeExportFilterCondition__Group__1 : rule__DataInterchangeExportFilterCondition__Group__1__Impl rule__DataInterchangeExportFilterCondition__Group__2 ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9304:1: ( rule__DataInterchangeFilterCondition__Group__1__Impl rule__DataInterchangeFilterCondition__Group__2 )
-            // InternalDataDSL.g:9305:2: rule__DataInterchangeFilterCondition__Group__1__Impl rule__DataInterchangeFilterCondition__Group__2
+            // InternalDataDSL.g:9958:1: ( rule__DataInterchangeExportFilterCondition__Group__1__Impl rule__DataInterchangeExportFilterCondition__Group__2 )
+            // InternalDataDSL.g:9959:2: rule__DataInterchangeExportFilterCondition__Group__1__Impl rule__DataInterchangeExportFilterCondition__Group__2
             {
-            pushFollow(FOLLOW_61);
-            rule__DataInterchangeFilterCondition__Group__1__Impl();
+            pushFollow(FOLLOW_64);
+            rule__DataInterchangeExportFilterCondition__Group__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group__2();
+            rule__DataInterchangeExportFilterCondition__Group__2();
 
             state._fsp--;
             if (state.failed) return ;
@@ -31976,30 +34226,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__1"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__1"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__1__Impl"
-    // InternalDataDSL.g:9312:1: rule__DataInterchangeFilterCondition__Group__1__Impl : ( ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 ) ) ;
-    public final void rule__DataInterchangeFilterCondition__Group__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__1__Impl"
+    // InternalDataDSL.g:9966:1: rule__DataInterchangeExportFilterCondition__Group__1__Impl : ( ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 ) ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9316:1: ( ( ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 ) ) )
-            // InternalDataDSL.g:9317:1: ( ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 ) )
+            // InternalDataDSL.g:9970:1: ( ( ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 ) ) )
+            // InternalDataDSL.g:9971:1: ( ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 ) )
             {
-            // InternalDataDSL.g:9317:1: ( ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 ) )
-            // InternalDataDSL.g:9318:2: ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 )
+            // InternalDataDSL.g:9971:1: ( ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 ) )
+            // InternalDataDSL.g:9972:2: ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorAssignment_1()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorAssignment_1()); 
             }
-            // InternalDataDSL.g:9319:2: ( rule__DataInterchangeFilterCondition__OperatorAssignment_1 )
-            // InternalDataDSL.g:9319:3: rule__DataInterchangeFilterCondition__OperatorAssignment_1
+            // InternalDataDSL.g:9973:2: ( rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 )
+            // InternalDataDSL.g:9973:3: rule__DataInterchangeExportFilterCondition__OperatorAssignment_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__OperatorAssignment_1();
+            rule__DataInterchangeExportFilterCondition__OperatorAssignment_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32007,7 +34257,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorAssignment_1()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorAssignment_1()); 
             }
 
             }
@@ -32027,26 +34277,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__1__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__1__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__2"
-    // InternalDataDSL.g:9327:1: rule__DataInterchangeFilterCondition__Group__2 : rule__DataInterchangeFilterCondition__Group__2__Impl rule__DataInterchangeFilterCondition__Group__3 ;
-    public final void rule__DataInterchangeFilterCondition__Group__2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__2"
+    // InternalDataDSL.g:9981:1: rule__DataInterchangeExportFilterCondition__Group__2 : rule__DataInterchangeExportFilterCondition__Group__2__Impl rule__DataInterchangeExportFilterCondition__Group__3 ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9331:1: ( rule__DataInterchangeFilterCondition__Group__2__Impl rule__DataInterchangeFilterCondition__Group__3 )
-            // InternalDataDSL.g:9332:2: rule__DataInterchangeFilterCondition__Group__2__Impl rule__DataInterchangeFilterCondition__Group__3
+            // InternalDataDSL.g:9985:1: ( rule__DataInterchangeExportFilterCondition__Group__2__Impl rule__DataInterchangeExportFilterCondition__Group__3 )
+            // InternalDataDSL.g:9986:2: rule__DataInterchangeExportFilterCondition__Group__2__Impl rule__DataInterchangeExportFilterCondition__Group__3
             {
-            pushFollow(FOLLOW_61);
-            rule__DataInterchangeFilterCondition__Group__2__Impl();
+            pushFollow(FOLLOW_64);
+            rule__DataInterchangeExportFilterCondition__Group__2__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group__3();
+            rule__DataInterchangeExportFilterCondition__Group__3();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32065,38 +34315,38 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__2"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__2"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__2__Impl"
-    // InternalDataDSL.g:9339:1: rule__DataInterchangeFilterCondition__Group__2__Impl : ( ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )? ) ;
-    public final void rule__DataInterchangeFilterCondition__Group__2__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__2__Impl"
+    // InternalDataDSL.g:9993:1: rule__DataInterchangeExportFilterCondition__Group__2__Impl : ( ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )? ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9343:1: ( ( ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )? ) )
-            // InternalDataDSL.g:9344:1: ( ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )? )
+            // InternalDataDSL.g:9997:1: ( ( ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )? ) )
+            // InternalDataDSL.g:9998:1: ( ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )? )
             {
-            // InternalDataDSL.g:9344:1: ( ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )? )
-            // InternalDataDSL.g:9345:2: ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )?
+            // InternalDataDSL.g:9998:1: ( ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )? )
+            // InternalDataDSL.g:9999:2: ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getValueAssignment_2()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueAssignment_2()); 
             }
-            // InternalDataDSL.g:9346:2: ( rule__DataInterchangeFilterCondition__ValueAssignment_2 )?
-            int alt94=2;
-            int LA94_0 = input.LA(1);
+            // InternalDataDSL.g:10000:2: ( rule__DataInterchangeExportFilterCondition__ValueAssignment_2 )?
+            int alt97=2;
+            int LA97_0 = input.LA(1);
 
-            if ( (LA94_0==RULE_STRING) ) {
-                alt94=1;
+            if ( (LA97_0==RULE_STRING) ) {
+                alt97=1;
             }
-            switch (alt94) {
+            switch (alt97) {
                 case 1 :
-                    // InternalDataDSL.g:9346:3: rule__DataInterchangeFilterCondition__ValueAssignment_2
+                    // InternalDataDSL.g:10000:3: rule__DataInterchangeExportFilterCondition__ValueAssignment_2
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeFilterCondition__ValueAssignment_2();
+                    rule__DataInterchangeExportFilterCondition__ValueAssignment_2();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -32107,7 +34357,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getValueAssignment_2()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueAssignment_2()); 
             }
 
             }
@@ -32127,21 +34377,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__2__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__2__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__3"
-    // InternalDataDSL.g:9354:1: rule__DataInterchangeFilterCondition__Group__3 : rule__DataInterchangeFilterCondition__Group__3__Impl ;
-    public final void rule__DataInterchangeFilterCondition__Group__3() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__3"
+    // InternalDataDSL.g:10008:1: rule__DataInterchangeExportFilterCondition__Group__3 : rule__DataInterchangeExportFilterCondition__Group__3__Impl ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9358:1: ( rule__DataInterchangeFilterCondition__Group__3__Impl )
-            // InternalDataDSL.g:9359:2: rule__DataInterchangeFilterCondition__Group__3__Impl
+            // InternalDataDSL.g:10012:1: ( rule__DataInterchangeExportFilterCondition__Group__3__Impl )
+            // InternalDataDSL.g:10013:2: rule__DataInterchangeExportFilterCondition__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group__3__Impl();
+            rule__DataInterchangeExportFilterCondition__Group__3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32160,38 +34410,38 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__3"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__3"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group__3__Impl"
-    // InternalDataDSL.g:9365:1: rule__DataInterchangeFilterCondition__Group__3__Impl : ( ( rule__DataInterchangeFilterCondition__Group_3__0 )? ) ;
-    public final void rule__DataInterchangeFilterCondition__Group__3__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group__3__Impl"
+    // InternalDataDSL.g:10019:1: rule__DataInterchangeExportFilterCondition__Group__3__Impl : ( ( rule__DataInterchangeExportFilterCondition__Group_3__0 )? ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9369:1: ( ( ( rule__DataInterchangeFilterCondition__Group_3__0 )? ) )
-            // InternalDataDSL.g:9370:1: ( ( rule__DataInterchangeFilterCondition__Group_3__0 )? )
+            // InternalDataDSL.g:10023:1: ( ( ( rule__DataInterchangeExportFilterCondition__Group_3__0 )? ) )
+            // InternalDataDSL.g:10024:1: ( ( rule__DataInterchangeExportFilterCondition__Group_3__0 )? )
             {
-            // InternalDataDSL.g:9370:1: ( ( rule__DataInterchangeFilterCondition__Group_3__0 )? )
-            // InternalDataDSL.g:9371:2: ( rule__DataInterchangeFilterCondition__Group_3__0 )?
+            // InternalDataDSL.g:10024:1: ( ( rule__DataInterchangeExportFilterCondition__Group_3__0 )? )
+            // InternalDataDSL.g:10025:2: ( rule__DataInterchangeExportFilterCondition__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup_3()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:9372:2: ( rule__DataInterchangeFilterCondition__Group_3__0 )?
-            int alt95=2;
-            int LA95_0 = input.LA(1);
+            // InternalDataDSL.g:10026:2: ( rule__DataInterchangeExportFilterCondition__Group_3__0 )?
+            int alt98=2;
+            int LA98_0 = input.LA(1);
 
-            if ( ((LA95_0>=71 && LA95_0<=72)) ) {
-                alt95=1;
+            if ( ((LA98_0>=71 && LA98_0<=72)) ) {
+                alt98=1;
             }
-            switch (alt95) {
+            switch (alt98) {
                 case 1 :
-                    // InternalDataDSL.g:9372:3: rule__DataInterchangeFilterCondition__Group_3__0
+                    // InternalDataDSL.g:10026:3: rule__DataInterchangeExportFilterCondition__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeFilterCondition__Group_3__0();
+                    rule__DataInterchangeExportFilterCondition__Group_3__0();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -32202,7 +34452,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getGroup_3()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getGroup_3()); 
             }
 
             }
@@ -32222,26 +34472,26 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group__3__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group__3__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group_3__0"
-    // InternalDataDSL.g:9381:1: rule__DataInterchangeFilterCondition__Group_3__0 : rule__DataInterchangeFilterCondition__Group_3__0__Impl rule__DataInterchangeFilterCondition__Group_3__1 ;
-    public final void rule__DataInterchangeFilterCondition__Group_3__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group_3__0"
+    // InternalDataDSL.g:10035:1: rule__DataInterchangeExportFilterCondition__Group_3__0 : rule__DataInterchangeExportFilterCondition__Group_3__0__Impl rule__DataInterchangeExportFilterCondition__Group_3__1 ;
+    public final void rule__DataInterchangeExportFilterCondition__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9385:1: ( rule__DataInterchangeFilterCondition__Group_3__0__Impl rule__DataInterchangeFilterCondition__Group_3__1 )
-            // InternalDataDSL.g:9386:2: rule__DataInterchangeFilterCondition__Group_3__0__Impl rule__DataInterchangeFilterCondition__Group_3__1
+            // InternalDataDSL.g:10039:1: ( rule__DataInterchangeExportFilterCondition__Group_3__0__Impl rule__DataInterchangeExportFilterCondition__Group_3__1 )
+            // InternalDataDSL.g:10040:2: rule__DataInterchangeExportFilterCondition__Group_3__0__Impl rule__DataInterchangeExportFilterCondition__Group_3__1
             {
             pushFollow(FOLLOW_7);
-            rule__DataInterchangeFilterCondition__Group_3__0__Impl();
+            rule__DataInterchangeExportFilterCondition__Group_3__0__Impl();
 
             state._fsp--;
             if (state.failed) return ;
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group_3__1();
+            rule__DataInterchangeExportFilterCondition__Group_3__1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32260,30 +34510,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group_3__0"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group_3__0"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group_3__0__Impl"
-    // InternalDataDSL.g:9393:1: rule__DataInterchangeFilterCondition__Group_3__0__Impl : ( ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 ) ) ;
-    public final void rule__DataInterchangeFilterCondition__Group_3__0__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group_3__0__Impl"
+    // InternalDataDSL.g:10047:1: rule__DataInterchangeExportFilterCondition__Group_3__0__Impl : ( ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 ) ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9397:1: ( ( ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 ) ) )
-            // InternalDataDSL.g:9398:1: ( ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 ) )
+            // InternalDataDSL.g:10051:1: ( ( ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 ) ) )
+            // InternalDataDSL.g:10052:1: ( ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 ) )
             {
-            // InternalDataDSL.g:9398:1: ( ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 ) )
-            // InternalDataDSL.g:9399:2: ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 )
+            // InternalDataDSL.g:10052:1: ( ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 ) )
+            // InternalDataDSL.g:10053:2: ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2Assignment_3_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2Assignment_3_0()); 
             }
-            // InternalDataDSL.g:9400:2: ( rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 )
-            // InternalDataDSL.g:9400:3: rule__DataInterchangeFilterCondition__Operator2Assignment_3_0
+            // InternalDataDSL.g:10054:2: ( rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 )
+            // InternalDataDSL.g:10054:3: rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Operator2Assignment_3_0();
+            rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32291,7 +34541,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2Assignment_3_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2Assignment_3_0()); 
             }
 
             }
@@ -32311,21 +34561,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group_3__0__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group_3__0__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group_3__1"
-    // InternalDataDSL.g:9408:1: rule__DataInterchangeFilterCondition__Group_3__1 : rule__DataInterchangeFilterCondition__Group_3__1__Impl ;
-    public final void rule__DataInterchangeFilterCondition__Group_3__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group_3__1"
+    // InternalDataDSL.g:10062:1: rule__DataInterchangeExportFilterCondition__Group_3__1 : rule__DataInterchangeExportFilterCondition__Group_3__1__Impl ;
+    public final void rule__DataInterchangeExportFilterCondition__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9412:1: ( rule__DataInterchangeFilterCondition__Group_3__1__Impl )
-            // InternalDataDSL.g:9413:2: rule__DataInterchangeFilterCondition__Group_3__1__Impl
+            // InternalDataDSL.g:10066:1: ( rule__DataInterchangeExportFilterCondition__Group_3__1__Impl )
+            // InternalDataDSL.g:10067:2: rule__DataInterchangeExportFilterCondition__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__Group_3__1__Impl();
+            rule__DataInterchangeExportFilterCondition__Group_3__1__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32344,30 +34594,30 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group_3__1"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group_3__1"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Group_3__1__Impl"
-    // InternalDataDSL.g:9419:1: rule__DataInterchangeFilterCondition__Group_3__1__Impl : ( ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 ) ) ;
-    public final void rule__DataInterchangeFilterCondition__Group_3__1__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Group_3__1__Impl"
+    // InternalDataDSL.g:10073:1: rule__DataInterchangeExportFilterCondition__Group_3__1__Impl : ( ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 ) ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9423:1: ( ( ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 ) ) )
-            // InternalDataDSL.g:9424:1: ( ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 ) )
+            // InternalDataDSL.g:10077:1: ( ( ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 ) ) )
+            // InternalDataDSL.g:10078:1: ( ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:9424:1: ( ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 ) )
-            // InternalDataDSL.g:9425:2: ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 )
+            // InternalDataDSL.g:10078:1: ( ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 ) )
+            // InternalDataDSL.g:10079:2: ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionAssignment_3_1()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionAssignment_3_1()); 
             }
-            // InternalDataDSL.g:9426:2: ( rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 )
-            // InternalDataDSL.g:9426:3: rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1
+            // InternalDataDSL.g:10080:2: ( rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 )
+            // InternalDataDSL.g:10080:3: rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1();
+            rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1();
 
             state._fsp--;
             if (state.failed) return ;
@@ -32375,7 +34625,7 @@
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionAssignment_3_1()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionAssignment_3_1()); 
             }
 
             }
@@ -32395,18 +34645,890 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Group_3__1__Impl"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__0"
+    // InternalDataDSL.g:10089:1: rule__DataInterchangeLookupFilterCondition__Group__0 : rule__DataInterchangeLookupFilterCondition__Group__0__Impl rule__DataInterchangeLookupFilterCondition__Group__1 ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10093:1: ( rule__DataInterchangeLookupFilterCondition__Group__0__Impl rule__DataInterchangeLookupFilterCondition__Group__1 )
+            // InternalDataDSL.g:10094:2: rule__DataInterchangeLookupFilterCondition__Group__0__Impl rule__DataInterchangeLookupFilterCondition__Group__1
+            {
+            pushFollow(FOLLOW_63);
+            rule__DataInterchangeLookupFilterCondition__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__0__Impl"
+    // InternalDataDSL.g:10101:1: rule__DataInterchangeLookupFilterCondition__Group__0__Impl : ( ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 ) ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10105:1: ( ( ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 ) ) )
+            // InternalDataDSL.g:10106:1: ( ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 ) )
+            {
+            // InternalDataDSL.g:10106:1: ( ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 ) )
+            // InternalDataDSL.g:10107:2: ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyAssignment_0()); 
+            }
+            // InternalDataDSL.g:10108:2: ( rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 )
+            // InternalDataDSL.g:10108:3: rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyAssignment_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__1"
+    // InternalDataDSL.g:10116:1: rule__DataInterchangeLookupFilterCondition__Group__1 : rule__DataInterchangeLookupFilterCondition__Group__1__Impl rule__DataInterchangeLookupFilterCondition__Group__2 ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10120:1: ( rule__DataInterchangeLookupFilterCondition__Group__1__Impl rule__DataInterchangeLookupFilterCondition__Group__2 )
+            // InternalDataDSL.g:10121:2: rule__DataInterchangeLookupFilterCondition__Group__1__Impl rule__DataInterchangeLookupFilterCondition__Group__2
+            {
+            pushFollow(FOLLOW_65);
+            rule__DataInterchangeLookupFilterCondition__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__1__Impl"
+    // InternalDataDSL.g:10128:1: rule__DataInterchangeLookupFilterCondition__Group__1__Impl : ( ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 ) ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10132:1: ( ( ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 ) ) )
+            // InternalDataDSL.g:10133:1: ( ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 ) )
+            {
+            // InternalDataDSL.g:10133:1: ( ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 ) )
+            // InternalDataDSL.g:10134:2: ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorAssignment_1()); 
+            }
+            // InternalDataDSL.g:10135:2: ( rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 )
+            // InternalDataDSL.g:10135:3: rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__2"
+    // InternalDataDSL.g:10143:1: rule__DataInterchangeLookupFilterCondition__Group__2 : rule__DataInterchangeLookupFilterCondition__Group__2__Impl rule__DataInterchangeLookupFilterCondition__Group__3 ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10147:1: ( rule__DataInterchangeLookupFilterCondition__Group__2__Impl rule__DataInterchangeLookupFilterCondition__Group__3 )
+            // InternalDataDSL.g:10148:2: rule__DataInterchangeLookupFilterCondition__Group__2__Impl rule__DataInterchangeLookupFilterCondition__Group__3
+            {
+            pushFollow(FOLLOW_65);
+            rule__DataInterchangeLookupFilterCondition__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__2"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__2__Impl"
+    // InternalDataDSL.g:10155:1: rule__DataInterchangeLookupFilterCondition__Group__2__Impl : ( ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )? ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10159:1: ( ( ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )? ) )
+            // InternalDataDSL.g:10160:1: ( ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )? )
+            {
+            // InternalDataDSL.g:10160:1: ( ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )? )
+            // InternalDataDSL.g:10161:2: ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandAssignment_2()); 
+            }
+            // InternalDataDSL.g:10162:2: ( rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 )?
+            int alt99=2;
+            int LA99_0 = input.LA(1);
+
+            if ( ((LA99_0>=RULE_STRING && LA99_0<=RULE_ID)) ) {
+                alt99=1;
+            }
+            switch (alt99) {
+                case 1 :
+                    // InternalDataDSL.g:10162:3: rule__DataInterchangeLookupFilterCondition__OperandAssignment_2
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookupFilterCondition__OperandAssignment_2();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__3"
+    // InternalDataDSL.g:10170:1: rule__DataInterchangeLookupFilterCondition__Group__3 : rule__DataInterchangeLookupFilterCondition__Group__3__Impl ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10174:1: ( rule__DataInterchangeLookupFilterCondition__Group__3__Impl )
+            // InternalDataDSL.g:10175:2: rule__DataInterchangeLookupFilterCondition__Group__3__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__3"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group__3__Impl"
+    // InternalDataDSL.g:10181:1: rule__DataInterchangeLookupFilterCondition__Group__3__Impl : ( ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )? ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10185:1: ( ( ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )? ) )
+            // InternalDataDSL.g:10186:1: ( ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )? )
+            {
+            // InternalDataDSL.g:10186:1: ( ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )? )
+            // InternalDataDSL.g:10187:2: ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )?
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup_3()); 
+            }
+            // InternalDataDSL.g:10188:2: ( rule__DataInterchangeLookupFilterCondition__Group_3__0 )?
+            int alt100=2;
+            int LA100_0 = input.LA(1);
+
+            if ( ((LA100_0>=71 && LA100_0<=72)) ) {
+                alt100=1;
+            }
+            switch (alt100) {
+                case 1 :
+                    // InternalDataDSL.g:10188:3: rule__DataInterchangeLookupFilterCondition__Group_3__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookupFilterCondition__Group_3__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getGroup_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group_3__0"
+    // InternalDataDSL.g:10197:1: rule__DataInterchangeLookupFilterCondition__Group_3__0 : rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl rule__DataInterchangeLookupFilterCondition__Group_3__1 ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group_3__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10201:1: ( rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl rule__DataInterchangeLookupFilterCondition__Group_3__1 )
+            // InternalDataDSL.g:10202:2: rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl rule__DataInterchangeLookupFilterCondition__Group_3__1
+            {
+            pushFollow(FOLLOW_7);
+            rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group_3__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group_3__0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl"
+    // InternalDataDSL.g:10209:1: rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl : ( ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 ) ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10213:1: ( ( ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 ) ) )
+            // InternalDataDSL.g:10214:1: ( ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 ) )
+            {
+            // InternalDataDSL.g:10214:1: ( ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 ) )
+            // InternalDataDSL.g:10215:2: ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2Assignment_3_0()); 
+            }
+            // InternalDataDSL.g:10216:2: ( rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 )
+            // InternalDataDSL.g:10216:3: rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2Assignment_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group_3__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group_3__1"
+    // InternalDataDSL.g:10224:1: rule__DataInterchangeLookupFilterCondition__Group_3__1 : rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group_3__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10228:1: ( rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl )
+            // InternalDataDSL.g:10229:2: rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group_3__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl"
+    // InternalDataDSL.g:10235:1: rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl : ( ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 ) ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10239:1: ( ( ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 ) ) )
+            // InternalDataDSL.g:10240:1: ( ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 ) )
+            {
+            // InternalDataDSL.g:10240:1: ( ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 ) )
+            // InternalDataDSL.g:10241:2: ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionAssignment_3_1()); 
+            }
+            // InternalDataDSL.g:10242:2: ( rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 )
+            // InternalDataDSL.g:10242:3: rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionAssignment_3_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Group_3__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandProperty__Group__0"
+    // InternalDataDSL.g:10251:1: rule__DataInterchangeLookupFilterOperandProperty__Group__0 : rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl rule__DataInterchangeLookupFilterOperandProperty__Group__1 ;
+    public final void rule__DataInterchangeLookupFilterOperandProperty__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10255:1: ( rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl rule__DataInterchangeLookupFilterOperandProperty__Group__1 )
+            // InternalDataDSL.g:10256:2: rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl rule__DataInterchangeLookupFilterOperandProperty__Group__1
+            {
+            pushFollow(FOLLOW_66);
+            rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandProperty__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandProperty__Group__0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl"
+    // InternalDataDSL.g:10263:1: rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl : ( () ) ;
+    public final void rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10267:1: ( ( () ) )
+            // InternalDataDSL.g:10268:1: ( () )
+            {
+            // InternalDataDSL.g:10268:1: ( () )
+            // InternalDataDSL.g:10269:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0()); 
+            }
+            // InternalDataDSL.g:10270:2: ()
+            // InternalDataDSL.g:10270:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandProperty__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandProperty__Group__1"
+    // InternalDataDSL.g:10278:1: rule__DataInterchangeLookupFilterOperandProperty__Group__1 : rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl ;
+    public final void rule__DataInterchangeLookupFilterOperandProperty__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10282:1: ( rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl )
+            // InternalDataDSL.g:10283:2: rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandProperty__Group__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl"
+    // InternalDataDSL.g:10289:1: rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl : ( ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 ) ) ;
+    public final void rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10293:1: ( ( ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 ) ) )
+            // InternalDataDSL.g:10294:1: ( ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 ) )
+            {
+            // InternalDataDSL.g:10294:1: ( ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 ) )
+            // InternalDataDSL.g:10295:2: ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyAssignment_1()); 
+            }
+            // InternalDataDSL.g:10296:2: ( rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 )
+            // InternalDataDSL.g:10296:3: rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandProperty__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandString__Group__0"
+    // InternalDataDSL.g:10305:1: rule__DataInterchangeLookupFilterOperandString__Group__0 : rule__DataInterchangeLookupFilterOperandString__Group__0__Impl rule__DataInterchangeLookupFilterOperandString__Group__1 ;
+    public final void rule__DataInterchangeLookupFilterOperandString__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10309:1: ( rule__DataInterchangeLookupFilterOperandString__Group__0__Impl rule__DataInterchangeLookupFilterOperandString__Group__1 )
+            // InternalDataDSL.g:10310:2: rule__DataInterchangeLookupFilterOperandString__Group__0__Impl rule__DataInterchangeLookupFilterOperandString__Group__1
+            {
+            pushFollow(FOLLOW_21);
+            rule__DataInterchangeLookupFilterOperandString__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandString__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandString__Group__0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandString__Group__0__Impl"
+    // InternalDataDSL.g:10317:1: rule__DataInterchangeLookupFilterOperandString__Group__0__Impl : ( () ) ;
+    public final void rule__DataInterchangeLookupFilterOperandString__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10321:1: ( ( () ) )
+            // InternalDataDSL.g:10322:1: ( () )
+            {
+            // InternalDataDSL.g:10322:1: ( () )
+            // InternalDataDSL.g:10323:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0()); 
+            }
+            // InternalDataDSL.g:10324:2: ()
+            // InternalDataDSL.g:10324:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandString__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandString__Group__1"
+    // InternalDataDSL.g:10332:1: rule__DataInterchangeLookupFilterOperandString__Group__1 : rule__DataInterchangeLookupFilterOperandString__Group__1__Impl ;
+    public final void rule__DataInterchangeLookupFilterOperandString__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10336:1: ( rule__DataInterchangeLookupFilterOperandString__Group__1__Impl )
+            // InternalDataDSL.g:10337:2: rule__DataInterchangeLookupFilterOperandString__Group__1__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandString__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandString__Group__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandString__Group__1__Impl"
+    // InternalDataDSL.g:10343:1: rule__DataInterchangeLookupFilterOperandString__Group__1__Impl : ( ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 ) ) ;
+    public final void rule__DataInterchangeLookupFilterOperandString__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:10347:1: ( ( ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 ) ) )
+            // InternalDataDSL.g:10348:1: ( ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 ) )
+            {
+            // InternalDataDSL.g:10348:1: ( ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 ) )
+            // InternalDataDSL.g:10349:2: ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueAssignment_1()); 
+            }
+            // InternalDataDSL.g:10350:2: ( rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 )
+            // InternalDataDSL.g:10350:3: rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueAssignment_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandString__Group__1__Impl"
 
 
     // $ANTLR start "rule__DataInterchangeExportHide__Group__0"
-    // InternalDataDSL.g:9435:1: rule__DataInterchangeExportHide__Group__0 : rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1 ;
+    // InternalDataDSL.g:10359:1: rule__DataInterchangeExportHide__Group__0 : rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1 ;
     public final void rule__DataInterchangeExportHide__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9439:1: ( rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1 )
-            // InternalDataDSL.g:9440:2: rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1
+            // InternalDataDSL.g:10363:1: ( rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1 )
+            // InternalDataDSL.g:10364:2: rule__DataInterchangeExportHide__Group__0__Impl rule__DataInterchangeExportHide__Group__1
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeExportHide__Group__0__Impl();
@@ -32437,23 +35559,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportHide__Group__0__Impl"
-    // InternalDataDSL.g:9447:1: rule__DataInterchangeExportHide__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:10371:1: rule__DataInterchangeExportHide__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeExportHide__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9451:1: ( ( () ) )
-            // InternalDataDSL.g:9452:1: ( () )
+            // InternalDataDSL.g:10375:1: ( ( () ) )
+            // InternalDataDSL.g:10376:1: ( () )
             {
-            // InternalDataDSL.g:9452:1: ( () )
-            // InternalDataDSL.g:9453:2: ()
+            // InternalDataDSL.g:10376:1: ( () )
+            // InternalDataDSL.g:10377:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideAccess().getDataInterchangeExportHideAction_0()); 
             }
-            // InternalDataDSL.g:9454:2: ()
-            // InternalDataDSL.g:9454:3: 
+            // InternalDataDSL.g:10378:2: ()
+            // InternalDataDSL.g:10378:3: 
             {
             }
 
@@ -32478,14 +35600,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportHide__Group__1"
-    // InternalDataDSL.g:9462:1: rule__DataInterchangeExportHide__Group__1 : rule__DataInterchangeExportHide__Group__1__Impl ;
+    // InternalDataDSL.g:10386:1: rule__DataInterchangeExportHide__Group__1 : rule__DataInterchangeExportHide__Group__1__Impl ;
     public final void rule__DataInterchangeExportHide__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9466:1: ( rule__DataInterchangeExportHide__Group__1__Impl )
-            // InternalDataDSL.g:9467:2: rule__DataInterchangeExportHide__Group__1__Impl
+            // InternalDataDSL.g:10390:1: ( rule__DataInterchangeExportHide__Group__1__Impl )
+            // InternalDataDSL.g:10391:2: rule__DataInterchangeExportHide__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportHide__Group__1__Impl();
@@ -32511,23 +35633,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportHide__Group__1__Impl"
-    // InternalDataDSL.g:9473:1: rule__DataInterchangeExportHide__Group__1__Impl : ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) ) ;
+    // InternalDataDSL.g:10397:1: rule__DataInterchangeExportHide__Group__1__Impl : ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) ) ;
     public final void rule__DataInterchangeExportHide__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9477:1: ( ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) ) )
-            // InternalDataDSL.g:9478:1: ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) )
+            // InternalDataDSL.g:10401:1: ( ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) ) )
+            // InternalDataDSL.g:10402:1: ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) )
             {
-            // InternalDataDSL.g:9478:1: ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) )
-            // InternalDataDSL.g:9479:2: ( rule__DataInterchangeExportHide__PropertyAssignment_1 )
+            // InternalDataDSL.g:10402:1: ( ( rule__DataInterchangeExportHide__PropertyAssignment_1 ) )
+            // InternalDataDSL.g:10403:2: ( rule__DataInterchangeExportHide__PropertyAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideAccess().getPropertyAssignment_1()); 
             }
-            // InternalDataDSL.g:9480:2: ( rule__DataInterchangeExportHide__PropertyAssignment_1 )
-            // InternalDataDSL.g:9480:3: rule__DataInterchangeExportHide__PropertyAssignment_1
+            // InternalDataDSL.g:10404:2: ( rule__DataInterchangeExportHide__PropertyAssignment_1 )
+            // InternalDataDSL.g:10404:3: rule__DataInterchangeExportHide__PropertyAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeExportHide__PropertyAssignment_1();
@@ -32562,16 +35684,16 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__0"
-    // InternalDataDSL.g:9489:1: rule__DataInterchangePredefinedExpression__Group__0 : rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1 ;
+    // InternalDataDSL.g:10413:1: rule__DataInterchangePredefinedExpression__Group__0 : rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1 ;
     public final void rule__DataInterchangePredefinedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9493:1: ( rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1 )
-            // InternalDataDSL.g:9494:2: rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1
+            // InternalDataDSL.g:10417:1: ( rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1 )
+            // InternalDataDSL.g:10418:2: rule__DataInterchangePredefinedExpression__Group__0__Impl rule__DataInterchangePredefinedExpression__Group__1
             {
-            pushFollow(FOLLOW_62);
+            pushFollow(FOLLOW_67);
             rule__DataInterchangePredefinedExpression__Group__0__Impl();
 
             state._fsp--;
@@ -32600,23 +35722,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__0__Impl"
-    // InternalDataDSL.g:9501:1: rule__DataInterchangePredefinedExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:10425:1: rule__DataInterchangePredefinedExpression__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9505:1: ( ( () ) )
-            // InternalDataDSL.g:9506:1: ( () )
+            // InternalDataDSL.g:10429:1: ( ( () ) )
+            // InternalDataDSL.g:10430:1: ( () )
             {
-            // InternalDataDSL.g:9506:1: ( () )
-            // InternalDataDSL.g:9507:2: ()
+            // InternalDataDSL.g:10430:1: ( () )
+            // InternalDataDSL.g:10431:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getDataInterchangePredefinedExpressionAction_0()); 
             }
-            // InternalDataDSL.g:9508:2: ()
-            // InternalDataDSL.g:9508:3: 
+            // InternalDataDSL.g:10432:2: ()
+            // InternalDataDSL.g:10432:3: 
             {
             }
 
@@ -32641,14 +35763,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__1"
-    // InternalDataDSL.g:9516:1: rule__DataInterchangePredefinedExpression__Group__1 : rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2 ;
+    // InternalDataDSL.g:10440:1: rule__DataInterchangePredefinedExpression__Group__1 : rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2 ;
     public final void rule__DataInterchangePredefinedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9520:1: ( rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2 )
-            // InternalDataDSL.g:9521:2: rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2
+            // InternalDataDSL.g:10444:1: ( rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2 )
+            // InternalDataDSL.g:10445:2: rule__DataInterchangePredefinedExpression__Group__1__Impl rule__DataInterchangePredefinedExpression__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangePredefinedExpression__Group__1__Impl();
@@ -32679,22 +35801,22 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__1__Impl"
-    // InternalDataDSL.g:9528:1: rule__DataInterchangePredefinedExpression__Group__1__Impl : ( 'assign' ) ;
+    // InternalDataDSL.g:10452:1: rule__DataInterchangePredefinedExpression__Group__1__Impl : ( 'assign' ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9532:1: ( ( 'assign' ) )
-            // InternalDataDSL.g:9533:1: ( 'assign' )
+            // InternalDataDSL.g:10456:1: ( ( 'assign' ) )
+            // InternalDataDSL.g:10457:1: ( 'assign' )
             {
-            // InternalDataDSL.g:9533:1: ( 'assign' )
-            // InternalDataDSL.g:9534:2: 'assign'
+            // InternalDataDSL.g:10457:1: ( 'assign' )
+            // InternalDataDSL.g:10458:2: 'assign'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getAssignKeyword_1()); 
             }
-            match(input,114,FOLLOW_2); if (state.failed) return ;
+            match(input,117,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangePredefinedExpressionAccess().getAssignKeyword_1()); 
             }
@@ -32720,16 +35842,16 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__2"
-    // InternalDataDSL.g:9543:1: rule__DataInterchangePredefinedExpression__Group__2 : rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3 ;
+    // InternalDataDSL.g:10467:1: rule__DataInterchangePredefinedExpression__Group__2 : rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3 ;
     public final void rule__DataInterchangePredefinedExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9547:1: ( rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3 )
-            // InternalDataDSL.g:9548:2: rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3
+            // InternalDataDSL.g:10471:1: ( rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3 )
+            // InternalDataDSL.g:10472:2: rule__DataInterchangePredefinedExpression__Group__2__Impl rule__DataInterchangePredefinedExpression__Group__3
             {
-            pushFollow(FOLLOW_63);
+            pushFollow(FOLLOW_68);
             rule__DataInterchangePredefinedExpression__Group__2__Impl();
 
             state._fsp--;
@@ -32758,23 +35880,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__2__Impl"
-    // InternalDataDSL.g:9555:1: rule__DataInterchangePredefinedExpression__Group__2__Impl : ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:10479:1: rule__DataInterchangePredefinedExpression__Group__2__Impl : ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9559:1: ( ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:9560:1: ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:10483:1: ( ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:10484:1: ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:9560:1: ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) )
-            // InternalDataDSL.g:9561:2: ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:10484:1: ( ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 ) )
+            // InternalDataDSL.g:10485:2: ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getTargetPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:9562:2: ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 )
-            // InternalDataDSL.g:9562:3: rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2
+            // InternalDataDSL.g:10486:2: ( rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 )
+            // InternalDataDSL.g:10486:3: rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2();
@@ -32809,16 +35931,16 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__3"
-    // InternalDataDSL.g:9570:1: rule__DataInterchangePredefinedExpression__Group__3 : rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4 ;
+    // InternalDataDSL.g:10494:1: rule__DataInterchangePredefinedExpression__Group__3 : rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4 ;
     public final void rule__DataInterchangePredefinedExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9574:1: ( rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4 )
-            // InternalDataDSL.g:9575:2: rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4
+            // InternalDataDSL.g:10498:1: ( rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4 )
+            // InternalDataDSL.g:10499:2: rule__DataInterchangePredefinedExpression__Group__3__Impl rule__DataInterchangePredefinedExpression__Group__4
             {
-            pushFollow(FOLLOW_64);
+            pushFollow(FOLLOW_69);
             rule__DataInterchangePredefinedExpression__Group__3__Impl();
 
             state._fsp--;
@@ -32847,22 +35969,22 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__3__Impl"
-    // InternalDataDSL.g:9582:1: rule__DataInterchangePredefinedExpression__Group__3__Impl : ( 'with' ) ;
+    // InternalDataDSL.g:10506:1: rule__DataInterchangePredefinedExpression__Group__3__Impl : ( 'with' ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9586:1: ( ( 'with' ) )
-            // InternalDataDSL.g:9587:1: ( 'with' )
+            // InternalDataDSL.g:10510:1: ( ( 'with' ) )
+            // InternalDataDSL.g:10511:1: ( 'with' )
             {
-            // InternalDataDSL.g:9587:1: ( 'with' )
-            // InternalDataDSL.g:9588:2: 'with'
+            // InternalDataDSL.g:10511:1: ( 'with' )
+            // InternalDataDSL.g:10512:2: 'with'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getWithKeyword_3()); 
             }
-            match(input,103,FOLLOW_2); if (state.failed) return ;
+            match(input,118,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangePredefinedExpressionAccess().getWithKeyword_3()); 
             }
@@ -32888,16 +36010,16 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__4"
-    // InternalDataDSL.g:9597:1: rule__DataInterchangePredefinedExpression__Group__4 : rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5 ;
+    // InternalDataDSL.g:10521:1: rule__DataInterchangePredefinedExpression__Group__4 : rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5 ;
     public final void rule__DataInterchangePredefinedExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9601:1: ( rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5 )
-            // InternalDataDSL.g:9602:2: rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5
+            // InternalDataDSL.g:10525:1: ( rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5 )
+            // InternalDataDSL.g:10526:2: rule__DataInterchangePredefinedExpression__Group__4__Impl rule__DataInterchangePredefinedExpression__Group__5
             {
-            pushFollow(FOLLOW_65);
+            pushFollow(FOLLOW_70);
             rule__DataInterchangePredefinedExpression__Group__4__Impl();
 
             state._fsp--;
@@ -32926,23 +36048,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__4__Impl"
-    // InternalDataDSL.g:9609:1: rule__DataInterchangePredefinedExpression__Group__4__Impl : ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) ) ;
+    // InternalDataDSL.g:10533:1: rule__DataInterchangePredefinedExpression__Group__4__Impl : ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9613:1: ( ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) ) )
-            // InternalDataDSL.g:9614:1: ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) )
+            // InternalDataDSL.g:10537:1: ( ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) ) )
+            // InternalDataDSL.g:10538:1: ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) )
             {
-            // InternalDataDSL.g:9614:1: ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) )
-            // InternalDataDSL.g:9615:2: ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 )
+            // InternalDataDSL.g:10538:1: ( ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 ) )
+            // InternalDataDSL.g:10539:2: ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanAssignment_4()); 
             }
-            // InternalDataDSL.g:9616:2: ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 )
-            // InternalDataDSL.g:9616:3: rule__DataInterchangePredefinedExpression__BeanAssignment_4
+            // InternalDataDSL.g:10540:2: ( rule__DataInterchangePredefinedExpression__BeanAssignment_4 )
+            // InternalDataDSL.g:10540:3: rule__DataInterchangePredefinedExpression__BeanAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePredefinedExpression__BeanAssignment_4();
@@ -32977,16 +36099,16 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__5"
-    // InternalDataDSL.g:9624:1: rule__DataInterchangePredefinedExpression__Group__5 : rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6 ;
+    // InternalDataDSL.g:10548:1: rule__DataInterchangePredefinedExpression__Group__5 : rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6 ;
     public final void rule__DataInterchangePredefinedExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9628:1: ( rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6 )
-            // InternalDataDSL.g:9629:2: rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6
+            // InternalDataDSL.g:10552:1: ( rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6 )
+            // InternalDataDSL.g:10553:2: rule__DataInterchangePredefinedExpression__Group__5__Impl rule__DataInterchangePredefinedExpression__Group__6
             {
-            pushFollow(FOLLOW_66);
+            pushFollow(FOLLOW_71);
             rule__DataInterchangePredefinedExpression__Group__5__Impl();
 
             state._fsp--;
@@ -33015,22 +36137,22 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__5__Impl"
-    // InternalDataDSL.g:9636:1: rule__DataInterchangePredefinedExpression__Group__5__Impl : ( 'as' ) ;
+    // InternalDataDSL.g:10560:1: rule__DataInterchangePredefinedExpression__Group__5__Impl : ( 'as' ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9640:1: ( ( 'as' ) )
-            // InternalDataDSL.g:9641:1: ( 'as' )
+            // InternalDataDSL.g:10564:1: ( ( 'as' ) )
+            // InternalDataDSL.g:10565:1: ( 'as' )
             {
-            // InternalDataDSL.g:9641:1: ( 'as' )
-            // InternalDataDSL.g:9642:2: 'as'
+            // InternalDataDSL.g:10565:1: ( 'as' )
+            // InternalDataDSL.g:10566:2: 'as'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getAsKeyword_5()); 
             }
-            match(input,115,FOLLOW_2); if (state.failed) return ;
+            match(input,119,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangePredefinedExpressionAccess().getAsKeyword_5()); 
             }
@@ -33056,14 +36178,14 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__6"
-    // InternalDataDSL.g:9651:1: rule__DataInterchangePredefinedExpression__Group__6 : rule__DataInterchangePredefinedExpression__Group__6__Impl ;
+    // InternalDataDSL.g:10575:1: rule__DataInterchangePredefinedExpression__Group__6 : rule__DataInterchangePredefinedExpression__Group__6__Impl ;
     public final void rule__DataInterchangePredefinedExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9655:1: ( rule__DataInterchangePredefinedExpression__Group__6__Impl )
-            // InternalDataDSL.g:9656:2: rule__DataInterchangePredefinedExpression__Group__6__Impl
+            // InternalDataDSL.g:10579:1: ( rule__DataInterchangePredefinedExpression__Group__6__Impl )
+            // InternalDataDSL.g:10580:2: rule__DataInterchangePredefinedExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePredefinedExpression__Group__6__Impl();
@@ -33089,23 +36211,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__Group__6__Impl"
-    // InternalDataDSL.g:9662:1: rule__DataInterchangePredefinedExpression__Group__6__Impl : ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) ) ;
+    // InternalDataDSL.g:10586:1: rule__DataInterchangePredefinedExpression__Group__6__Impl : ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) ) ;
     public final void rule__DataInterchangePredefinedExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9666:1: ( ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) ) )
-            // InternalDataDSL.g:9667:1: ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) )
+            // InternalDataDSL.g:10590:1: ( ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) ) )
+            // InternalDataDSL.g:10591:1: ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) )
             {
-            // InternalDataDSL.g:9667:1: ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) )
-            // InternalDataDSL.g:9668:2: ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 )
+            // InternalDataDSL.g:10591:1: ( ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 ) )
+            // InternalDataDSL.g:10592:2: ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanTypeAssignment_6()); 
             }
-            // InternalDataDSL.g:9669:2: ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 )
-            // InternalDataDSL.g:9669:3: rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6
+            // InternalDataDSL.g:10593:2: ( rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 )
+            // InternalDataDSL.g:10593:3: rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6();
@@ -33140,16 +36262,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__0"
-    // InternalDataDSL.g:9678:1: rule__DataInterchangeValueMapping__Group__0 : rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1 ;
+    // InternalDataDSL.g:10602:1: rule__DataInterchangeValueMapping__Group__0 : rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1 ;
     public final void rule__DataInterchangeValueMapping__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9682:1: ( rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1 )
-            // InternalDataDSL.g:9683:2: rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1
+            // InternalDataDSL.g:10606:1: ( rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1 )
+            // InternalDataDSL.g:10607:2: rule__DataInterchangeValueMapping__Group__0__Impl rule__DataInterchangeValueMapping__Group__1
             {
-            pushFollow(FOLLOW_67);
+            pushFollow(FOLLOW_72);
             rule__DataInterchangeValueMapping__Group__0__Impl();
 
             state._fsp--;
@@ -33178,23 +36300,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__0__Impl"
-    // InternalDataDSL.g:9690:1: rule__DataInterchangeValueMapping__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:10614:1: rule__DataInterchangeValueMapping__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeValueMapping__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9694:1: ( ( () ) )
-            // InternalDataDSL.g:9695:1: ( () )
+            // InternalDataDSL.g:10618:1: ( ( () ) )
+            // InternalDataDSL.g:10619:1: ( () )
             {
-            // InternalDataDSL.g:9695:1: ( () )
-            // InternalDataDSL.g:9696:2: ()
+            // InternalDataDSL.g:10619:1: ( () )
+            // InternalDataDSL.g:10620:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getDataInterchangeValueMappingAction_0()); 
             }
-            // InternalDataDSL.g:9697:2: ()
-            // InternalDataDSL.g:9697:3: 
+            // InternalDataDSL.g:10621:2: ()
+            // InternalDataDSL.g:10621:3: 
             {
             }
 
@@ -33219,14 +36341,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__1"
-    // InternalDataDSL.g:9705:1: rule__DataInterchangeValueMapping__Group__1 : rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2 ;
+    // InternalDataDSL.g:10629:1: rule__DataInterchangeValueMapping__Group__1 : rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2 ;
     public final void rule__DataInterchangeValueMapping__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9709:1: ( rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2 )
-            // InternalDataDSL.g:9710:2: rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2
+            // InternalDataDSL.g:10633:1: ( rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2 )
+            // InternalDataDSL.g:10634:2: rule__DataInterchangeValueMapping__Group__1__Impl rule__DataInterchangeValueMapping__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeValueMapping__Group__1__Impl();
@@ -33257,22 +36379,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__1__Impl"
-    // InternalDataDSL.g:9717:1: rule__DataInterchangeValueMapping__Group__1__Impl : ( 'map' ) ;
+    // InternalDataDSL.g:10641:1: rule__DataInterchangeValueMapping__Group__1__Impl : ( 'map' ) ;
     public final void rule__DataInterchangeValueMapping__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9721:1: ( ( 'map' ) )
-            // InternalDataDSL.g:9722:1: ( 'map' )
+            // InternalDataDSL.g:10645:1: ( ( 'map' ) )
+            // InternalDataDSL.g:10646:1: ( 'map' )
             {
-            // InternalDataDSL.g:9722:1: ( 'map' )
-            // InternalDataDSL.g:9723:2: 'map'
+            // InternalDataDSL.g:10646:1: ( 'map' )
+            // InternalDataDSL.g:10647:2: 'map'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getMapKeyword_1()); 
             }
-            match(input,116,FOLLOW_2); if (state.failed) return ;
+            match(input,120,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeValueMappingAccess().getMapKeyword_1()); 
             }
@@ -33298,16 +36420,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__2"
-    // InternalDataDSL.g:9732:1: rule__DataInterchangeValueMapping__Group__2 : rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3 ;
+    // InternalDataDSL.g:10656:1: rule__DataInterchangeValueMapping__Group__2 : rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3 ;
     public final void rule__DataInterchangeValueMapping__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9736:1: ( rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3 )
-            // InternalDataDSL.g:9737:2: rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3
+            // InternalDataDSL.g:10660:1: ( rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3 )
+            // InternalDataDSL.g:10661:2: rule__DataInterchangeValueMapping__Group__2__Impl rule__DataInterchangeValueMapping__Group__3
             {
-            pushFollow(FOLLOW_68);
+            pushFollow(FOLLOW_73);
             rule__DataInterchangeValueMapping__Group__2__Impl();
 
             state._fsp--;
@@ -33336,23 +36458,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__2__Impl"
-    // InternalDataDSL.g:9744:1: rule__DataInterchangeValueMapping__Group__2__Impl : ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:10668:1: rule__DataInterchangeValueMapping__Group__2__Impl : ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeValueMapping__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9748:1: ( ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:9749:1: ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:10672:1: ( ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:10673:1: ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:9749:1: ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) )
-            // InternalDataDSL.g:9750:2: ( rule__DataInterchangeValueMapping__PropertyAssignment_2 )
+            // InternalDataDSL.g:10673:1: ( ( rule__DataInterchangeValueMapping__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:10674:2: ( rule__DataInterchangeValueMapping__PropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:9751:2: ( rule__DataInterchangeValueMapping__PropertyAssignment_2 )
-            // InternalDataDSL.g:9751:3: rule__DataInterchangeValueMapping__PropertyAssignment_2
+            // InternalDataDSL.g:10675:2: ( rule__DataInterchangeValueMapping__PropertyAssignment_2 )
+            // InternalDataDSL.g:10675:3: rule__DataInterchangeValueMapping__PropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeValueMapping__PropertyAssignment_2();
@@ -33387,14 +36509,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__3"
-    // InternalDataDSL.g:9759:1: rule__DataInterchangeValueMapping__Group__3 : rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4 ;
+    // InternalDataDSL.g:10683:1: rule__DataInterchangeValueMapping__Group__3 : rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4 ;
     public final void rule__DataInterchangeValueMapping__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9763:1: ( rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4 )
-            // InternalDataDSL.g:9764:2: rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4
+            // InternalDataDSL.g:10687:1: ( rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4 )
+            // InternalDataDSL.g:10688:2: rule__DataInterchangeValueMapping__Group__3__Impl rule__DataInterchangeValueMapping__Group__4
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeValueMapping__Group__3__Impl();
@@ -33425,22 +36547,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__3__Impl"
-    // InternalDataDSL.g:9771:1: rule__DataInterchangeValueMapping__Group__3__Impl : ( 'to' ) ;
+    // InternalDataDSL.g:10695:1: rule__DataInterchangeValueMapping__Group__3__Impl : ( 'to' ) ;
     public final void rule__DataInterchangeValueMapping__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9775:1: ( ( 'to' ) )
-            // InternalDataDSL.g:9776:1: ( 'to' )
+            // InternalDataDSL.g:10699:1: ( ( 'to' ) )
+            // InternalDataDSL.g:10700:1: ( 'to' )
             {
-            // InternalDataDSL.g:9776:1: ( 'to' )
-            // InternalDataDSL.g:9777:2: 'to'
+            // InternalDataDSL.g:10700:1: ( 'to' )
+            // InternalDataDSL.g:10701:2: 'to'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getToKeyword_3()); 
             }
-            match(input,117,FOLLOW_2); if (state.failed) return ;
+            match(input,121,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeValueMappingAccess().getToKeyword_3()); 
             }
@@ -33466,14 +36588,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__4"
-    // InternalDataDSL.g:9786:1: rule__DataInterchangeValueMapping__Group__4 : rule__DataInterchangeValueMapping__Group__4__Impl ;
+    // InternalDataDSL.g:10710:1: rule__DataInterchangeValueMapping__Group__4 : rule__DataInterchangeValueMapping__Group__4__Impl ;
     public final void rule__DataInterchangeValueMapping__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9790:1: ( rule__DataInterchangeValueMapping__Group__4__Impl )
-            // InternalDataDSL.g:9791:2: rule__DataInterchangeValueMapping__Group__4__Impl
+            // InternalDataDSL.g:10714:1: ( rule__DataInterchangeValueMapping__Group__4__Impl )
+            // InternalDataDSL.g:10715:2: rule__DataInterchangeValueMapping__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeValueMapping__Group__4__Impl();
@@ -33499,23 +36621,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__Group__4__Impl"
-    // InternalDataDSL.g:9797:1: rule__DataInterchangeValueMapping__Group__4__Impl : ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) ) ;
+    // InternalDataDSL.g:10721:1: rule__DataInterchangeValueMapping__Group__4__Impl : ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) ) ;
     public final void rule__DataInterchangeValueMapping__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9801:1: ( ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) ) )
-            // InternalDataDSL.g:9802:1: ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) )
+            // InternalDataDSL.g:10725:1: ( ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) ) )
+            // InternalDataDSL.g:10726:1: ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) )
             {
-            // InternalDataDSL.g:9802:1: ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) )
-            // InternalDataDSL.g:9803:2: ( rule__DataInterchangeValueMapping__DataAssignment_4 )
+            // InternalDataDSL.g:10726:1: ( ( rule__DataInterchangeValueMapping__DataAssignment_4 ) )
+            // InternalDataDSL.g:10727:2: ( rule__DataInterchangeValueMapping__DataAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getDataAssignment_4()); 
             }
-            // InternalDataDSL.g:9804:2: ( rule__DataInterchangeValueMapping__DataAssignment_4 )
-            // InternalDataDSL.g:9804:3: rule__DataInterchangeValueMapping__DataAssignment_4
+            // InternalDataDSL.g:10728:2: ( rule__DataInterchangeValueMapping__DataAssignment_4 )
+            // InternalDataDSL.g:10728:3: rule__DataInterchangeValueMapping__DataAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeValueMapping__DataAssignment_4();
@@ -33550,16 +36672,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__0"
-    // InternalDataDSL.g:9813:1: rule__DataInterchangeBlobMapping__Group__0 : rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1 ;
+    // InternalDataDSL.g:10737:1: rule__DataInterchangeBlobMapping__Group__0 : rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1 ;
     public final void rule__DataInterchangeBlobMapping__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9817:1: ( rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1 )
-            // InternalDataDSL.g:9818:2: rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1
+            // InternalDataDSL.g:10741:1: ( rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1 )
+            // InternalDataDSL.g:10742:2: rule__DataInterchangeBlobMapping__Group__0__Impl rule__DataInterchangeBlobMapping__Group__1
             {
-            pushFollow(FOLLOW_69);
+            pushFollow(FOLLOW_74);
             rule__DataInterchangeBlobMapping__Group__0__Impl();
 
             state._fsp--;
@@ -33588,23 +36710,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__0__Impl"
-    // InternalDataDSL.g:9825:1: rule__DataInterchangeBlobMapping__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:10749:1: rule__DataInterchangeBlobMapping__Group__0__Impl : ( () ) ;
     public final void rule__DataInterchangeBlobMapping__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9829:1: ( ( () ) )
-            // InternalDataDSL.g:9830:1: ( () )
+            // InternalDataDSL.g:10753:1: ( ( () ) )
+            // InternalDataDSL.g:10754:1: ( () )
             {
-            // InternalDataDSL.g:9830:1: ( () )
-            // InternalDataDSL.g:9831:2: ()
+            // InternalDataDSL.g:10754:1: ( () )
+            // InternalDataDSL.g:10755:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getDataInterchangeBlobMappingAction_0()); 
             }
-            // InternalDataDSL.g:9832:2: ()
-            // InternalDataDSL.g:9832:3: 
+            // InternalDataDSL.g:10756:2: ()
+            // InternalDataDSL.g:10756:3: 
             {
             }
 
@@ -33629,14 +36751,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__1"
-    // InternalDataDSL.g:9840:1: rule__DataInterchangeBlobMapping__Group__1 : rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2 ;
+    // InternalDataDSL.g:10764:1: rule__DataInterchangeBlobMapping__Group__1 : rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2 ;
     public final void rule__DataInterchangeBlobMapping__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9844:1: ( rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2 )
-            // InternalDataDSL.g:9845:2: rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2
+            // InternalDataDSL.g:10768:1: ( rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2 )
+            // InternalDataDSL.g:10769:2: rule__DataInterchangeBlobMapping__Group__1__Impl rule__DataInterchangeBlobMapping__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__DataInterchangeBlobMapping__Group__1__Impl();
@@ -33667,22 +36789,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__1__Impl"
-    // InternalDataDSL.g:9852:1: rule__DataInterchangeBlobMapping__Group__1__Impl : ( 'mapBlob' ) ;
+    // InternalDataDSL.g:10776:1: rule__DataInterchangeBlobMapping__Group__1__Impl : ( 'mapBlob' ) ;
     public final void rule__DataInterchangeBlobMapping__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9856:1: ( ( 'mapBlob' ) )
-            // InternalDataDSL.g:9857:1: ( 'mapBlob' )
+            // InternalDataDSL.g:10780:1: ( ( 'mapBlob' ) )
+            // InternalDataDSL.g:10781:1: ( 'mapBlob' )
             {
-            // InternalDataDSL.g:9857:1: ( 'mapBlob' )
-            // InternalDataDSL.g:9858:2: 'mapBlob'
+            // InternalDataDSL.g:10781:1: ( 'mapBlob' )
+            // InternalDataDSL.g:10782:2: 'mapBlob'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getMapBlobKeyword_1()); 
             }
-            match(input,118,FOLLOW_2); if (state.failed) return ;
+            match(input,122,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeBlobMappingAccess().getMapBlobKeyword_1()); 
             }
@@ -33708,16 +36830,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__2"
-    // InternalDataDSL.g:9867:1: rule__DataInterchangeBlobMapping__Group__2 : rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3 ;
+    // InternalDataDSL.g:10791:1: rule__DataInterchangeBlobMapping__Group__2 : rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3 ;
     public final void rule__DataInterchangeBlobMapping__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9871:1: ( rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3 )
-            // InternalDataDSL.g:9872:2: rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3
+            // InternalDataDSL.g:10795:1: ( rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3 )
+            // InternalDataDSL.g:10796:2: rule__DataInterchangeBlobMapping__Group__2__Impl rule__DataInterchangeBlobMapping__Group__3
             {
-            pushFollow(FOLLOW_68);
+            pushFollow(FOLLOW_73);
             rule__DataInterchangeBlobMapping__Group__2__Impl();
 
             state._fsp--;
@@ -33746,23 +36868,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__2__Impl"
-    // InternalDataDSL.g:9879:1: rule__DataInterchangeBlobMapping__Group__2__Impl : ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) ) ;
+    // InternalDataDSL.g:10803:1: rule__DataInterchangeBlobMapping__Group__2__Impl : ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) ) ;
     public final void rule__DataInterchangeBlobMapping__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9883:1: ( ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) ) )
-            // InternalDataDSL.g:9884:1: ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:10807:1: ( ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:10808:1: ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) )
             {
-            // InternalDataDSL.g:9884:1: ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) )
-            // InternalDataDSL.g:9885:2: ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 )
+            // InternalDataDSL.g:10808:1: ( ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:10809:2: ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getPropertyAssignment_2()); 
             }
-            // InternalDataDSL.g:9886:2: ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 )
-            // InternalDataDSL.g:9886:3: rule__DataInterchangeBlobMapping__PropertyAssignment_2
+            // InternalDataDSL.g:10810:2: ( rule__DataInterchangeBlobMapping__PropertyAssignment_2 )
+            // InternalDataDSL.g:10810:3: rule__DataInterchangeBlobMapping__PropertyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__PropertyAssignment_2();
@@ -33797,14 +36919,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__3"
-    // InternalDataDSL.g:9894:1: rule__DataInterchangeBlobMapping__Group__3 : rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4 ;
+    // InternalDataDSL.g:10818:1: rule__DataInterchangeBlobMapping__Group__3 : rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4 ;
     public final void rule__DataInterchangeBlobMapping__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9898:1: ( rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4 )
-            // InternalDataDSL.g:9899:2: rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4
+            // InternalDataDSL.g:10822:1: ( rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4 )
+            // InternalDataDSL.g:10823:2: rule__DataInterchangeBlobMapping__Group__3__Impl rule__DataInterchangeBlobMapping__Group__4
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeBlobMapping__Group__3__Impl();
@@ -33835,22 +36957,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__3__Impl"
-    // InternalDataDSL.g:9906:1: rule__DataInterchangeBlobMapping__Group__3__Impl : ( 'to' ) ;
+    // InternalDataDSL.g:10830:1: rule__DataInterchangeBlobMapping__Group__3__Impl : ( 'to' ) ;
     public final void rule__DataInterchangeBlobMapping__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9910:1: ( ( 'to' ) )
-            // InternalDataDSL.g:9911:1: ( 'to' )
+            // InternalDataDSL.g:10834:1: ( ( 'to' ) )
+            // InternalDataDSL.g:10835:1: ( 'to' )
             {
-            // InternalDataDSL.g:9911:1: ( 'to' )
-            // InternalDataDSL.g:9912:2: 'to'
+            // InternalDataDSL.g:10835:1: ( 'to' )
+            // InternalDataDSL.g:10836:2: 'to'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getToKeyword_3()); 
             }
-            match(input,117,FOLLOW_2); if (state.failed) return ;
+            match(input,121,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeBlobMappingAccess().getToKeyword_3()); 
             }
@@ -33876,16 +36998,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__4"
-    // InternalDataDSL.g:9921:1: rule__DataInterchangeBlobMapping__Group__4 : rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5 ;
+    // InternalDataDSL.g:10845:1: rule__DataInterchangeBlobMapping__Group__4 : rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5 ;
     public final void rule__DataInterchangeBlobMapping__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9925:1: ( rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5 )
-            // InternalDataDSL.g:9926:2: rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5
+            // InternalDataDSL.g:10849:1: ( rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5 )
+            // InternalDataDSL.g:10850:2: rule__DataInterchangeBlobMapping__Group__4__Impl rule__DataInterchangeBlobMapping__Group__5
             {
-            pushFollow(FOLLOW_70);
+            pushFollow(FOLLOW_75);
             rule__DataInterchangeBlobMapping__Group__4__Impl();
 
             state._fsp--;
@@ -33914,23 +37036,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__4__Impl"
-    // InternalDataDSL.g:9933:1: rule__DataInterchangeBlobMapping__Group__4__Impl : ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) ) ;
+    // InternalDataDSL.g:10857:1: rule__DataInterchangeBlobMapping__Group__4__Impl : ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) ) ;
     public final void rule__DataInterchangeBlobMapping__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9937:1: ( ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) ) )
-            // InternalDataDSL.g:9938:1: ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) )
+            // InternalDataDSL.g:10861:1: ( ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) ) )
+            // InternalDataDSL.g:10862:1: ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) )
             {
-            // InternalDataDSL.g:9938:1: ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) )
-            // InternalDataDSL.g:9939:2: ( rule__DataInterchangeBlobMapping__DataAssignment_4 )
+            // InternalDataDSL.g:10862:1: ( ( rule__DataInterchangeBlobMapping__DataAssignment_4 ) )
+            // InternalDataDSL.g:10863:2: ( rule__DataInterchangeBlobMapping__DataAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getDataAssignment_4()); 
             }
-            // InternalDataDSL.g:9940:2: ( rule__DataInterchangeBlobMapping__DataAssignment_4 )
-            // InternalDataDSL.g:9940:3: rule__DataInterchangeBlobMapping__DataAssignment_4
+            // InternalDataDSL.g:10864:2: ( rule__DataInterchangeBlobMapping__DataAssignment_4 )
+            // InternalDataDSL.g:10864:3: rule__DataInterchangeBlobMapping__DataAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__DataAssignment_4();
@@ -33965,16 +37087,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__5"
-    // InternalDataDSL.g:9948:1: rule__DataInterchangeBlobMapping__Group__5 : rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6 ;
+    // InternalDataDSL.g:10872:1: rule__DataInterchangeBlobMapping__Group__5 : rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6 ;
     public final void rule__DataInterchangeBlobMapping__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9952:1: ( rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6 )
-            // InternalDataDSL.g:9953:2: rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6
+            // InternalDataDSL.g:10876:1: ( rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6 )
+            // InternalDataDSL.g:10877:2: rule__DataInterchangeBlobMapping__Group__5__Impl rule__DataInterchangeBlobMapping__Group__6
             {
-            pushFollow(FOLLOW_70);
+            pushFollow(FOLLOW_75);
             rule__DataInterchangeBlobMapping__Group__5__Impl();
 
             state._fsp--;
@@ -34003,31 +37125,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__5__Impl"
-    // InternalDataDSL.g:9960:1: rule__DataInterchangeBlobMapping__Group__5__Impl : ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? ) ;
+    // InternalDataDSL.g:10884:1: rule__DataInterchangeBlobMapping__Group__5__Impl : ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? ) ;
     public final void rule__DataInterchangeBlobMapping__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9964:1: ( ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? ) )
-            // InternalDataDSL.g:9965:1: ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? )
+            // InternalDataDSL.g:10888:1: ( ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? ) )
+            // InternalDataDSL.g:10889:1: ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? )
             {
-            // InternalDataDSL.g:9965:1: ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? )
-            // InternalDataDSL.g:9966:2: ( rule__DataInterchangeBlobMapping__Group_5__0 )?
+            // InternalDataDSL.g:10889:1: ( ( rule__DataInterchangeBlobMapping__Group_5__0 )? )
+            // InternalDataDSL.g:10890:2: ( rule__DataInterchangeBlobMapping__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup_5()); 
             }
-            // InternalDataDSL.g:9967:2: ( rule__DataInterchangeBlobMapping__Group_5__0 )?
-            int alt96=2;
-            int LA96_0 = input.LA(1);
+            // InternalDataDSL.g:10891:2: ( rule__DataInterchangeBlobMapping__Group_5__0 )?
+            int alt101=2;
+            int LA101_0 = input.LA(1);
 
-            if ( (LA96_0==48) ) {
-                alt96=1;
+            if ( (LA101_0==48) ) {
+                alt101=1;
             }
-            switch (alt96) {
+            switch (alt101) {
                 case 1 :
-                    // InternalDataDSL.g:9967:3: rule__DataInterchangeBlobMapping__Group_5__0
+                    // InternalDataDSL.g:10891:3: rule__DataInterchangeBlobMapping__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBlobMapping__Group_5__0();
@@ -34065,16 +37187,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__6"
-    // InternalDataDSL.g:9975:1: rule__DataInterchangeBlobMapping__Group__6 : rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7 ;
+    // InternalDataDSL.g:10899:1: rule__DataInterchangeBlobMapping__Group__6 : rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7 ;
     public final void rule__DataInterchangeBlobMapping__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9979:1: ( rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7 )
-            // InternalDataDSL.g:9980:2: rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7
+            // InternalDataDSL.g:10903:1: ( rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7 )
+            // InternalDataDSL.g:10904:2: rule__DataInterchangeBlobMapping__Group__6__Impl rule__DataInterchangeBlobMapping__Group__7
             {
-            pushFollow(FOLLOW_70);
+            pushFollow(FOLLOW_75);
             rule__DataInterchangeBlobMapping__Group__6__Impl();
 
             state._fsp--;
@@ -34103,31 +37225,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__6__Impl"
-    // InternalDataDSL.g:9987:1: rule__DataInterchangeBlobMapping__Group__6__Impl : ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? ) ;
+    // InternalDataDSL.g:10911:1: rule__DataInterchangeBlobMapping__Group__6__Impl : ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? ) ;
     public final void rule__DataInterchangeBlobMapping__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:9991:1: ( ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? ) )
-            // InternalDataDSL.g:9992:1: ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? )
+            // InternalDataDSL.g:10915:1: ( ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? ) )
+            // InternalDataDSL.g:10916:1: ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? )
             {
-            // InternalDataDSL.g:9992:1: ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? )
-            // InternalDataDSL.g:9993:2: ( rule__DataInterchangeBlobMapping__Group_6__0 )?
+            // InternalDataDSL.g:10916:1: ( ( rule__DataInterchangeBlobMapping__Group_6__0 )? )
+            // InternalDataDSL.g:10917:2: ( rule__DataInterchangeBlobMapping__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getGroup_6()); 
             }
-            // InternalDataDSL.g:9994:2: ( rule__DataInterchangeBlobMapping__Group_6__0 )?
-            int alt97=2;
-            int LA97_0 = input.LA(1);
+            // InternalDataDSL.g:10918:2: ( rule__DataInterchangeBlobMapping__Group_6__0 )?
+            int alt102=2;
+            int LA102_0 = input.LA(1);
 
-            if ( (LA97_0==79) ) {
-                alt97=1;
+            if ( (LA102_0==79) ) {
+                alt102=1;
             }
-            switch (alt97) {
+            switch (alt102) {
                 case 1 :
-                    // InternalDataDSL.g:9994:3: rule__DataInterchangeBlobMapping__Group_6__0
+                    // InternalDataDSL.g:10918:3: rule__DataInterchangeBlobMapping__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeBlobMapping__Group_6__0();
@@ -34165,16 +37287,16 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__7"
-    // InternalDataDSL.g:10002:1: rule__DataInterchangeBlobMapping__Group__7 : rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8 ;
+    // InternalDataDSL.g:10926:1: rule__DataInterchangeBlobMapping__Group__7 : rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8 ;
     public final void rule__DataInterchangeBlobMapping__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10006:1: ( rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8 )
-            // InternalDataDSL.g:10007:2: rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8
+            // InternalDataDSL.g:10930:1: ( rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8 )
+            // InternalDataDSL.g:10931:2: rule__DataInterchangeBlobMapping__Group__7__Impl rule__DataInterchangeBlobMapping__Group__8
             {
-            pushFollow(FOLLOW_71);
+            pushFollow(FOLLOW_76);
             rule__DataInterchangeBlobMapping__Group__7__Impl();
 
             state._fsp--;
@@ -34203,22 +37325,22 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__7__Impl"
-    // InternalDataDSL.g:10014:1: rule__DataInterchangeBlobMapping__Group__7__Impl : ( 'mimeType' ) ;
+    // InternalDataDSL.g:10938:1: rule__DataInterchangeBlobMapping__Group__7__Impl : ( 'mimeType' ) ;
     public final void rule__DataInterchangeBlobMapping__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10018:1: ( ( 'mimeType' ) )
-            // InternalDataDSL.g:10019:1: ( 'mimeType' )
+            // InternalDataDSL.g:10942:1: ( ( 'mimeType' ) )
+            // InternalDataDSL.g:10943:1: ( 'mimeType' )
             {
-            // InternalDataDSL.g:10019:1: ( 'mimeType' )
-            // InternalDataDSL.g:10020:2: 'mimeType'
+            // InternalDataDSL.g:10943:1: ( 'mimeType' )
+            // InternalDataDSL.g:10944:2: 'mimeType'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypeKeyword_7()); 
             }
-            match(input,119,FOLLOW_2); if (state.failed) return ;
+            match(input,123,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypeKeyword_7()); 
             }
@@ -34244,14 +37366,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__8"
-    // InternalDataDSL.g:10029:1: rule__DataInterchangeBlobMapping__Group__8 : rule__DataInterchangeBlobMapping__Group__8__Impl ;
+    // InternalDataDSL.g:10953:1: rule__DataInterchangeBlobMapping__Group__8 : rule__DataInterchangeBlobMapping__Group__8__Impl ;
     public final void rule__DataInterchangeBlobMapping__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10033:1: ( rule__DataInterchangeBlobMapping__Group__8__Impl )
-            // InternalDataDSL.g:10034:2: rule__DataInterchangeBlobMapping__Group__8__Impl
+            // InternalDataDSL.g:10957:1: ( rule__DataInterchangeBlobMapping__Group__8__Impl )
+            // InternalDataDSL.g:10958:2: rule__DataInterchangeBlobMapping__Group__8__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__Group__8__Impl();
@@ -34277,23 +37399,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group__8__Impl"
-    // InternalDataDSL.g:10040:1: rule__DataInterchangeBlobMapping__Group__8__Impl : ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) ) ;
+    // InternalDataDSL.g:10964:1: rule__DataInterchangeBlobMapping__Group__8__Impl : ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) ) ;
     public final void rule__DataInterchangeBlobMapping__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10044:1: ( ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) ) )
-            // InternalDataDSL.g:10045:1: ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) )
+            // InternalDataDSL.g:10968:1: ( ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) ) )
+            // InternalDataDSL.g:10969:1: ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) )
             {
-            // InternalDataDSL.g:10045:1: ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) )
-            // InternalDataDSL.g:10046:2: ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 )
+            // InternalDataDSL.g:10969:1: ( ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 ) )
+            // InternalDataDSL.g:10970:2: ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypeAssignment_8()); 
             }
-            // InternalDataDSL.g:10047:2: ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 )
-            // InternalDataDSL.g:10047:3: rule__DataInterchangeBlobMapping__MimeTypeAssignment_8
+            // InternalDataDSL.g:10971:2: ( rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 )
+            // InternalDataDSL.g:10971:3: rule__DataInterchangeBlobMapping__MimeTypeAssignment_8
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__MimeTypeAssignment_8();
@@ -34328,14 +37450,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_5__0"
-    // InternalDataDSL.g:10056:1: rule__DataInterchangeBlobMapping__Group_5__0 : rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1 ;
+    // InternalDataDSL.g:10980:1: rule__DataInterchangeBlobMapping__Group_5__0 : rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1 ;
     public final void rule__DataInterchangeBlobMapping__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10060:1: ( rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1 )
-            // InternalDataDSL.g:10061:2: rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1
+            // InternalDataDSL.g:10984:1: ( rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1 )
+            // InternalDataDSL.g:10985:2: rule__DataInterchangeBlobMapping__Group_5__0__Impl rule__DataInterchangeBlobMapping__Group_5__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeBlobMapping__Group_5__0__Impl();
@@ -34366,17 +37488,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_5__0__Impl"
-    // InternalDataDSL.g:10068:1: rule__DataInterchangeBlobMapping__Group_5__0__Impl : ( 'extension' ) ;
+    // InternalDataDSL.g:10992:1: rule__DataInterchangeBlobMapping__Group_5__0__Impl : ( 'extension' ) ;
     public final void rule__DataInterchangeBlobMapping__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10072:1: ( ( 'extension' ) )
-            // InternalDataDSL.g:10073:1: ( 'extension' )
+            // InternalDataDSL.g:10996:1: ( ( 'extension' ) )
+            // InternalDataDSL.g:10997:1: ( 'extension' )
             {
-            // InternalDataDSL.g:10073:1: ( 'extension' )
-            // InternalDataDSL.g:10074:2: 'extension'
+            // InternalDataDSL.g:10997:1: ( 'extension' )
+            // InternalDataDSL.g:10998:2: 'extension'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getExtensionKeyword_5_0()); 
@@ -34407,14 +37529,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_5__1"
-    // InternalDataDSL.g:10083:1: rule__DataInterchangeBlobMapping__Group_5__1 : rule__DataInterchangeBlobMapping__Group_5__1__Impl ;
+    // InternalDataDSL.g:11007:1: rule__DataInterchangeBlobMapping__Group_5__1 : rule__DataInterchangeBlobMapping__Group_5__1__Impl ;
     public final void rule__DataInterchangeBlobMapping__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10087:1: ( rule__DataInterchangeBlobMapping__Group_5__1__Impl )
-            // InternalDataDSL.g:10088:2: rule__DataInterchangeBlobMapping__Group_5__1__Impl
+            // InternalDataDSL.g:11011:1: ( rule__DataInterchangeBlobMapping__Group_5__1__Impl )
+            // InternalDataDSL.g:11012:2: rule__DataInterchangeBlobMapping__Group_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__Group_5__1__Impl();
@@ -34440,23 +37562,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_5__1__Impl"
-    // InternalDataDSL.g:10094:1: rule__DataInterchangeBlobMapping__Group_5__1__Impl : ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) ) ;
+    // InternalDataDSL.g:11018:1: rule__DataInterchangeBlobMapping__Group_5__1__Impl : ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) ) ;
     public final void rule__DataInterchangeBlobMapping__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10098:1: ( ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) ) )
-            // InternalDataDSL.g:10099:1: ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) )
+            // InternalDataDSL.g:11022:1: ( ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) ) )
+            // InternalDataDSL.g:11023:1: ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) )
             {
-            // InternalDataDSL.g:10099:1: ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) )
-            // InternalDataDSL.g:10100:2: ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 )
+            // InternalDataDSL.g:11023:1: ( ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 ) )
+            // InternalDataDSL.g:11024:2: ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobFileExtensionAssignment_5_1()); 
             }
-            // InternalDataDSL.g:10101:2: ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 )
-            // InternalDataDSL.g:10101:3: rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1
+            // InternalDataDSL.g:11025:2: ( rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 )
+            // InternalDataDSL.g:11025:3: rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1();
@@ -34491,14 +37613,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_6__0"
-    // InternalDataDSL.g:10110:1: rule__DataInterchangeBlobMapping__Group_6__0 : rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1 ;
+    // InternalDataDSL.g:11034:1: rule__DataInterchangeBlobMapping__Group_6__0 : rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1 ;
     public final void rule__DataInterchangeBlobMapping__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10114:1: ( rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1 )
-            // InternalDataDSL.g:10115:2: rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1
+            // InternalDataDSL.g:11038:1: ( rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1 )
+            // InternalDataDSL.g:11039:2: rule__DataInterchangeBlobMapping__Group_6__0__Impl rule__DataInterchangeBlobMapping__Group_6__1
             {
             pushFollow(FOLLOW_21);
             rule__DataInterchangeBlobMapping__Group_6__0__Impl();
@@ -34529,17 +37651,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_6__0__Impl"
-    // InternalDataDSL.g:10122:1: rule__DataInterchangeBlobMapping__Group_6__0__Impl : ( 'path' ) ;
+    // InternalDataDSL.g:11046:1: rule__DataInterchangeBlobMapping__Group_6__0__Impl : ( 'path' ) ;
     public final void rule__DataInterchangeBlobMapping__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10126:1: ( ( 'path' ) )
-            // InternalDataDSL.g:10127:1: ( 'path' )
+            // InternalDataDSL.g:11050:1: ( ( 'path' ) )
+            // InternalDataDSL.g:11051:1: ( 'path' )
             {
-            // InternalDataDSL.g:10127:1: ( 'path' )
-            // InternalDataDSL.g:10128:2: 'path'
+            // InternalDataDSL.g:11051:1: ( 'path' )
+            // InternalDataDSL.g:11052:2: 'path'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getPathKeyword_6_0()); 
@@ -34570,14 +37692,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_6__1"
-    // InternalDataDSL.g:10137:1: rule__DataInterchangeBlobMapping__Group_6__1 : rule__DataInterchangeBlobMapping__Group_6__1__Impl ;
+    // InternalDataDSL.g:11061:1: rule__DataInterchangeBlobMapping__Group_6__1 : rule__DataInterchangeBlobMapping__Group_6__1__Impl ;
     public final void rule__DataInterchangeBlobMapping__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10141:1: ( rule__DataInterchangeBlobMapping__Group_6__1__Impl )
-            // InternalDataDSL.g:10142:2: rule__DataInterchangeBlobMapping__Group_6__1__Impl
+            // InternalDataDSL.g:11065:1: ( rule__DataInterchangeBlobMapping__Group_6__1__Impl )
+            // InternalDataDSL.g:11066:2: rule__DataInterchangeBlobMapping__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__Group_6__1__Impl();
@@ -34603,23 +37725,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__Group_6__1__Impl"
-    // InternalDataDSL.g:10148:1: rule__DataInterchangeBlobMapping__Group_6__1__Impl : ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) ) ;
+    // InternalDataDSL.g:11072:1: rule__DataInterchangeBlobMapping__Group_6__1__Impl : ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) ) ;
     public final void rule__DataInterchangeBlobMapping__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10152:1: ( ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) ) )
-            // InternalDataDSL.g:10153:1: ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) )
+            // InternalDataDSL.g:11076:1: ( ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) ) )
+            // InternalDataDSL.g:11077:1: ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) )
             {
-            // InternalDataDSL.g:10153:1: ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) )
-            // InternalDataDSL.g:10154:2: ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 )
+            // InternalDataDSL.g:11077:1: ( ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 ) )
+            // InternalDataDSL.g:11078:2: ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobPathAssignment_6_1()); 
             }
-            // InternalDataDSL.g:10155:2: ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 )
-            // InternalDataDSL.g:10155:3: rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1
+            // InternalDataDSL.g:11079:2: ( rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 )
+            // InternalDataDSL.g:11079:3: rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1();
@@ -34653,17 +37775,516 @@
     // $ANTLR end "rule__DataInterchangeBlobMapping__Group_6__1__Impl"
 
 
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__0"
+    // InternalDataDSL.g:11088:1: rule__DataInterchangeFixedColumnMapping__Group__0 : rule__DataInterchangeFixedColumnMapping__Group__0__Impl rule__DataInterchangeFixedColumnMapping__Group__1 ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11092:1: ( rule__DataInterchangeFixedColumnMapping__Group__0__Impl rule__DataInterchangeFixedColumnMapping__Group__1 )
+            // InternalDataDSL.g:11093:2: rule__DataInterchangeFixedColumnMapping__Group__0__Impl rule__DataInterchangeFixedColumnMapping__Group__1
+            {
+            pushFollow(FOLLOW_77);
+            rule__DataInterchangeFixedColumnMapping__Group__0__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__1();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__0"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__0__Impl"
+    // InternalDataDSL.g:11100:1: rule__DataInterchangeFixedColumnMapping__Group__0__Impl : ( () ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__0__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11104:1: ( ( () ) )
+            // InternalDataDSL.g:11105:1: ( () )
+            {
+            // InternalDataDSL.g:11105:1: ( () )
+            // InternalDataDSL.g:11106:2: ()
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0()); 
+            }
+            // InternalDataDSL.g:11107:2: ()
+            // InternalDataDSL.g:11107:3: 
+            {
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__0__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__1"
+    // InternalDataDSL.g:11115:1: rule__DataInterchangeFixedColumnMapping__Group__1 : rule__DataInterchangeFixedColumnMapping__Group__1__Impl rule__DataInterchangeFixedColumnMapping__Group__2 ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11119:1: ( rule__DataInterchangeFixedColumnMapping__Group__1__Impl rule__DataInterchangeFixedColumnMapping__Group__2 )
+            // InternalDataDSL.g:11120:2: rule__DataInterchangeFixedColumnMapping__Group__1__Impl rule__DataInterchangeFixedColumnMapping__Group__2
+            {
+            pushFollow(FOLLOW_7);
+            rule__DataInterchangeFixedColumnMapping__Group__1__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__1"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__1__Impl"
+    // InternalDataDSL.g:11127:1: rule__DataInterchangeFixedColumnMapping__Group__1__Impl : ( 'mapFixedLength' ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__1__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11131:1: ( ( 'mapFixedLength' ) )
+            // InternalDataDSL.g:11132:1: ( 'mapFixedLength' )
+            {
+            // InternalDataDSL.g:11132:1: ( 'mapFixedLength' )
+            // InternalDataDSL.g:11133:2: 'mapFixedLength'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1()); 
+            }
+            match(input,124,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__1__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__2"
+    // InternalDataDSL.g:11142:1: rule__DataInterchangeFixedColumnMapping__Group__2 : rule__DataInterchangeFixedColumnMapping__Group__2__Impl rule__DataInterchangeFixedColumnMapping__Group__3 ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11146:1: ( rule__DataInterchangeFixedColumnMapping__Group__2__Impl rule__DataInterchangeFixedColumnMapping__Group__3 )
+            // InternalDataDSL.g:11147:2: rule__DataInterchangeFixedColumnMapping__Group__2__Impl rule__DataInterchangeFixedColumnMapping__Group__3
+            {
+            pushFollow(FOLLOW_78);
+            rule__DataInterchangeFixedColumnMapping__Group__2__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__3();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__2"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__2__Impl"
+    // InternalDataDSL.g:11154:1: rule__DataInterchangeFixedColumnMapping__Group__2__Impl : ( ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__2__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11158:1: ( ( ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 ) ) )
+            // InternalDataDSL.g:11159:1: ( ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 ) )
+            {
+            // InternalDataDSL.g:11159:1: ( ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 ) )
+            // InternalDataDSL.g:11160:2: ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyAssignment_2()); 
+            }
+            // InternalDataDSL.g:11161:2: ( rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 )
+            // InternalDataDSL.g:11161:3: rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyAssignment_2()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__2__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__3"
+    // InternalDataDSL.g:11169:1: rule__DataInterchangeFixedColumnMapping__Group__3 : rule__DataInterchangeFixedColumnMapping__Group__3__Impl rule__DataInterchangeFixedColumnMapping__Group__4 ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11173:1: ( rule__DataInterchangeFixedColumnMapping__Group__3__Impl rule__DataInterchangeFixedColumnMapping__Group__4 )
+            // InternalDataDSL.g:11174:2: rule__DataInterchangeFixedColumnMapping__Group__3__Impl rule__DataInterchangeFixedColumnMapping__Group__4
+            {
+            pushFollow(FOLLOW_22);
+            rule__DataInterchangeFixedColumnMapping__Group__3__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__3"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__3__Impl"
+    // InternalDataDSL.g:11181:1: rule__DataInterchangeFixedColumnMapping__Group__3__Impl : ( 'length' ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__3__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11185:1: ( ( 'length' ) )
+            // InternalDataDSL.g:11186:1: ( 'length' )
+            {
+            // InternalDataDSL.g:11186:1: ( 'length' )
+            // InternalDataDSL.g:11187:2: 'length'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3()); 
+            }
+            match(input,125,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__3__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__4"
+    // InternalDataDSL.g:11196:1: rule__DataInterchangeFixedColumnMapping__Group__4 : rule__DataInterchangeFixedColumnMapping__Group__4__Impl rule__DataInterchangeFixedColumnMapping__Group__5 ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11200:1: ( rule__DataInterchangeFixedColumnMapping__Group__4__Impl rule__DataInterchangeFixedColumnMapping__Group__5 )
+            // InternalDataDSL.g:11201:2: rule__DataInterchangeFixedColumnMapping__Group__4__Impl rule__DataInterchangeFixedColumnMapping__Group__5
+            {
+            pushFollow(FOLLOW_79);
+            rule__DataInterchangeFixedColumnMapping__Group__4__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__4"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__4__Impl"
+    // InternalDataDSL.g:11208:1: rule__DataInterchangeFixedColumnMapping__Group__4__Impl : ( ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__4__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11212:1: ( ( ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 ) ) )
+            // InternalDataDSL.g:11213:1: ( ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 ) )
+            {
+            // InternalDataDSL.g:11213:1: ( ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 ) )
+            // InternalDataDSL.g:11214:2: ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthAssignment_4()); 
+            }
+            // InternalDataDSL.g:11215:2: ( rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 )
+            // InternalDataDSL.g:11215:3: rule__DataInterchangeFixedColumnMapping__LengthAssignment_4
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__LengthAssignment_4();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthAssignment_4()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__4__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__5"
+    // InternalDataDSL.g:11223:1: rule__DataInterchangeFixedColumnMapping__Group__5 : rule__DataInterchangeFixedColumnMapping__Group__5__Impl ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11227:1: ( rule__DataInterchangeFixedColumnMapping__Group__5__Impl )
+            // InternalDataDSL.g:11228:2: rule__DataInterchangeFixedColumnMapping__Group__5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__Group__5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__5"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__Group__5__Impl"
+    // InternalDataDSL.g:11234:1: rule__DataInterchangeFixedColumnMapping__Group__5__Impl : ( ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__Group__5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:11238:1: ( ( ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 ) ) )
+            // InternalDataDSL.g:11239:1: ( ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 ) )
+            {
+            // InternalDataDSL.g:11239:1: ( ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 ) )
+            // InternalDataDSL.g:11240:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5()); 
+            }
+            // InternalDataDSL.g:11241:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 )
+            // InternalDataDSL.g:11241:3: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__Group__5__Impl"
+
+
     // $ANTLR start "rule__LFQN__Group__0"
-    // InternalDataDSL.g:10164:1: rule__LFQN__Group__0 : rule__LFQN__Group__0__Impl rule__LFQN__Group__1 ;
+    // InternalDataDSL.g:11250:1: rule__LFQN__Group__0 : rule__LFQN__Group__0__Impl rule__LFQN__Group__1 ;
     public final void rule__LFQN__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10168:1: ( rule__LFQN__Group__0__Impl rule__LFQN__Group__1 )
-            // InternalDataDSL.g:10169:2: rule__LFQN__Group__0__Impl rule__LFQN__Group__1
+            // InternalDataDSL.g:11254:1: ( rule__LFQN__Group__0__Impl rule__LFQN__Group__1 )
+            // InternalDataDSL.g:11255:2: rule__LFQN__Group__0__Impl rule__LFQN__Group__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__LFQN__Group__0__Impl();
 
             state._fsp--;
@@ -34692,17 +38313,17 @@
 
 
     // $ANTLR start "rule__LFQN__Group__0__Impl"
-    // InternalDataDSL.g:10176:1: rule__LFQN__Group__0__Impl : ( RULE_ID ) ;
+    // InternalDataDSL.g:11262:1: rule__LFQN__Group__0__Impl : ( RULE_ID ) ;
     public final void rule__LFQN__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10180:1: ( ( RULE_ID ) )
-            // InternalDataDSL.g:10181:1: ( RULE_ID )
+            // InternalDataDSL.g:11266:1: ( ( RULE_ID ) )
+            // InternalDataDSL.g:11267:1: ( RULE_ID )
             {
-            // InternalDataDSL.g:10181:1: ( RULE_ID )
-            // InternalDataDSL.g:10182:2: RULE_ID
+            // InternalDataDSL.g:11267:1: ( RULE_ID )
+            // InternalDataDSL.g:11268:2: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNAccess().getIDTerminalRuleCall_0()); 
@@ -34733,14 +38354,14 @@
 
 
     // $ANTLR start "rule__LFQN__Group__1"
-    // InternalDataDSL.g:10191:1: rule__LFQN__Group__1 : rule__LFQN__Group__1__Impl ;
+    // InternalDataDSL.g:11277:1: rule__LFQN__Group__1 : rule__LFQN__Group__1__Impl ;
     public final void rule__LFQN__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10195:1: ( rule__LFQN__Group__1__Impl )
-            // InternalDataDSL.g:10196:2: rule__LFQN__Group__1__Impl
+            // InternalDataDSL.g:11281:1: ( rule__LFQN__Group__1__Impl )
+            // InternalDataDSL.g:11282:2: rule__LFQN__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__LFQN__Group__1__Impl();
@@ -34766,37 +38387,37 @@
 
 
     // $ANTLR start "rule__LFQN__Group__1__Impl"
-    // InternalDataDSL.g:10202:1: rule__LFQN__Group__1__Impl : ( ( rule__LFQN__Group_1__0 )* ) ;
+    // InternalDataDSL.g:11288:1: rule__LFQN__Group__1__Impl : ( ( rule__LFQN__Group_1__0 )* ) ;
     public final void rule__LFQN__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10206:1: ( ( ( rule__LFQN__Group_1__0 )* ) )
-            // InternalDataDSL.g:10207:1: ( ( rule__LFQN__Group_1__0 )* )
+            // InternalDataDSL.g:11292:1: ( ( ( rule__LFQN__Group_1__0 )* ) )
+            // InternalDataDSL.g:11293:1: ( ( rule__LFQN__Group_1__0 )* )
             {
-            // InternalDataDSL.g:10207:1: ( ( rule__LFQN__Group_1__0 )* )
-            // InternalDataDSL.g:10208:2: ( rule__LFQN__Group_1__0 )*
+            // InternalDataDSL.g:11293:1: ( ( rule__LFQN__Group_1__0 )* )
+            // InternalDataDSL.g:11294:2: ( rule__LFQN__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:10209:2: ( rule__LFQN__Group_1__0 )*
-            loop98:
+            // InternalDataDSL.g:11295:2: ( rule__LFQN__Group_1__0 )*
+            loop103:
             do {
-                int alt98=2;
-                int LA98_0 = input.LA(1);
+                int alt103=2;
+                int LA103_0 = input.LA(1);
 
-                if ( (LA98_0==43) ) {
-                    alt98=1;
+                if ( (LA103_0==43) ) {
+                    alt103=1;
                 }
 
 
-                switch (alt98) {
+                switch (alt103) {
             	case 1 :
-            	    // InternalDataDSL.g:10209:3: rule__LFQN__Group_1__0
+            	    // InternalDataDSL.g:11295:3: rule__LFQN__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_73);
+            	    pushFollow(FOLLOW_81);
             	    rule__LFQN__Group_1__0();
 
             	    state._fsp--;
@@ -34806,7 +38427,7 @@
             	    break;
 
             	default :
-            	    break loop98;
+            	    break loop103;
                 }
             } while (true);
 
@@ -34835,14 +38456,14 @@
 
 
     // $ANTLR start "rule__LFQN__Group_1__0"
-    // InternalDataDSL.g:10218:1: rule__LFQN__Group_1__0 : rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1 ;
+    // InternalDataDSL.g:11304:1: rule__LFQN__Group_1__0 : rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1 ;
     public final void rule__LFQN__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10222:1: ( rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1 )
-            // InternalDataDSL.g:10223:2: rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1
+            // InternalDataDSL.g:11308:1: ( rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1 )
+            // InternalDataDSL.g:11309:2: rule__LFQN__Group_1__0__Impl rule__LFQN__Group_1__1
             {
             pushFollow(FOLLOW_7);
             rule__LFQN__Group_1__0__Impl();
@@ -34873,17 +38494,17 @@
 
 
     // $ANTLR start "rule__LFQN__Group_1__0__Impl"
-    // InternalDataDSL.g:10230:1: rule__LFQN__Group_1__0__Impl : ( '.' ) ;
+    // InternalDataDSL.g:11316:1: rule__LFQN__Group_1__0__Impl : ( '.' ) ;
     public final void rule__LFQN__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10234:1: ( ( '.' ) )
-            // InternalDataDSL.g:10235:1: ( '.' )
+            // InternalDataDSL.g:11320:1: ( ( '.' ) )
+            // InternalDataDSL.g:11321:1: ( '.' )
             {
-            // InternalDataDSL.g:10235:1: ( '.' )
-            // InternalDataDSL.g:10236:2: '.'
+            // InternalDataDSL.g:11321:1: ( '.' )
+            // InternalDataDSL.g:11322:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNAccess().getFullStopKeyword_1_0()); 
@@ -34914,14 +38535,14 @@
 
 
     // $ANTLR start "rule__LFQN__Group_1__1"
-    // InternalDataDSL.g:10245:1: rule__LFQN__Group_1__1 : rule__LFQN__Group_1__1__Impl ;
+    // InternalDataDSL.g:11331:1: rule__LFQN__Group_1__1 : rule__LFQN__Group_1__1__Impl ;
     public final void rule__LFQN__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10249:1: ( rule__LFQN__Group_1__1__Impl )
-            // InternalDataDSL.g:10250:2: rule__LFQN__Group_1__1__Impl
+            // InternalDataDSL.g:11335:1: ( rule__LFQN__Group_1__1__Impl )
+            // InternalDataDSL.g:11336:2: rule__LFQN__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__LFQN__Group_1__1__Impl();
@@ -34947,17 +38568,17 @@
 
 
     // $ANTLR start "rule__LFQN__Group_1__1__Impl"
-    // InternalDataDSL.g:10256:1: rule__LFQN__Group_1__1__Impl : ( RULE_ID ) ;
+    // InternalDataDSL.g:11342:1: rule__LFQN__Group_1__1__Impl : ( RULE_ID ) ;
     public final void rule__LFQN__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10260:1: ( ( RULE_ID ) )
-            // InternalDataDSL.g:10261:1: ( RULE_ID )
+            // InternalDataDSL.g:11346:1: ( ( RULE_ID ) )
+            // InternalDataDSL.g:11347:1: ( RULE_ID )
             {
-            // InternalDataDSL.g:10261:1: ( RULE_ID )
-            // InternalDataDSL.g:10262:2: RULE_ID
+            // InternalDataDSL.g:11347:1: ( RULE_ID )
+            // InternalDataDSL.g:11348:2: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getLFQNAccess().getIDTerminalRuleCall_1_1()); 
@@ -34988,16 +38609,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__0"
-    // InternalDataDSL.g:10272:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
+    // InternalDataDSL.g:11358:1: rule__XImportDeclaration__Group__0 : rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 ;
     public final void rule__XImportDeclaration__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10276:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
-            // InternalDataDSL.g:10277:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
+            // InternalDataDSL.g:11362:1: ( rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1 )
+            // InternalDataDSL.g:11363:2: rule__XImportDeclaration__Group__0__Impl rule__XImportDeclaration__Group__1
             {
-            pushFollow(FOLLOW_74);
+            pushFollow(FOLLOW_82);
             rule__XImportDeclaration__Group__0__Impl();
 
             state._fsp--;
@@ -35026,23 +38647,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__0__Impl"
-    // InternalDataDSL.g:10284:1: rule__XImportDeclaration__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:11370:1: rule__XImportDeclaration__Group__0__Impl : ( () ) ;
     public final void rule__XImportDeclaration__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10288:1: ( ( () ) )
-            // InternalDataDSL.g:10289:1: ( () )
+            // InternalDataDSL.g:11374:1: ( ( () ) )
+            // InternalDataDSL.g:11375:1: ( () )
             {
-            // InternalDataDSL.g:10289:1: ( () )
-            // InternalDataDSL.g:10290:2: ()
+            // InternalDataDSL.g:11375:1: ( () )
+            // InternalDataDSL.g:11376:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getOXImportDeclarationAction_0()); 
             }
-            // InternalDataDSL.g:10291:2: ()
-            // InternalDataDSL.g:10291:3: 
+            // InternalDataDSL.g:11377:2: ()
+            // InternalDataDSL.g:11377:3: 
             {
             }
 
@@ -35067,16 +38688,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__1"
-    // InternalDataDSL.g:10299:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
+    // InternalDataDSL.g:11385:1: rule__XImportDeclaration__Group__1 : rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 ;
     public final void rule__XImportDeclaration__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10303:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
-            // InternalDataDSL.g:10304:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
+            // InternalDataDSL.g:11389:1: ( rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2 )
+            // InternalDataDSL.g:11390:2: rule__XImportDeclaration__Group__1__Impl rule__XImportDeclaration__Group__2
             {
-            pushFollow(FOLLOW_75);
+            pushFollow(FOLLOW_83);
             rule__XImportDeclaration__Group__1__Impl();
 
             state._fsp--;
@@ -35105,17 +38726,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__1__Impl"
-    // InternalDataDSL.g:10311:1: rule__XImportDeclaration__Group__1__Impl : ( 'import' ) ;
+    // InternalDataDSL.g:11397:1: rule__XImportDeclaration__Group__1__Impl : ( 'import' ) ;
     public final void rule__XImportDeclaration__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10315:1: ( ( 'import' ) )
-            // InternalDataDSL.g:10316:1: ( 'import' )
+            // InternalDataDSL.g:11401:1: ( ( 'import' ) )
+            // InternalDataDSL.g:11402:1: ( 'import' )
             {
-            // InternalDataDSL.g:10316:1: ( 'import' )
-            // InternalDataDSL.g:10317:2: 'import'
+            // InternalDataDSL.g:11402:1: ( 'import' )
+            // InternalDataDSL.g:11403:2: 'import'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportKeyword_1()); 
@@ -35146,16 +38767,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__2"
-    // InternalDataDSL.g:10326:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 ;
+    // InternalDataDSL.g:11412:1: rule__XImportDeclaration__Group__2 : rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 ;
     public final void rule__XImportDeclaration__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10330:1: ( rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 )
-            // InternalDataDSL.g:10331:2: rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3
+            // InternalDataDSL.g:11416:1: ( rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3 )
+            // InternalDataDSL.g:11417:2: rule__XImportDeclaration__Group__2__Impl rule__XImportDeclaration__Group__3
             {
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_84);
             rule__XImportDeclaration__Group__2__Impl();
 
             state._fsp--;
@@ -35184,23 +38805,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__2__Impl"
-    // InternalDataDSL.g:10338:1: rule__XImportDeclaration__Group__2__Impl : ( ( rule__XImportDeclaration__Alternatives_2 ) ) ;
+    // InternalDataDSL.g:11424:1: rule__XImportDeclaration__Group__2__Impl : ( ( rule__XImportDeclaration__Alternatives_2 ) ) ;
     public final void rule__XImportDeclaration__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10342:1: ( ( ( rule__XImportDeclaration__Alternatives_2 ) ) )
-            // InternalDataDSL.g:10343:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            // InternalDataDSL.g:11428:1: ( ( ( rule__XImportDeclaration__Alternatives_2 ) ) )
+            // InternalDataDSL.g:11429:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
             {
-            // InternalDataDSL.g:10343:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
-            // InternalDataDSL.g:10344:2: ( rule__XImportDeclaration__Alternatives_2 )
+            // InternalDataDSL.g:11429:1: ( ( rule__XImportDeclaration__Alternatives_2 ) )
+            // InternalDataDSL.g:11430:2: ( rule__XImportDeclaration__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2()); 
             }
-            // InternalDataDSL.g:10345:2: ( rule__XImportDeclaration__Alternatives_2 )
-            // InternalDataDSL.g:10345:3: rule__XImportDeclaration__Alternatives_2
+            // InternalDataDSL.g:11431:2: ( rule__XImportDeclaration__Alternatives_2 )
+            // InternalDataDSL.g:11431:3: rule__XImportDeclaration__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Alternatives_2();
@@ -35235,14 +38856,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__3"
-    // InternalDataDSL.g:10353:1: rule__XImportDeclaration__Group__3 : rule__XImportDeclaration__Group__3__Impl ;
+    // InternalDataDSL.g:11439:1: rule__XImportDeclaration__Group__3 : rule__XImportDeclaration__Group__3__Impl ;
     public final void rule__XImportDeclaration__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10357:1: ( rule__XImportDeclaration__Group__3__Impl )
-            // InternalDataDSL.g:10358:2: rule__XImportDeclaration__Group__3__Impl
+            // InternalDataDSL.g:11443:1: ( rule__XImportDeclaration__Group__3__Impl )
+            // InternalDataDSL.g:11444:2: rule__XImportDeclaration__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group__3__Impl();
@@ -35268,33 +38889,33 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group__3__Impl"
-    // InternalDataDSL.g:10364:1: rule__XImportDeclaration__Group__3__Impl : ( ( ';' )? ) ;
+    // InternalDataDSL.g:11450:1: rule__XImportDeclaration__Group__3__Impl : ( ( ';' )? ) ;
     public final void rule__XImportDeclaration__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10368:1: ( ( ( ';' )? ) )
-            // InternalDataDSL.g:10369:1: ( ( ';' )? )
+            // InternalDataDSL.g:11454:1: ( ( ( ';' )? ) )
+            // InternalDataDSL.g:11455:1: ( ( ';' )? )
             {
-            // InternalDataDSL.g:10369:1: ( ( ';' )? )
-            // InternalDataDSL.g:10370:2: ( ';' )?
+            // InternalDataDSL.g:11455:1: ( ( ';' )? )
+            // InternalDataDSL.g:11456:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3()); 
             }
-            // InternalDataDSL.g:10371:2: ( ';' )?
-            int alt99=2;
-            int LA99_0 = input.LA(1);
+            // InternalDataDSL.g:11457:2: ( ';' )?
+            int alt104=2;
+            int LA104_0 = input.LA(1);
 
-            if ( (LA99_0==120) ) {
-                alt99=1;
+            if ( (LA104_0==126) ) {
+                alt104=1;
             }
-            switch (alt99) {
+            switch (alt104) {
                 case 1 :
-                    // InternalDataDSL.g:10371:3: ';'
+                    // InternalDataDSL.g:11457:3: ';'
                     {
-                    match(input,120,FOLLOW_2); if (state.failed) return ;
+                    match(input,126,FOLLOW_2); if (state.failed) return ;
 
                     }
                     break;
@@ -35326,16 +38947,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__0"
-    // InternalDataDSL.g:10380:1: rule__XImportDeclaration__Group_2_0__0 : rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 ;
+    // InternalDataDSL.g:11466:1: rule__XImportDeclaration__Group_2_0__0 : rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 ;
     public final void rule__XImportDeclaration__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10384:1: ( rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 )
-            // InternalDataDSL.g:10385:2: rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1
+            // InternalDataDSL.g:11470:1: ( rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1 )
+            // InternalDataDSL.g:11471:2: rule__XImportDeclaration__Group_2_0__0__Impl rule__XImportDeclaration__Group_2_0__1
             {
-            pushFollow(FOLLOW_77);
+            pushFollow(FOLLOW_85);
             rule__XImportDeclaration__Group_2_0__0__Impl();
 
             state._fsp--;
@@ -35364,23 +38985,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__0__Impl"
-    // InternalDataDSL.g:10392:1: rule__XImportDeclaration__Group_2_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) ;
+    // InternalDataDSL.g:11478:1: rule__XImportDeclaration__Group_2_0__0__Impl : ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10396:1: ( ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) )
-            // InternalDataDSL.g:10397:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            // InternalDataDSL.g:11482:1: ( ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) ) )
+            // InternalDataDSL.g:11483:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
             {
-            // InternalDataDSL.g:10397:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
-            // InternalDataDSL.g:10398:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            // InternalDataDSL.g:11483:1: ( ( rule__XImportDeclaration__StaticAssignment_2_0_0 ) )
+            // InternalDataDSL.g:11484:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticAssignment_2_0_0()); 
             }
-            // InternalDataDSL.g:10399:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
-            // InternalDataDSL.g:10399:3: rule__XImportDeclaration__StaticAssignment_2_0_0
+            // InternalDataDSL.g:11485:2: ( rule__XImportDeclaration__StaticAssignment_2_0_0 )
+            // InternalDataDSL.g:11485:3: rule__XImportDeclaration__StaticAssignment_2_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__StaticAssignment_2_0_0();
@@ -35415,16 +39036,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__1"
-    // InternalDataDSL.g:10407:1: rule__XImportDeclaration__Group_2_0__1 : rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 ;
+    // InternalDataDSL.g:11493:1: rule__XImportDeclaration__Group_2_0__1 : rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 ;
     public final void rule__XImportDeclaration__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10411:1: ( rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 )
-            // InternalDataDSL.g:10412:2: rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2
+            // InternalDataDSL.g:11497:1: ( rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2 )
+            // InternalDataDSL.g:11498:2: rule__XImportDeclaration__Group_2_0__1__Impl rule__XImportDeclaration__Group_2_0__2
             {
-            pushFollow(FOLLOW_77);
+            pushFollow(FOLLOW_85);
             rule__XImportDeclaration__Group_2_0__1__Impl();
 
             state._fsp--;
@@ -35453,31 +39074,31 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__1__Impl"
-    // InternalDataDSL.g:10419:1: rule__XImportDeclaration__Group_2_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) ;
+    // InternalDataDSL.g:11505:1: rule__XImportDeclaration__Group_2_0__1__Impl : ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) ;
     public final void rule__XImportDeclaration__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10423:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) )
-            // InternalDataDSL.g:10424:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            // InternalDataDSL.g:11509:1: ( ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? ) )
+            // InternalDataDSL.g:11510:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
             {
-            // InternalDataDSL.g:10424:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
-            // InternalDataDSL.g:10425:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            // InternalDataDSL.g:11510:1: ( ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )? )
+            // InternalDataDSL.g:11511:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionAssignment_2_0_1()); 
             }
-            // InternalDataDSL.g:10426:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
-            int alt100=2;
-            int LA100_0 = input.LA(1);
+            // InternalDataDSL.g:11512:2: ( rule__XImportDeclaration__ExtensionAssignment_2_0_1 )?
+            int alt105=2;
+            int LA105_0 = input.LA(1);
 
-            if ( (LA100_0==48) ) {
-                alt100=1;
+            if ( (LA105_0==48) ) {
+                alt105=1;
             }
-            switch (alt100) {
+            switch (alt105) {
                 case 1 :
-                    // InternalDataDSL.g:10426:3: rule__XImportDeclaration__ExtensionAssignment_2_0_1
+                    // InternalDataDSL.g:11512:3: rule__XImportDeclaration__ExtensionAssignment_2_0_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XImportDeclaration__ExtensionAssignment_2_0_1();
@@ -35515,16 +39136,16 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__2"
-    // InternalDataDSL.g:10434:1: rule__XImportDeclaration__Group_2_0__2 : rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 ;
+    // InternalDataDSL.g:11520:1: rule__XImportDeclaration__Group_2_0__2 : rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 ;
     public final void rule__XImportDeclaration__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10438:1: ( rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 )
-            // InternalDataDSL.g:10439:2: rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3
+            // InternalDataDSL.g:11524:1: ( rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3 )
+            // InternalDataDSL.g:11525:2: rule__XImportDeclaration__Group_2_0__2__Impl rule__XImportDeclaration__Group_2_0__3
             {
-            pushFollow(FOLLOW_78);
+            pushFollow(FOLLOW_86);
             rule__XImportDeclaration__Group_2_0__2__Impl();
 
             state._fsp--;
@@ -35553,23 +39174,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__2__Impl"
-    // InternalDataDSL.g:10446:1: rule__XImportDeclaration__Group_2_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) ;
+    // InternalDataDSL.g:11532:1: rule__XImportDeclaration__Group_2_0__2__Impl : ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10450:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) )
-            // InternalDataDSL.g:10451:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            // InternalDataDSL.g:11536:1: ( ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) ) )
+            // InternalDataDSL.g:11537:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
             {
-            // InternalDataDSL.g:10451:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
-            // InternalDataDSL.g:10452:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            // InternalDataDSL.g:11537:1: ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 ) )
+            // InternalDataDSL.g:11538:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeAssignment_2_0_2()); 
             }
-            // InternalDataDSL.g:10453:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
-            // InternalDataDSL.g:10453:3: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
+            // InternalDataDSL.g:11539:2: ( rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 )
+            // InternalDataDSL.g:11539:3: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__ImportedTypeAssignment_2_0_2();
@@ -35604,14 +39225,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__3"
-    // InternalDataDSL.g:10461:1: rule__XImportDeclaration__Group_2_0__3 : rule__XImportDeclaration__Group_2_0__3__Impl ;
+    // InternalDataDSL.g:11547:1: rule__XImportDeclaration__Group_2_0__3 : rule__XImportDeclaration__Group_2_0__3__Impl ;
     public final void rule__XImportDeclaration__Group_2_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10465:1: ( rule__XImportDeclaration__Group_2_0__3__Impl )
-            // InternalDataDSL.g:10466:2: rule__XImportDeclaration__Group_2_0__3__Impl
+            // InternalDataDSL.g:11551:1: ( rule__XImportDeclaration__Group_2_0__3__Impl )
+            // InternalDataDSL.g:11552:2: rule__XImportDeclaration__Group_2_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group_2_0__3__Impl();
@@ -35637,23 +39258,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_0__3__Impl"
-    // InternalDataDSL.g:10472:1: rule__XImportDeclaration__Group_2_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) ;
+    // InternalDataDSL.g:11558:1: rule__XImportDeclaration__Group_2_0__3__Impl : ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) ;
     public final void rule__XImportDeclaration__Group_2_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10476:1: ( ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) )
-            // InternalDataDSL.g:10477:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            // InternalDataDSL.g:11562:1: ( ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) ) )
+            // InternalDataDSL.g:11563:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
             {
-            // InternalDataDSL.g:10477:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
-            // InternalDataDSL.g:10478:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            // InternalDataDSL.g:11563:1: ( ( rule__XImportDeclaration__Alternatives_2_0_3 ) )
+            // InternalDataDSL.g:11564:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getAlternatives_2_0_3()); 
             }
-            // InternalDataDSL.g:10479:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
-            // InternalDataDSL.g:10479:3: rule__XImportDeclaration__Alternatives_2_0_3
+            // InternalDataDSL.g:11565:2: ( rule__XImportDeclaration__Alternatives_2_0_3 )
+            // InternalDataDSL.g:11565:3: rule__XImportDeclaration__Alternatives_2_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Alternatives_2_0_3();
@@ -35688,14 +39309,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__0"
-    // InternalDataDSL.g:10488:1: rule__XImportDeclaration__Group_2_3__0 : rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 ;
+    // InternalDataDSL.g:11574:1: rule__XImportDeclaration__Group_2_3__0 : rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 ;
     public final void rule__XImportDeclaration__Group_2_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10492:1: ( rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 )
-            // InternalDataDSL.g:10493:2: rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1
+            // InternalDataDSL.g:11578:1: ( rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1 )
+            // InternalDataDSL.g:11579:2: rule__XImportDeclaration__Group_2_3__0__Impl rule__XImportDeclaration__Group_2_3__1
             {
             pushFollow(FOLLOW_7);
             rule__XImportDeclaration__Group_2_3__0__Impl();
@@ -35726,23 +39347,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__0__Impl"
-    // InternalDataDSL.g:10500:1: rule__XImportDeclaration__Group_2_3__0__Impl : ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) ;
+    // InternalDataDSL.g:11586:1: rule__XImportDeclaration__Group_2_3__0__Impl : ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) ;
     public final void rule__XImportDeclaration__Group_2_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10504:1: ( ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) )
-            // InternalDataDSL.g:10505:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            // InternalDataDSL.g:11590:1: ( ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) ) )
+            // InternalDataDSL.g:11591:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
             {
-            // InternalDataDSL.g:10505:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
-            // InternalDataDSL.g:10506:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            // InternalDataDSL.g:11591:1: ( ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 ) )
+            // InternalDataDSL.g:11592:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportAssignment_2_3_0()); 
             }
-            // InternalDataDSL.g:10507:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
-            // InternalDataDSL.g:10507:3: rule__XImportDeclaration__FqnImportAssignment_2_3_0
+            // InternalDataDSL.g:11593:2: ( rule__XImportDeclaration__FqnImportAssignment_2_3_0 )
+            // InternalDataDSL.g:11593:3: rule__XImportDeclaration__FqnImportAssignment_2_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__FqnImportAssignment_2_3_0();
@@ -35777,14 +39398,14 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__1"
-    // InternalDataDSL.g:10515:1: rule__XImportDeclaration__Group_2_3__1 : rule__XImportDeclaration__Group_2_3__1__Impl ;
+    // InternalDataDSL.g:11601:1: rule__XImportDeclaration__Group_2_3__1 : rule__XImportDeclaration__Group_2_3__1__Impl ;
     public final void rule__XImportDeclaration__Group_2_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10519:1: ( rule__XImportDeclaration__Group_2_3__1__Impl )
-            // InternalDataDSL.g:10520:2: rule__XImportDeclaration__Group_2_3__1__Impl
+            // InternalDataDSL.g:11605:1: ( rule__XImportDeclaration__Group_2_3__1__Impl )
+            // InternalDataDSL.g:11606:2: rule__XImportDeclaration__Group_2_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__Group_2_3__1__Impl();
@@ -35810,23 +39431,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__Group_2_3__1__Impl"
-    // InternalDataDSL.g:10526:1: rule__XImportDeclaration__Group_2_3__1__Impl : ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) ;
+    // InternalDataDSL.g:11612:1: rule__XImportDeclaration__Group_2_3__1__Impl : ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) ;
     public final void rule__XImportDeclaration__Group_2_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10530:1: ( ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) )
-            // InternalDataDSL.g:10531:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            // InternalDataDSL.g:11616:1: ( ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) ) )
+            // InternalDataDSL.g:11617:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
             {
-            // InternalDataDSL.g:10531:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
-            // InternalDataDSL.g:10532:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            // InternalDataDSL.g:11617:1: ( ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 ) )
+            // InternalDataDSL.g:11618:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameAssignment_2_3_1()); 
             }
-            // InternalDataDSL.g:10533:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
-            // InternalDataDSL.g:10533:3: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
+            // InternalDataDSL.g:11619:2: ( rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 )
+            // InternalDataDSL.g:11619:3: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1();
@@ -35861,16 +39482,16 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__0"
-    // InternalDataDSL.g:10542:1: rule__XAnnotation__Group__0 : rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 ;
+    // InternalDataDSL.g:11628:1: rule__XAnnotation__Group__0 : rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 ;
     public final void rule__XAnnotation__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10546:1: ( rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 )
-            // InternalDataDSL.g:10547:2: rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1
+            // InternalDataDSL.g:11632:1: ( rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1 )
+            // InternalDataDSL.g:11633:2: rule__XAnnotation__Group__0__Impl rule__XAnnotation__Group__1
             {
-            pushFollow(FOLLOW_79);
+            pushFollow(FOLLOW_87);
             rule__XAnnotation__Group__0__Impl();
 
             state._fsp--;
@@ -35899,23 +39520,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__0__Impl"
-    // InternalDataDSL.g:10554:1: rule__XAnnotation__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:11640:1: rule__XAnnotation__Group__0__Impl : ( () ) ;
     public final void rule__XAnnotation__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10558:1: ( ( () ) )
-            // InternalDataDSL.g:10559:1: ( () )
+            // InternalDataDSL.g:11644:1: ( ( () ) )
+            // InternalDataDSL.g:11645:1: ( () )
             {
-            // InternalDataDSL.g:10559:1: ( () )
-            // InternalDataDSL.g:10560:2: ()
+            // InternalDataDSL.g:11645:1: ( () )
+            // InternalDataDSL.g:11646:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getXAnnotationAction_0()); 
             }
-            // InternalDataDSL.g:10561:2: ()
-            // InternalDataDSL.g:10561:3: 
+            // InternalDataDSL.g:11647:2: ()
+            // InternalDataDSL.g:11647:3: 
             {
             }
 
@@ -35940,14 +39561,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__1"
-    // InternalDataDSL.g:10569:1: rule__XAnnotation__Group__1 : rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 ;
+    // InternalDataDSL.g:11655:1: rule__XAnnotation__Group__1 : rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 ;
     public final void rule__XAnnotation__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10573:1: ( rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 )
-            // InternalDataDSL.g:10574:2: rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2
+            // InternalDataDSL.g:11659:1: ( rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2 )
+            // InternalDataDSL.g:11660:2: rule__XAnnotation__Group__1__Impl rule__XAnnotation__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__XAnnotation__Group__1__Impl();
@@ -35978,22 +39599,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__1__Impl"
-    // InternalDataDSL.g:10581:1: rule__XAnnotation__Group__1__Impl : ( '@' ) ;
+    // InternalDataDSL.g:11667:1: rule__XAnnotation__Group__1__Impl : ( '@' ) ;
     public final void rule__XAnnotation__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10585:1: ( ( '@' ) )
-            // InternalDataDSL.g:10586:1: ( '@' )
+            // InternalDataDSL.g:11671:1: ( ( '@' ) )
+            // InternalDataDSL.g:11672:1: ( '@' )
             {
-            // InternalDataDSL.g:10586:1: ( '@' )
-            // InternalDataDSL.g:10587:2: '@'
+            // InternalDataDSL.g:11672:1: ( '@' )
+            // InternalDataDSL.g:11673:2: '@'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); 
             }
-            match(input,121,FOLLOW_2); if (state.failed) return ;
+            match(input,127,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1()); 
             }
@@ -36019,16 +39640,16 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__2"
-    // InternalDataDSL.g:10596:1: rule__XAnnotation__Group__2 : rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 ;
+    // InternalDataDSL.g:11682:1: rule__XAnnotation__Group__2 : rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 ;
     public final void rule__XAnnotation__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10600:1: ( rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 )
-            // InternalDataDSL.g:10601:2: rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3
+            // InternalDataDSL.g:11686:1: ( rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3 )
+            // InternalDataDSL.g:11687:2: rule__XAnnotation__Group__2__Impl rule__XAnnotation__Group__3
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XAnnotation__Group__2__Impl();
 
             state._fsp--;
@@ -36057,23 +39678,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__2__Impl"
-    // InternalDataDSL.g:10608:1: rule__XAnnotation__Group__2__Impl : ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) ;
+    // InternalDataDSL.g:11694:1: rule__XAnnotation__Group__2__Impl : ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) ;
     public final void rule__XAnnotation__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10612:1: ( ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) )
-            // InternalDataDSL.g:10613:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            // InternalDataDSL.g:11698:1: ( ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) ) )
+            // InternalDataDSL.g:11699:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
             {
-            // InternalDataDSL.g:10613:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
-            // InternalDataDSL.g:10614:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            // InternalDataDSL.g:11699:1: ( ( rule__XAnnotation__AnnotationTypeAssignment_2 ) )
+            // InternalDataDSL.g:11700:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeAssignment_2()); 
             }
-            // InternalDataDSL.g:10615:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
-            // InternalDataDSL.g:10615:3: rule__XAnnotation__AnnotationTypeAssignment_2
+            // InternalDataDSL.g:11701:2: ( rule__XAnnotation__AnnotationTypeAssignment_2 )
+            // InternalDataDSL.g:11701:3: rule__XAnnotation__AnnotationTypeAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__AnnotationTypeAssignment_2();
@@ -36108,14 +39729,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__3"
-    // InternalDataDSL.g:10623:1: rule__XAnnotation__Group__3 : rule__XAnnotation__Group__3__Impl ;
+    // InternalDataDSL.g:11709:1: rule__XAnnotation__Group__3 : rule__XAnnotation__Group__3__Impl ;
     public final void rule__XAnnotation__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10627:1: ( rule__XAnnotation__Group__3__Impl )
-            // InternalDataDSL.g:10628:2: rule__XAnnotation__Group__3__Impl
+            // InternalDataDSL.g:11713:1: ( rule__XAnnotation__Group__3__Impl )
+            // InternalDataDSL.g:11714:2: rule__XAnnotation__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group__3__Impl();
@@ -36141,31 +39762,31 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group__3__Impl"
-    // InternalDataDSL.g:10634:1: rule__XAnnotation__Group__3__Impl : ( ( rule__XAnnotation__Group_3__0 )? ) ;
+    // InternalDataDSL.g:11720:1: rule__XAnnotation__Group__3__Impl : ( ( rule__XAnnotation__Group_3__0 )? ) ;
     public final void rule__XAnnotation__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10638:1: ( ( ( rule__XAnnotation__Group_3__0 )? ) )
-            // InternalDataDSL.g:10639:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            // InternalDataDSL.g:11724:1: ( ( ( rule__XAnnotation__Group_3__0 )? ) )
+            // InternalDataDSL.g:11725:1: ( ( rule__XAnnotation__Group_3__0 )? )
             {
-            // InternalDataDSL.g:10639:1: ( ( rule__XAnnotation__Group_3__0 )? )
-            // InternalDataDSL.g:10640:2: ( rule__XAnnotation__Group_3__0 )?
+            // InternalDataDSL.g:11725:1: ( ( rule__XAnnotation__Group_3__0 )? )
+            // InternalDataDSL.g:11726:2: ( rule__XAnnotation__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:10641:2: ( rule__XAnnotation__Group_3__0 )?
-            int alt101=2;
-            int LA101_0 = input.LA(1);
+            // InternalDataDSL.g:11727:2: ( rule__XAnnotation__Group_3__0 )?
+            int alt106=2;
+            int LA106_0 = input.LA(1);
 
-            if ( (LA101_0==122) ) {
-                alt101=1;
+            if ( (LA106_0==128) ) {
+                alt106=1;
             }
-            switch (alt101) {
+            switch (alt106) {
                 case 1 :
-                    // InternalDataDSL.g:10641:3: rule__XAnnotation__Group_3__0
+                    // InternalDataDSL.g:11727:3: rule__XAnnotation__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Group_3__0();
@@ -36203,16 +39824,16 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__0"
-    // InternalDataDSL.g:10650:1: rule__XAnnotation__Group_3__0 : rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 ;
+    // InternalDataDSL.g:11736:1: rule__XAnnotation__Group_3__0 : rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 ;
     public final void rule__XAnnotation__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10654:1: ( rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 )
-            // InternalDataDSL.g:10655:2: rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1
+            // InternalDataDSL.g:11740:1: ( rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1 )
+            // InternalDataDSL.g:11741:2: rule__XAnnotation__Group_3__0__Impl rule__XAnnotation__Group_3__1
             {
-            pushFollow(FOLLOW_81);
+            pushFollow(FOLLOW_89);
             rule__XAnnotation__Group_3__0__Impl();
 
             state._fsp--;
@@ -36241,25 +39862,25 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__0__Impl"
-    // InternalDataDSL.g:10662:1: rule__XAnnotation__Group_3__0__Impl : ( ( '(' ) ) ;
+    // InternalDataDSL.g:11748:1: rule__XAnnotation__Group_3__0__Impl : ( ( '(' ) ) ;
     public final void rule__XAnnotation__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10666:1: ( ( ( '(' ) ) )
-            // InternalDataDSL.g:10667:1: ( ( '(' ) )
+            // InternalDataDSL.g:11752:1: ( ( ( '(' ) ) )
+            // InternalDataDSL.g:11753:1: ( ( '(' ) )
             {
-            // InternalDataDSL.g:10667:1: ( ( '(' ) )
-            // InternalDataDSL.g:10668:2: ( '(' )
+            // InternalDataDSL.g:11753:1: ( ( '(' ) )
+            // InternalDataDSL.g:11754:2: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0()); 
             }
-            // InternalDataDSL.g:10669:2: ( '(' )
-            // InternalDataDSL.g:10669:3: '('
+            // InternalDataDSL.g:11755:2: ( '(' )
+            // InternalDataDSL.g:11755:3: '('
             {
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
 
             }
 
@@ -36288,16 +39909,16 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__1"
-    // InternalDataDSL.g:10677:1: rule__XAnnotation__Group_3__1 : rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 ;
+    // InternalDataDSL.g:11763:1: rule__XAnnotation__Group_3__1 : rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 ;
     public final void rule__XAnnotation__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10681:1: ( rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 )
-            // InternalDataDSL.g:10682:2: rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2
+            // InternalDataDSL.g:11767:1: ( rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2 )
+            // InternalDataDSL.g:11768:2: rule__XAnnotation__Group_3__1__Impl rule__XAnnotation__Group_3__2
             {
-            pushFollow(FOLLOW_81);
+            pushFollow(FOLLOW_89);
             rule__XAnnotation__Group_3__1__Impl();
 
             state._fsp--;
@@ -36326,31 +39947,31 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__1__Impl"
-    // InternalDataDSL.g:10689:1: rule__XAnnotation__Group_3__1__Impl : ( ( rule__XAnnotation__Alternatives_3_1 )? ) ;
+    // InternalDataDSL.g:11775:1: rule__XAnnotation__Group_3__1__Impl : ( ( rule__XAnnotation__Alternatives_3_1 )? ) ;
     public final void rule__XAnnotation__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10693:1: ( ( ( rule__XAnnotation__Alternatives_3_1 )? ) )
-            // InternalDataDSL.g:10694:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            // InternalDataDSL.g:11779:1: ( ( ( rule__XAnnotation__Alternatives_3_1 )? ) )
+            // InternalDataDSL.g:11780:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
             {
-            // InternalDataDSL.g:10694:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
-            // InternalDataDSL.g:10695:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            // InternalDataDSL.g:11780:1: ( ( rule__XAnnotation__Alternatives_3_1 )? )
+            // InternalDataDSL.g:11781:2: ( rule__XAnnotation__Alternatives_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAlternatives_3_1()); 
             }
-            // InternalDataDSL.g:10696:2: ( rule__XAnnotation__Alternatives_3_1 )?
-            int alt102=2;
-            int LA102_0 = input.LA(1);
+            // InternalDataDSL.g:11782:2: ( rule__XAnnotation__Alternatives_3_1 )?
+            int alt107=2;
+            int LA107_0 = input.LA(1);
 
-            if ( ((LA102_0>=RULE_STRING && LA102_0<=RULE_DECIMAL)||LA102_0==27||(LA102_0>=34 && LA102_0<=35)||LA102_0==40||(LA102_0>=45 && LA102_0<=50)||LA102_0==74||LA102_0==101||(LA102_0>=121 && LA102_0<=122)||(LA102_0>=126 && LA102_0<=127)||LA102_0==129||LA102_0==131||(LA102_0>=135 && LA102_0<=142)||LA102_0==144||LA102_0==166) ) {
-                alt102=1;
+            if ( ((LA107_0>=RULE_STRING && LA107_0<=RULE_DECIMAL)||LA107_0==27||(LA107_0>=34 && LA107_0<=35)||LA107_0==40||(LA107_0>=45 && LA107_0<=50)||LA107_0==74||LA107_0==103||(LA107_0>=127 && LA107_0<=128)||(LA107_0>=132 && LA107_0<=133)||LA107_0==135||LA107_0==137||(LA107_0>=141 && LA107_0<=148)||LA107_0==150||LA107_0==179) ) {
+                alt107=1;
             }
-            switch (alt102) {
+            switch (alt107) {
                 case 1 :
-                    // InternalDataDSL.g:10696:3: rule__XAnnotation__Alternatives_3_1
+                    // InternalDataDSL.g:11782:3: rule__XAnnotation__Alternatives_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotation__Alternatives_3_1();
@@ -36388,14 +40009,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__2"
-    // InternalDataDSL.g:10704:1: rule__XAnnotation__Group_3__2 : rule__XAnnotation__Group_3__2__Impl ;
+    // InternalDataDSL.g:11790:1: rule__XAnnotation__Group_3__2 : rule__XAnnotation__Group_3__2__Impl ;
     public final void rule__XAnnotation__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10708:1: ( rule__XAnnotation__Group_3__2__Impl )
-            // InternalDataDSL.g:10709:2: rule__XAnnotation__Group_3__2__Impl
+            // InternalDataDSL.g:11794:1: ( rule__XAnnotation__Group_3__2__Impl )
+            // InternalDataDSL.g:11795:2: rule__XAnnotation__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3__2__Impl();
@@ -36421,22 +40042,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3__2__Impl"
-    // InternalDataDSL.g:10715:1: rule__XAnnotation__Group_3__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:11801:1: rule__XAnnotation__Group_3__2__Impl : ( ')' ) ;
     public final void rule__XAnnotation__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10719:1: ( ( ')' ) )
-            // InternalDataDSL.g:10720:1: ( ')' )
+            // InternalDataDSL.g:11805:1: ( ( ')' ) )
+            // InternalDataDSL.g:11806:1: ( ')' )
             {
-            // InternalDataDSL.g:10720:1: ( ')' )
-            // InternalDataDSL.g:10721:2: ')'
+            // InternalDataDSL.g:11806:1: ( ')' )
+            // InternalDataDSL.g:11807:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2()); 
             }
@@ -36462,16 +40083,16 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__0"
-    // InternalDataDSL.g:10731:1: rule__XAnnotation__Group_3_1_0__0 : rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 ;
+    // InternalDataDSL.g:11817:1: rule__XAnnotation__Group_3_1_0__0 : rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 ;
     public final void rule__XAnnotation__Group_3_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10735:1: ( rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 )
-            // InternalDataDSL.g:10736:2: rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1
+            // InternalDataDSL.g:11821:1: ( rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1 )
+            // InternalDataDSL.g:11822:2: rule__XAnnotation__Group_3_1_0__0__Impl rule__XAnnotation__Group_3_1_0__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XAnnotation__Group_3_1_0__0__Impl();
 
             state._fsp--;
@@ -36500,23 +40121,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__0__Impl"
-    // InternalDataDSL.g:10743:1: rule__XAnnotation__Group_3_1_0__0__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) ;
+    // InternalDataDSL.g:11829:1: rule__XAnnotation__Group_3_1_0__0__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) ;
     public final void rule__XAnnotation__Group_3_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10747:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) )
-            // InternalDataDSL.g:10748:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            // InternalDataDSL.g:11833:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) ) )
+            // InternalDataDSL.g:11834:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
             {
-            // InternalDataDSL.g:10748:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
-            // InternalDataDSL.g:10749:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            // InternalDataDSL.g:11834:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 ) )
+            // InternalDataDSL.g:11835:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_0()); 
             }
-            // InternalDataDSL.g:10750:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
-            // InternalDataDSL.g:10750:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
+            // InternalDataDSL.g:11836:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 )
+            // InternalDataDSL.g:11836:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0();
@@ -36551,14 +40172,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__1"
-    // InternalDataDSL.g:10758:1: rule__XAnnotation__Group_3_1_0__1 : rule__XAnnotation__Group_3_1_0__1__Impl ;
+    // InternalDataDSL.g:11844:1: rule__XAnnotation__Group_3_1_0__1 : rule__XAnnotation__Group_3_1_0__1__Impl ;
     public final void rule__XAnnotation__Group_3_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10762:1: ( rule__XAnnotation__Group_3_1_0__1__Impl )
-            // InternalDataDSL.g:10763:2: rule__XAnnotation__Group_3_1_0__1__Impl
+            // InternalDataDSL.g:11848:1: ( rule__XAnnotation__Group_3_1_0__1__Impl )
+            // InternalDataDSL.g:11849:2: rule__XAnnotation__Group_3_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3_1_0__1__Impl();
@@ -36584,37 +40205,37 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0__1__Impl"
-    // InternalDataDSL.g:10769:1: rule__XAnnotation__Group_3_1_0__1__Impl : ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) ;
+    // InternalDataDSL.g:11855:1: rule__XAnnotation__Group_3_1_0__1__Impl : ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) ;
     public final void rule__XAnnotation__Group_3_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10773:1: ( ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) )
-            // InternalDataDSL.g:10774:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            // InternalDataDSL.g:11859:1: ( ( ( rule__XAnnotation__Group_3_1_0_1__0 )* ) )
+            // InternalDataDSL.g:11860:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
             {
-            // InternalDataDSL.g:10774:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
-            // InternalDataDSL.g:10775:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            // InternalDataDSL.g:11860:1: ( ( rule__XAnnotation__Group_3_1_0_1__0 )* )
+            // InternalDataDSL.g:11861:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0_1()); 
             }
-            // InternalDataDSL.g:10776:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
-            loop103:
+            // InternalDataDSL.g:11862:2: ( rule__XAnnotation__Group_3_1_0_1__0 )*
+            loop108:
             do {
-                int alt103=2;
-                int LA103_0 = input.LA(1);
+                int alt108=2;
+                int LA108_0 = input.LA(1);
 
-                if ( (LA103_0==124) ) {
-                    alt103=1;
+                if ( (LA108_0==130) ) {
+                    alt108=1;
                 }
 
 
-                switch (alt103) {
+                switch (alt108) {
             	case 1 :
-            	    // InternalDataDSL.g:10776:3: rule__XAnnotation__Group_3_1_0_1__0
+            	    // InternalDataDSL.g:11862:3: rule__XAnnotation__Group_3_1_0_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XAnnotation__Group_3_1_0_1__0();
 
             	    state._fsp--;
@@ -36624,7 +40245,7 @@
             	    break;
 
             	default :
-            	    break loop103;
+            	    break loop108;
                 }
             } while (true);
 
@@ -36653,14 +40274,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0"
-    // InternalDataDSL.g:10785:1: rule__XAnnotation__Group_3_1_0_1__0 : rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 ;
+    // InternalDataDSL.g:11871:1: rule__XAnnotation__Group_3_1_0_1__0 : rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 ;
     public final void rule__XAnnotation__Group_3_1_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10789:1: ( rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 )
-            // InternalDataDSL.g:10790:2: rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1
+            // InternalDataDSL.g:11875:1: ( rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1 )
+            // InternalDataDSL.g:11876:2: rule__XAnnotation__Group_3_1_0_1__0__Impl rule__XAnnotation__Group_3_1_0_1__1
             {
             pushFollow(FOLLOW_7);
             rule__XAnnotation__Group_3_1_0_1__0__Impl();
@@ -36691,22 +40312,22 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__0__Impl"
-    // InternalDataDSL.g:10797:1: rule__XAnnotation__Group_3_1_0_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:11883:1: rule__XAnnotation__Group_3_1_0_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotation__Group_3_1_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10801:1: ( ( ',' ) )
-            // InternalDataDSL.g:10802:1: ( ',' )
+            // InternalDataDSL.g:11887:1: ( ( ',' ) )
+            // InternalDataDSL.g:11888:1: ( ',' )
             {
-            // InternalDataDSL.g:10802:1: ( ',' )
-            // InternalDataDSL.g:10803:2: ','
+            // InternalDataDSL.g:11888:1: ( ',' )
+            // InternalDataDSL.g:11889:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0()); 
             }
@@ -36732,14 +40353,14 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1"
-    // InternalDataDSL.g:10812:1: rule__XAnnotation__Group_3_1_0_1__1 : rule__XAnnotation__Group_3_1_0_1__1__Impl ;
+    // InternalDataDSL.g:11898:1: rule__XAnnotation__Group_3_1_0_1__1 : rule__XAnnotation__Group_3_1_0_1__1__Impl ;
     public final void rule__XAnnotation__Group_3_1_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10816:1: ( rule__XAnnotation__Group_3_1_0_1__1__Impl )
-            // InternalDataDSL.g:10817:2: rule__XAnnotation__Group_3_1_0_1__1__Impl
+            // InternalDataDSL.g:11902:1: ( rule__XAnnotation__Group_3_1_0_1__1__Impl )
+            // InternalDataDSL.g:11903:2: rule__XAnnotation__Group_3_1_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__Group_3_1_0_1__1__Impl();
@@ -36765,23 +40386,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__Group_3_1_0_1__1__Impl"
-    // InternalDataDSL.g:10823:1: rule__XAnnotation__Group_3_1_0_1__1__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) ;
+    // InternalDataDSL.g:11909:1: rule__XAnnotation__Group_3_1_0_1__1__Impl : ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) ;
     public final void rule__XAnnotation__Group_3_1_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10827:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) )
-            // InternalDataDSL.g:10828:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            // InternalDataDSL.g:11913:1: ( ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) ) )
+            // InternalDataDSL.g:11914:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
             {
-            // InternalDataDSL.g:10828:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
-            // InternalDataDSL.g:10829:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            // InternalDataDSL.g:11914:1: ( ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 ) )
+            // InternalDataDSL.g:11915:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsAssignment_3_1_0_1_1()); 
             }
-            // InternalDataDSL.g:10830:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
-            // InternalDataDSL.g:10830:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
+            // InternalDataDSL.g:11916:2: ( rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 )
+            // InternalDataDSL.g:11916:3: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1();
@@ -36816,16 +40437,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__0"
-    // InternalDataDSL.g:10839:1: rule__XAnnotationElementValuePair__Group__0 : rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 ;
+    // InternalDataDSL.g:11925:1: rule__XAnnotationElementValuePair__Group__0 : rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 ;
     public final void rule__XAnnotationElementValuePair__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10843:1: ( rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 )
-            // InternalDataDSL.g:10844:2: rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1
+            // InternalDataDSL.g:11929:1: ( rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1 )
+            // InternalDataDSL.g:11930:2: rule__XAnnotationElementValuePair__Group__0__Impl rule__XAnnotationElementValuePair__Group__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAnnotationElementValuePair__Group__0__Impl();
 
             state._fsp--;
@@ -36854,23 +40475,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__0__Impl"
-    // InternalDataDSL.g:10851:1: rule__XAnnotationElementValuePair__Group__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) ;
+    // InternalDataDSL.g:11937:1: rule__XAnnotationElementValuePair__Group__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10855:1: ( ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) )
-            // InternalDataDSL.g:10856:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            // InternalDataDSL.g:11941:1: ( ( ( rule__XAnnotationElementValuePair__Group_0__0 ) ) )
+            // InternalDataDSL.g:11942:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
             {
-            // InternalDataDSL.g:10856:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
-            // InternalDataDSL.g:10857:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            // InternalDataDSL.g:11942:1: ( ( rule__XAnnotationElementValuePair__Group_0__0 ) )
+            // InternalDataDSL.g:11943:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:10858:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
-            // InternalDataDSL.g:10858:3: rule__XAnnotationElementValuePair__Group_0__0
+            // InternalDataDSL.g:11944:2: ( rule__XAnnotationElementValuePair__Group_0__0 )
+            // InternalDataDSL.g:11944:3: rule__XAnnotationElementValuePair__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0__0();
@@ -36905,14 +40526,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__1"
-    // InternalDataDSL.g:10866:1: rule__XAnnotationElementValuePair__Group__1 : rule__XAnnotationElementValuePair__Group__1__Impl ;
+    // InternalDataDSL.g:11952:1: rule__XAnnotationElementValuePair__Group__1 : rule__XAnnotationElementValuePair__Group__1__Impl ;
     public final void rule__XAnnotationElementValuePair__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10870:1: ( rule__XAnnotationElementValuePair__Group__1__Impl )
-            // InternalDataDSL.g:10871:2: rule__XAnnotationElementValuePair__Group__1__Impl
+            // InternalDataDSL.g:11956:1: ( rule__XAnnotationElementValuePair__Group__1__Impl )
+            // InternalDataDSL.g:11957:2: rule__XAnnotationElementValuePair__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group__1__Impl();
@@ -36938,23 +40559,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group__1__Impl"
-    // InternalDataDSL.g:10877:1: rule__XAnnotationElementValuePair__Group__1__Impl : ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) ;
+    // InternalDataDSL.g:11963:1: rule__XAnnotationElementValuePair__Group__1__Impl : ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10881:1: ( ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) )
-            // InternalDataDSL.g:10882:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            // InternalDataDSL.g:11967:1: ( ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) ) )
+            // InternalDataDSL.g:11968:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
             {
-            // InternalDataDSL.g:10882:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
-            // InternalDataDSL.g:10883:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            // InternalDataDSL.g:11968:1: ( ( rule__XAnnotationElementValuePair__ValueAssignment_1 ) )
+            // InternalDataDSL.g:11969:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getValueAssignment_1()); 
             }
-            // InternalDataDSL.g:10884:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
-            // InternalDataDSL.g:10884:3: rule__XAnnotationElementValuePair__ValueAssignment_1
+            // InternalDataDSL.g:11970:2: ( rule__XAnnotationElementValuePair__ValueAssignment_1 )
+            // InternalDataDSL.g:11970:3: rule__XAnnotationElementValuePair__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__ValueAssignment_1();
@@ -36989,14 +40610,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0"
-    // InternalDataDSL.g:10893:1: rule__XAnnotationElementValuePair__Group_0__0 : rule__XAnnotationElementValuePair__Group_0__0__Impl ;
+    // InternalDataDSL.g:11979:1: rule__XAnnotationElementValuePair__Group_0__0 : rule__XAnnotationElementValuePair__Group_0__0__Impl ;
     public final void rule__XAnnotationElementValuePair__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10897:1: ( rule__XAnnotationElementValuePair__Group_0__0__Impl )
-            // InternalDataDSL.g:10898:2: rule__XAnnotationElementValuePair__Group_0__0__Impl
+            // InternalDataDSL.g:11983:1: ( rule__XAnnotationElementValuePair__Group_0__0__Impl )
+            // InternalDataDSL.g:11984:2: rule__XAnnotationElementValuePair__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0__0__Impl();
@@ -37022,23 +40643,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0__0__Impl"
-    // InternalDataDSL.g:10904:1: rule__XAnnotationElementValuePair__Group_0__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:11990:1: rule__XAnnotationElementValuePair__Group_0__0__Impl : ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10908:1: ( ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:10909:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            // InternalDataDSL.g:11994:1: ( ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:11995:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:10909:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
-            // InternalDataDSL.g:10910:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            // InternalDataDSL.g:11995:1: ( ( rule__XAnnotationElementValuePair__Group_0_0__0 ) )
+            // InternalDataDSL.g:11996:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:10911:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
-            // InternalDataDSL.g:10911:3: rule__XAnnotationElementValuePair__Group_0_0__0
+            // InternalDataDSL.g:11997:2: ( rule__XAnnotationElementValuePair__Group_0_0__0 )
+            // InternalDataDSL.g:11997:3: rule__XAnnotationElementValuePair__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0_0__0();
@@ -37073,16 +40694,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0"
-    // InternalDataDSL.g:10920:1: rule__XAnnotationElementValuePair__Group_0_0__0 : rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 ;
+    // InternalDataDSL.g:12006:1: rule__XAnnotationElementValuePair__Group_0_0__0 : rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10924:1: ( rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 )
-            // InternalDataDSL.g:10925:2: rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1
+            // InternalDataDSL.g:12010:1: ( rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1 )
+            // InternalDataDSL.g:12011:2: rule__XAnnotationElementValuePair__Group_0_0__0__Impl rule__XAnnotationElementValuePair__Group_0_0__1
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__XAnnotationElementValuePair__Group_0_0__0__Impl();
 
             state._fsp--;
@@ -37111,23 +40732,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__0__Impl"
-    // InternalDataDSL.g:10932:1: rule__XAnnotationElementValuePair__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) ;
+    // InternalDataDSL.g:12018:1: rule__XAnnotationElementValuePair__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10936:1: ( ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) )
-            // InternalDataDSL.g:10937:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            // InternalDataDSL.g:12022:1: ( ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) ) )
+            // InternalDataDSL.g:12023:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
             {
-            // InternalDataDSL.g:10937:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
-            // InternalDataDSL.g:10938:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            // InternalDataDSL.g:12023:1: ( ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 ) )
+            // InternalDataDSL.g:12024:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementAssignment_0_0_0()); 
             }
-            // InternalDataDSL.g:10939:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
-            // InternalDataDSL.g:10939:3: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
+            // InternalDataDSL.g:12025:2: ( rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 )
+            // InternalDataDSL.g:12025:3: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__ElementAssignment_0_0_0();
@@ -37162,14 +40783,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1"
-    // InternalDataDSL.g:10947:1: rule__XAnnotationElementValuePair__Group_0_0__1 : rule__XAnnotationElementValuePair__Group_0_0__1__Impl ;
+    // InternalDataDSL.g:12033:1: rule__XAnnotationElementValuePair__Group_0_0__1 : rule__XAnnotationElementValuePair__Group_0_0__1__Impl ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10951:1: ( rule__XAnnotationElementValuePair__Group_0_0__1__Impl )
-            // InternalDataDSL.g:10952:2: rule__XAnnotationElementValuePair__Group_0_0__1__Impl
+            // InternalDataDSL.g:12037:1: ( rule__XAnnotationElementValuePair__Group_0_0__1__Impl )
+            // InternalDataDSL.g:12038:2: rule__XAnnotationElementValuePair__Group_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValuePair__Group_0_0__1__Impl();
@@ -37195,17 +40816,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__Group_0_0__1__Impl"
-    // InternalDataDSL.g:10958:1: rule__XAnnotationElementValuePair__Group_0_0__1__Impl : ( '=' ) ;
+    // InternalDataDSL.g:12044:1: rule__XAnnotationElementValuePair__Group_0_0__1__Impl : ( '=' ) ;
     public final void rule__XAnnotationElementValuePair__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10962:1: ( ( '=' ) )
-            // InternalDataDSL.g:10963:1: ( '=' )
+            // InternalDataDSL.g:12048:1: ( ( '=' ) )
+            // InternalDataDSL.g:12049:1: ( '=' )
             {
-            // InternalDataDSL.g:10963:1: ( '=' )
-            // InternalDataDSL.g:10964:2: '='
+            // InternalDataDSL.g:12049:1: ( '=' )
+            // InternalDataDSL.g:12050:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1()); 
@@ -37236,16 +40857,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0"
-    // InternalDataDSL.g:10974:1: rule__XAnnotationElementValueOrCommaList__Group_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 ;
+    // InternalDataDSL.g:12060:1: rule__XAnnotationElementValueOrCommaList__Group_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10978:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 )
-            // InternalDataDSL.g:10979:2: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1
+            // InternalDataDSL.g:12064:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1 )
+            // InternalDataDSL.g:12065:2: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0__1
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl();
 
             state._fsp--;
@@ -37274,23 +40895,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl"
-    // InternalDataDSL.g:10986:1: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:12072:1: rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:10990:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:10991:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            // InternalDataDSL.g:12076:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:12077:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:10991:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
-            // InternalDataDSL.g:10992:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            // InternalDataDSL.g:12077:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 ) )
+            // InternalDataDSL.g:12078:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:10993:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
-            // InternalDataDSL.g:10993:3: rule__XAnnotationElementValueOrCommaList__Group_0_0__0
+            // InternalDataDSL.g:12079:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0 )
+            // InternalDataDSL.g:12079:3: rule__XAnnotationElementValueOrCommaList__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0__0();
@@ -37325,16 +40946,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1"
-    // InternalDataDSL.g:11001:1: rule__XAnnotationElementValueOrCommaList__Group_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 ;
+    // InternalDataDSL.g:12087:1: rule__XAnnotationElementValueOrCommaList__Group_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11005:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 )
-            // InternalDataDSL.g:11006:2: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2
+            // InternalDataDSL.g:12091:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2 )
+            // InternalDataDSL.g:12092:2: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0__2
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl();
 
             state._fsp--;
@@ -37363,31 +40984,31 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl"
-    // InternalDataDSL.g:11013:1: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) ;
+    // InternalDataDSL.g:12099:1: rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11017:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) )
-            // InternalDataDSL.g:11018:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            // InternalDataDSL.g:12103:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? ) )
+            // InternalDataDSL.g:12104:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
             {
-            // InternalDataDSL.g:11018:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
-            // InternalDataDSL.g:11019:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            // InternalDataDSL.g:12104:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )? )
+            // InternalDataDSL.g:12105:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1()); 
             }
-            // InternalDataDSL.g:11020:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
-            int alt104=2;
-            int LA104_0 = input.LA(1);
+            // InternalDataDSL.g:12106:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0 )?
+            int alt109=2;
+            int LA109_0 = input.LA(1);
 
-            if ( ((LA104_0>=RULE_STRING && LA104_0<=RULE_DECIMAL)||LA104_0==27||(LA104_0>=34 && LA104_0<=35)||LA104_0==40||(LA104_0>=45 && LA104_0<=50)||LA104_0==74||LA104_0==101||(LA104_0>=121 && LA104_0<=122)||(LA104_0>=126 && LA104_0<=127)||LA104_0==129||LA104_0==131||(LA104_0>=135 && LA104_0<=142)||LA104_0==144||LA104_0==166) ) {
-                alt104=1;
+            if ( ((LA109_0>=RULE_STRING && LA109_0<=RULE_DECIMAL)||LA109_0==27||(LA109_0>=34 && LA109_0<=35)||LA109_0==40||(LA109_0>=45 && LA109_0<=50)||LA109_0==74||LA109_0==103||(LA109_0>=127 && LA109_0<=128)||(LA109_0>=132 && LA109_0<=133)||LA109_0==135||LA109_0==137||(LA109_0>=141 && LA109_0<=148)||LA109_0==150||LA109_0==179) ) {
+                alt109=1;
             }
-            switch (alt104) {
+            switch (alt109) {
                 case 1 :
-                    // InternalDataDSL.g:11020:3: rule__XAnnotationElementValueOrCommaList__Group_0_1__0
+                    // InternalDataDSL.g:12106:3: rule__XAnnotationElementValueOrCommaList__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_0_1__0();
@@ -37425,14 +41046,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2"
-    // InternalDataDSL.g:11028:1: rule__XAnnotationElementValueOrCommaList__Group_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl ;
+    // InternalDataDSL.g:12114:1: rule__XAnnotationElementValueOrCommaList__Group_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11032:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl )
-            // InternalDataDSL.g:11033:2: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
+            // InternalDataDSL.g:12118:1: ( rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl )
+            // InternalDataDSL.g:12119:2: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl();
@@ -37458,22 +41079,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl"
-    // InternalDataDSL.g:11039:1: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl : ( ']' ) ;
+    // InternalDataDSL.g:12125:1: rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl : ( ']' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11043:1: ( ( ']' ) )
-            // InternalDataDSL.g:11044:1: ( ']' )
+            // InternalDataDSL.g:12129:1: ( ( ']' ) )
+            // InternalDataDSL.g:12130:1: ( ']' )
             {
-            // InternalDataDSL.g:11044:1: ( ']' )
-            // InternalDataDSL.g:11045:2: ']'
+            // InternalDataDSL.g:12130:1: ( ']' )
+            // InternalDataDSL.g:12131:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); 
             }
-            match(input,125,FOLLOW_2); if (state.failed) return ;
+            match(input,131,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2()); 
             }
@@ -37499,14 +41120,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0"
-    // InternalDataDSL.g:11055:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl ;
+    // InternalDataDSL.g:12141:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11059:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl )
-            // InternalDataDSL.g:11060:2: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
+            // InternalDataDSL.g:12145:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl )
+            // InternalDataDSL.g:12146:2: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl();
@@ -37532,23 +41153,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl"
-    // InternalDataDSL.g:11066:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) ;
+    // InternalDataDSL.g:12152:1: rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11070:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) )
-            // InternalDataDSL.g:11071:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            // InternalDataDSL.g:12156:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) ) )
+            // InternalDataDSL.g:12157:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
             {
-            // InternalDataDSL.g:11071:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
-            // InternalDataDSL.g:11072:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            // InternalDataDSL.g:12157:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 ) )
+            // InternalDataDSL.g:12158:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_0_0()); 
             }
-            // InternalDataDSL.g:11073:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
-            // InternalDataDSL.g:11073:3: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
+            // InternalDataDSL.g:12159:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 )
+            // InternalDataDSL.g:12159:3: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0();
@@ -37583,16 +41204,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0"
-    // InternalDataDSL.g:11082:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 ;
+    // InternalDataDSL.g:12168:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11086:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 )
-            // InternalDataDSL.g:11087:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
+            // InternalDataDSL.g:12172:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 )
+            // InternalDataDSL.g:12173:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1
             {
-            pushFollow(FOLLOW_87);
+            pushFollow(FOLLOW_95);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl();
 
             state._fsp--;
@@ -37621,23 +41242,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl"
-    // InternalDataDSL.g:11094:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:12180:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11098:1: ( ( () ) )
-            // InternalDataDSL.g:11099:1: ( () )
+            // InternalDataDSL.g:12184:1: ( ( () ) )
+            // InternalDataDSL.g:12185:1: ( () )
             {
-            // InternalDataDSL.g:11099:1: ( () )
-            // InternalDataDSL.g:11100:2: ()
+            // InternalDataDSL.g:12185:1: ( () )
+            // InternalDataDSL.g:12186:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralAction_0_0_0_0()); 
             }
-            // InternalDataDSL.g:11101:2: ()
-            // InternalDataDSL.g:11101:3: 
+            // InternalDataDSL.g:12187:2: ()
+            // InternalDataDSL.g:12187:3: 
             {
             }
 
@@ -37662,16 +41283,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1"
-    // InternalDataDSL.g:11109:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 ;
+    // InternalDataDSL.g:12195:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11113:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 )
-            // InternalDataDSL.g:11114:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
+            // InternalDataDSL.g:12199:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 )
+            // InternalDataDSL.g:12200:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl();
 
             state._fsp--;
@@ -37700,22 +41321,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl"
-    // InternalDataDSL.g:11121:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl : ( '#' ) ;
+    // InternalDataDSL.g:12207:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl : ( '#' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11125:1: ( ( '#' ) )
-            // InternalDataDSL.g:11126:1: ( '#' )
+            // InternalDataDSL.g:12211:1: ( ( '#' ) )
+            // InternalDataDSL.g:12212:1: ( '#' )
             {
-            // InternalDataDSL.g:11126:1: ( '#' )
-            // InternalDataDSL.g:11127:2: '#'
+            // InternalDataDSL.g:12212:1: ( '#' )
+            // InternalDataDSL.g:12213:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); 
             }
-            match(input,126,FOLLOW_2); if (state.failed) return ;
+            match(input,132,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1()); 
             }
@@ -37741,14 +41362,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2"
-    // InternalDataDSL.g:11136:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl ;
+    // InternalDataDSL.g:12222:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2 : rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11140:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl )
-            // InternalDataDSL.g:11141:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
+            // InternalDataDSL.g:12226:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl )
+            // InternalDataDSL.g:12227:2: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl();
@@ -37774,22 +41395,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl"
-    // InternalDataDSL.g:11147:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl : ( '[' ) ;
+    // InternalDataDSL.g:12233:1: rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl : ( '[' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11151:1: ( ( '[' ) )
-            // InternalDataDSL.g:11152:1: ( '[' )
+            // InternalDataDSL.g:12237:1: ( ( '[' ) )
+            // InternalDataDSL.g:12238:1: ( '[' )
             {
-            // InternalDataDSL.g:11152:1: ( '[' )
-            // InternalDataDSL.g:11153:2: '['
+            // InternalDataDSL.g:12238:1: ( '[' )
+            // InternalDataDSL.g:12239:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
             }
-            match(input,127,FOLLOW_2); if (state.failed) return ;
+            match(input,133,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
             }
@@ -37815,16 +41436,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0"
-    // InternalDataDSL.g:11163:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 ;
+    // InternalDataDSL.g:12249:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11167:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 )
-            // InternalDataDSL.g:11168:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1
+            // InternalDataDSL.g:12253:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1 )
+            // InternalDataDSL.g:12254:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl();
 
             state._fsp--;
@@ -37853,23 +41474,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl"
-    // InternalDataDSL.g:11175:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) ;
+    // InternalDataDSL.g:12261:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11179:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) )
-            // InternalDataDSL.g:11180:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            // InternalDataDSL.g:12265:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) ) )
+            // InternalDataDSL.g:12266:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
             {
-            // InternalDataDSL.g:11180:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
-            // InternalDataDSL.g:11181:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            // InternalDataDSL.g:12266:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 ) )
+            // InternalDataDSL.g:12267:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_0()); 
             }
-            // InternalDataDSL.g:11182:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
-            // InternalDataDSL.g:11182:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
+            // InternalDataDSL.g:12268:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 )
+            // InternalDataDSL.g:12268:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0();
@@ -37904,14 +41525,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1"
-    // InternalDataDSL.g:11190:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl ;
+    // InternalDataDSL.g:12276:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11194:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl )
-            // InternalDataDSL.g:11195:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
+            // InternalDataDSL.g:12280:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl )
+            // InternalDataDSL.g:12281:2: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl();
@@ -37937,37 +41558,37 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl"
-    // InternalDataDSL.g:11201:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) ;
+    // InternalDataDSL.g:12287:1: rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11205:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) )
-            // InternalDataDSL.g:11206:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:12291:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* ) )
+            // InternalDataDSL.g:12292:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
             {
-            // InternalDataDSL.g:11206:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
-            // InternalDataDSL.g:11207:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            // InternalDataDSL.g:12292:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:12293:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0_1_1()); 
             }
-            // InternalDataDSL.g:11208:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
-            loop105:
+            // InternalDataDSL.g:12294:2: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 )*
+            loop110:
             do {
-                int alt105=2;
-                int LA105_0 = input.LA(1);
+                int alt110=2;
+                int LA110_0 = input.LA(1);
 
-                if ( (LA105_0==124) ) {
-                    alt105=1;
+                if ( (LA110_0==130) ) {
+                    alt110=1;
                 }
 
 
-                switch (alt105) {
+                switch (alt110) {
             	case 1 :
-            	    // InternalDataDSL.g:11208:3: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
+            	    // InternalDataDSL.g:12294:3: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0();
 
             	    state._fsp--;
@@ -37977,7 +41598,7 @@
             	    break;
 
             	default :
-            	    break loop105;
+            	    break loop110;
                 }
             } while (true);
 
@@ -38006,16 +41627,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0"
-    // InternalDataDSL.g:11217:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 ;
+    // InternalDataDSL.g:12303:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11221:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 )
-            // InternalDataDSL.g:11222:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
+            // InternalDataDSL.g:12307:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 )
+            // InternalDataDSL.g:12308:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl();
 
             state._fsp--;
@@ -38044,22 +41665,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl"
-    // InternalDataDSL.g:11229:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:12315:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11233:1: ( ( ',' ) )
-            // InternalDataDSL.g:11234:1: ( ',' )
+            // InternalDataDSL.g:12319:1: ( ( ',' ) )
+            // InternalDataDSL.g:12320:1: ( ',' )
             {
-            // InternalDataDSL.g:11234:1: ( ',' )
-            // InternalDataDSL.g:11235:2: ','
+            // InternalDataDSL.g:12320:1: ( ',' )
+            // InternalDataDSL.g:12321:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0()); 
             }
@@ -38085,14 +41706,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1"
-    // InternalDataDSL.g:11244:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl ;
+    // InternalDataDSL.g:12330:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11248:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl )
-            // InternalDataDSL.g:11249:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
+            // InternalDataDSL.g:12334:1: ( rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl )
+            // InternalDataDSL.g:12335:2: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl();
@@ -38118,23 +41739,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl"
-    // InternalDataDSL.g:11255:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) ;
+    // InternalDataDSL.g:12341:1: rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11259:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) )
-            // InternalDataDSL.g:11260:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:12345:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalDataDSL.g:12346:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
             {
-            // InternalDataDSL.g:11260:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
-            // InternalDataDSL.g:11261:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            // InternalDataDSL.g:12346:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:12347:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_0_1_1_1()); 
             }
-            // InternalDataDSL.g:11262:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
-            // InternalDataDSL.g:11262:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
+            // InternalDataDSL.g:12348:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 )
+            // InternalDataDSL.g:12348:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1();
@@ -38169,16 +41790,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0"
-    // InternalDataDSL.g:11271:1: rule__XAnnotationElementValueOrCommaList__Group_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 ;
+    // InternalDataDSL.g:12357:1: rule__XAnnotationElementValueOrCommaList__Group_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11275:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 )
-            // InternalDataDSL.g:11276:2: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1
+            // InternalDataDSL.g:12361:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1 )
+            // InternalDataDSL.g:12362:2: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl();
 
             state._fsp--;
@@ -38207,17 +41828,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl"
-    // InternalDataDSL.g:11283:1: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:12369:1: rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11287:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:11288:1: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:12373:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:12374:1: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:11288:1: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:11289:2: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:12374:1: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:12375:2: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0()); 
@@ -38252,14 +41873,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1"
-    // InternalDataDSL.g:11298:1: rule__XAnnotationElementValueOrCommaList__Group_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl ;
+    // InternalDataDSL.g:12384:1: rule__XAnnotationElementValueOrCommaList__Group_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11302:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl )
-            // InternalDataDSL.g:11303:2: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
+            // InternalDataDSL.g:12388:1: ( rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl )
+            // InternalDataDSL.g:12389:2: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl();
@@ -38285,31 +41906,31 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl"
-    // InternalDataDSL.g:11309:1: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) ;
+    // InternalDataDSL.g:12395:1: rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11313:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) )
-            // InternalDataDSL.g:11314:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            // InternalDataDSL.g:12399:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? ) )
+            // InternalDataDSL.g:12400:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
             {
-            // InternalDataDSL.g:11314:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
-            // InternalDataDSL.g:11315:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            // InternalDataDSL.g:12400:1: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )? )
+            // InternalDataDSL.g:12401:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1()); 
             }
-            // InternalDataDSL.g:11316:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
-            int alt106=2;
-            int LA106_0 = input.LA(1);
+            // InternalDataDSL.g:12402:2: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0 )?
+            int alt111=2;
+            int LA111_0 = input.LA(1);
 
-            if ( (LA106_0==124) ) {
-                alt106=1;
+            if ( (LA111_0==130) ) {
+                alt111=1;
             }
-            switch (alt106) {
+            switch (alt111) {
                 case 1 :
-                    // InternalDataDSL.g:11316:3: rule__XAnnotationElementValueOrCommaList__Group_1_1__0
+                    // InternalDataDSL.g:12402:3: rule__XAnnotationElementValueOrCommaList__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValueOrCommaList__Group_1_1__0();
@@ -38347,16 +41968,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0"
-    // InternalDataDSL.g:11325:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 ;
+    // InternalDataDSL.g:12411:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11329:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 )
-            // InternalDataDSL.g:11330:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1
+            // InternalDataDSL.g:12415:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1 )
+            // InternalDataDSL.g:12416:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -38385,23 +42006,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl"
-    // InternalDataDSL.g:11337:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl : ( () ) ;
+    // InternalDataDSL.g:12423:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11341:1: ( ( () ) )
-            // InternalDataDSL.g:11342:1: ( () )
+            // InternalDataDSL.g:12427:1: ( ( () ) )
+            // InternalDataDSL.g:12428:1: ( () )
             {
-            // InternalDataDSL.g:11342:1: ( () )
-            // InternalDataDSL.g:11343:2: ()
+            // InternalDataDSL.g:12428:1: ( () )
+            // InternalDataDSL.g:12429:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXListLiteralElementsAction_1_1_0()); 
             }
-            // InternalDataDSL.g:11344:2: ()
-            // InternalDataDSL.g:11344:3: 
+            // InternalDataDSL.g:12430:2: ()
+            // InternalDataDSL.g:12430:3: 
             {
             }
 
@@ -38426,14 +42047,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1"
-    // InternalDataDSL.g:11352:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl ;
+    // InternalDataDSL.g:12438:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11356:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl )
-            // InternalDataDSL.g:11357:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
+            // InternalDataDSL.g:12442:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl )
+            // InternalDataDSL.g:12443:2: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl();
@@ -38459,28 +42080,28 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl"
-    // InternalDataDSL.g:11363:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) ;
+    // InternalDataDSL.g:12449:1: rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11367:1: ( ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) )
-            // InternalDataDSL.g:11368:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            // InternalDataDSL.g:12453:1: ( ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) ) )
+            // InternalDataDSL.g:12454:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
             {
-            // InternalDataDSL.g:11368:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
-            // InternalDataDSL.g:11369:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            // InternalDataDSL.g:12454:1: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* ) )
+            // InternalDataDSL.g:12455:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) ) ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
             {
-            // InternalDataDSL.g:11369:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) )
-            // InternalDataDSL.g:11370:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            // InternalDataDSL.g:12455:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 ) )
+            // InternalDataDSL.g:12456:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
             }
-            // InternalDataDSL.g:11371:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
-            // InternalDataDSL.g:11371:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            // InternalDataDSL.g:12457:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )
+            // InternalDataDSL.g:12457:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
             {
-            pushFollow(FOLLOW_83);
+            pushFollow(FOLLOW_91);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
 
             state._fsp--;
@@ -38494,28 +42115,28 @@
 
             }
 
-            // InternalDataDSL.g:11374:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
-            // InternalDataDSL.g:11375:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            // InternalDataDSL.g:12460:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )* )
+            // InternalDataDSL.g:12461:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_1_1_1()); 
             }
-            // InternalDataDSL.g:11376:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
-            loop107:
+            // InternalDataDSL.g:12462:3: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 )*
+            loop112:
             do {
-                int alt107=2;
-                int LA107_0 = input.LA(1);
+                int alt112=2;
+                int LA112_0 = input.LA(1);
 
-                if ( (LA107_0==124) ) {
-                    alt107=1;
+                if ( (LA112_0==130) ) {
+                    alt112=1;
                 }
 
 
-                switch (alt107) {
+                switch (alt112) {
             	case 1 :
-            	    // InternalDataDSL.g:11376:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
+            	    // InternalDataDSL.g:12462:4: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0();
 
             	    state._fsp--;
@@ -38525,7 +42146,7 @@
             	    break;
 
             	default :
-            	    break loop107;
+            	    break loop112;
                 }
             } while (true);
 
@@ -38557,16 +42178,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0"
-    // InternalDataDSL.g:11386:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 ;
+    // InternalDataDSL.g:12472:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11390:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 )
-            // InternalDataDSL.g:11391:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
+            // InternalDataDSL.g:12476:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 )
+            // InternalDataDSL.g:12477:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl();
 
             state._fsp--;
@@ -38595,22 +42216,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl"
-    // InternalDataDSL.g:11398:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:12484:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11402:1: ( ( ',' ) )
-            // InternalDataDSL.g:11403:1: ( ',' )
+            // InternalDataDSL.g:12488:1: ( ( ',' ) )
+            // InternalDataDSL.g:12489:1: ( ',' )
             {
-            // InternalDataDSL.g:11403:1: ( ',' )
-            // InternalDataDSL.g:11404:2: ','
+            // InternalDataDSL.g:12489:1: ( ',' )
+            // InternalDataDSL.g:12490:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0()); 
             }
@@ -38636,14 +42257,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1"
-    // InternalDataDSL.g:11413:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl ;
+    // InternalDataDSL.g:12499:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1 : rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11417:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl )
-            // InternalDataDSL.g:11418:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
+            // InternalDataDSL.g:12503:1: ( rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl )
+            // InternalDataDSL.g:12504:2: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl();
@@ -38669,23 +42290,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl"
-    // InternalDataDSL.g:11424:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) ;
+    // InternalDataDSL.g:12510:1: rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl : ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValueOrCommaList__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11428:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) )
-            // InternalDataDSL.g:11429:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            // InternalDataDSL.g:12514:1: ( ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) ) )
+            // InternalDataDSL.g:12515:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
             {
-            // InternalDataDSL.g:11429:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
-            // InternalDataDSL.g:11430:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            // InternalDataDSL.g:12515:1: ( ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 ) )
+            // InternalDataDSL.g:12516:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsAssignment_1_1_1_1()); 
             }
-            // InternalDataDSL.g:11431:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
-            // InternalDataDSL.g:11431:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
+            // InternalDataDSL.g:12517:2: ( rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 )
+            // InternalDataDSL.g:12517:3: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1();
@@ -38720,16 +42341,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__0"
-    // InternalDataDSL.g:11440:1: rule__XAnnotationElementValue__Group_0__0 : rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 ;
+    // InternalDataDSL.g:12526:1: rule__XAnnotationElementValue__Group_0__0 : rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 ;
     public final void rule__XAnnotationElementValue__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11444:1: ( rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 )
-            // InternalDataDSL.g:11445:2: rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1
+            // InternalDataDSL.g:12530:1: ( rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1 )
+            // InternalDataDSL.g:12531:2: rule__XAnnotationElementValue__Group_0__0__Impl rule__XAnnotationElementValue__Group_0__1
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XAnnotationElementValue__Group_0__0__Impl();
 
             state._fsp--;
@@ -38758,23 +42379,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__0__Impl"
-    // InternalDataDSL.g:11452:1: rule__XAnnotationElementValue__Group_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:12538:1: rule__XAnnotationElementValue__Group_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11456:1: ( ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:11457:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            // InternalDataDSL.g:12542:1: ( ( ( rule__XAnnotationElementValue__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:12543:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:11457:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
-            // InternalDataDSL.g:11458:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            // InternalDataDSL.g:12543:1: ( ( rule__XAnnotationElementValue__Group_0_0__0 ) )
+            // InternalDataDSL.g:12544:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:11459:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
-            // InternalDataDSL.g:11459:3: rule__XAnnotationElementValue__Group_0_0__0
+            // InternalDataDSL.g:12545:2: ( rule__XAnnotationElementValue__Group_0_0__0 )
+            // InternalDataDSL.g:12545:3: rule__XAnnotationElementValue__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0__0();
@@ -38809,16 +42430,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__1"
-    // InternalDataDSL.g:11467:1: rule__XAnnotationElementValue__Group_0__1 : rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 ;
+    // InternalDataDSL.g:12553:1: rule__XAnnotationElementValue__Group_0__1 : rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 ;
     public final void rule__XAnnotationElementValue__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11471:1: ( rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 )
-            // InternalDataDSL.g:11472:2: rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2
+            // InternalDataDSL.g:12557:1: ( rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2 )
+            // InternalDataDSL.g:12558:2: rule__XAnnotationElementValue__Group_0__1__Impl rule__XAnnotationElementValue__Group_0__2
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XAnnotationElementValue__Group_0__1__Impl();
 
             state._fsp--;
@@ -38847,31 +42468,31 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__1__Impl"
-    // InternalDataDSL.g:11479:1: rule__XAnnotationElementValue__Group_0__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) ;
+    // InternalDataDSL.g:12565:1: rule__XAnnotationElementValue__Group_0__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) ;
     public final void rule__XAnnotationElementValue__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11483:1: ( ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) )
-            // InternalDataDSL.g:11484:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            // InternalDataDSL.g:12569:1: ( ( ( rule__XAnnotationElementValue__Group_0_1__0 )? ) )
+            // InternalDataDSL.g:12570:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
             {
-            // InternalDataDSL.g:11484:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
-            // InternalDataDSL.g:11485:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            // InternalDataDSL.g:12570:1: ( ( rule__XAnnotationElementValue__Group_0_1__0 )? )
+            // InternalDataDSL.g:12571:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1()); 
             }
-            // InternalDataDSL.g:11486:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
-            int alt108=2;
-            int LA108_0 = input.LA(1);
+            // InternalDataDSL.g:12572:2: ( rule__XAnnotationElementValue__Group_0_1__0 )?
+            int alt113=2;
+            int LA113_0 = input.LA(1);
 
-            if ( ((LA108_0>=RULE_STRING && LA108_0<=RULE_DECIMAL)||LA108_0==27||(LA108_0>=34 && LA108_0<=35)||LA108_0==40||(LA108_0>=45 && LA108_0<=50)||LA108_0==74||LA108_0==101||(LA108_0>=121 && LA108_0<=122)||(LA108_0>=126 && LA108_0<=127)||LA108_0==129||LA108_0==131||(LA108_0>=135 && LA108_0<=142)||LA108_0==144||LA108_0==166) ) {
-                alt108=1;
+            if ( ((LA113_0>=RULE_STRING && LA113_0<=RULE_DECIMAL)||LA113_0==27||(LA113_0>=34 && LA113_0<=35)||LA113_0==40||(LA113_0>=45 && LA113_0<=50)||LA113_0==74||LA113_0==103||(LA113_0>=127 && LA113_0<=128)||(LA113_0>=132 && LA113_0<=133)||LA113_0==135||LA113_0==137||(LA113_0>=141 && LA113_0<=148)||LA113_0==150||LA113_0==179) ) {
+                alt113=1;
             }
-            switch (alt108) {
+            switch (alt113) {
                 case 1 :
-                    // InternalDataDSL.g:11486:3: rule__XAnnotationElementValue__Group_0_1__0
+                    // InternalDataDSL.g:12572:3: rule__XAnnotationElementValue__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAnnotationElementValue__Group_0_1__0();
@@ -38909,14 +42530,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__2"
-    // InternalDataDSL.g:11494:1: rule__XAnnotationElementValue__Group_0__2 : rule__XAnnotationElementValue__Group_0__2__Impl ;
+    // InternalDataDSL.g:12580:1: rule__XAnnotationElementValue__Group_0__2 : rule__XAnnotationElementValue__Group_0__2__Impl ;
     public final void rule__XAnnotationElementValue__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11498:1: ( rule__XAnnotationElementValue__Group_0__2__Impl )
-            // InternalDataDSL.g:11499:2: rule__XAnnotationElementValue__Group_0__2__Impl
+            // InternalDataDSL.g:12584:1: ( rule__XAnnotationElementValue__Group_0__2__Impl )
+            // InternalDataDSL.g:12585:2: rule__XAnnotationElementValue__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0__2__Impl();
@@ -38942,22 +42563,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0__2__Impl"
-    // InternalDataDSL.g:11505:1: rule__XAnnotationElementValue__Group_0__2__Impl : ( ']' ) ;
+    // InternalDataDSL.g:12591:1: rule__XAnnotationElementValue__Group_0__2__Impl : ( ']' ) ;
     public final void rule__XAnnotationElementValue__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11509:1: ( ( ']' ) )
-            // InternalDataDSL.g:11510:1: ( ']' )
+            // InternalDataDSL.g:12595:1: ( ( ']' ) )
+            // InternalDataDSL.g:12596:1: ( ']' )
             {
-            // InternalDataDSL.g:11510:1: ( ']' )
-            // InternalDataDSL.g:11511:2: ']'
+            // InternalDataDSL.g:12596:1: ( ']' )
+            // InternalDataDSL.g:12597:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); 
             }
-            match(input,125,FOLLOW_2); if (state.failed) return ;
+            match(input,131,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2()); 
             }
@@ -38983,14 +42604,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0"
-    // InternalDataDSL.g:11521:1: rule__XAnnotationElementValue__Group_0_0__0 : rule__XAnnotationElementValue__Group_0_0__0__Impl ;
+    // InternalDataDSL.g:12607:1: rule__XAnnotationElementValue__Group_0_0__0 : rule__XAnnotationElementValue__Group_0_0__0__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11525:1: ( rule__XAnnotationElementValue__Group_0_0__0__Impl )
-            // InternalDataDSL.g:11526:2: rule__XAnnotationElementValue__Group_0_0__0__Impl
+            // InternalDataDSL.g:12611:1: ( rule__XAnnotationElementValue__Group_0_0__0__Impl )
+            // InternalDataDSL.g:12612:2: rule__XAnnotationElementValue__Group_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0__0__Impl();
@@ -39016,23 +42637,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0__0__Impl"
-    // InternalDataDSL.g:11532:1: rule__XAnnotationElementValue__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) ;
+    // InternalDataDSL.g:12618:1: rule__XAnnotationElementValue__Group_0_0__0__Impl : ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11536:1: ( ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) )
-            // InternalDataDSL.g:11537:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            // InternalDataDSL.g:12622:1: ( ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) ) )
+            // InternalDataDSL.g:12623:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
             {
-            // InternalDataDSL.g:11537:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
-            // InternalDataDSL.g:11538:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            // InternalDataDSL.g:12623:1: ( ( rule__XAnnotationElementValue__Group_0_0_0__0 ) )
+            // InternalDataDSL.g:12624:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_0_0()); 
             }
-            // InternalDataDSL.g:11539:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
-            // InternalDataDSL.g:11539:3: rule__XAnnotationElementValue__Group_0_0_0__0
+            // InternalDataDSL.g:12625:2: ( rule__XAnnotationElementValue__Group_0_0_0__0 )
+            // InternalDataDSL.g:12625:3: rule__XAnnotationElementValue__Group_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0_0__0();
@@ -39067,16 +42688,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0"
-    // InternalDataDSL.g:11548:1: rule__XAnnotationElementValue__Group_0_0_0__0 : rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 ;
+    // InternalDataDSL.g:12634:1: rule__XAnnotationElementValue__Group_0_0_0__0 : rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11552:1: ( rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 )
-            // InternalDataDSL.g:11553:2: rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1
+            // InternalDataDSL.g:12638:1: ( rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1 )
+            // InternalDataDSL.g:12639:2: rule__XAnnotationElementValue__Group_0_0_0__0__Impl rule__XAnnotationElementValue__Group_0_0_0__1
             {
-            pushFollow(FOLLOW_87);
+            pushFollow(FOLLOW_95);
             rule__XAnnotationElementValue__Group_0_0_0__0__Impl();
 
             state._fsp--;
@@ -39105,23 +42726,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__0__Impl"
-    // InternalDataDSL.g:11560:1: rule__XAnnotationElementValue__Group_0_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:12646:1: rule__XAnnotationElementValue__Group_0_0_0__0__Impl : ( () ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11564:1: ( ( () ) )
-            // InternalDataDSL.g:11565:1: ( () )
+            // InternalDataDSL.g:12650:1: ( ( () ) )
+            // InternalDataDSL.g:12651:1: ( () )
             {
-            // InternalDataDSL.g:11565:1: ( () )
-            // InternalDataDSL.g:11566:2: ()
+            // InternalDataDSL.g:12651:1: ( () )
+            // InternalDataDSL.g:12652:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getXListLiteralAction_0_0_0_0()); 
             }
-            // InternalDataDSL.g:11567:2: ()
-            // InternalDataDSL.g:11567:3: 
+            // InternalDataDSL.g:12653:2: ()
+            // InternalDataDSL.g:12653:3: 
             {
             }
 
@@ -39146,16 +42767,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1"
-    // InternalDataDSL.g:11575:1: rule__XAnnotationElementValue__Group_0_0_0__1 : rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 ;
+    // InternalDataDSL.g:12661:1: rule__XAnnotationElementValue__Group_0_0_0__1 : rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11579:1: ( rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 )
-            // InternalDataDSL.g:11580:2: rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2
+            // InternalDataDSL.g:12665:1: ( rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2 )
+            // InternalDataDSL.g:12666:2: rule__XAnnotationElementValue__Group_0_0_0__1__Impl rule__XAnnotationElementValue__Group_0_0_0__2
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__XAnnotationElementValue__Group_0_0_0__1__Impl();
 
             state._fsp--;
@@ -39184,22 +42805,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__1__Impl"
-    // InternalDataDSL.g:11587:1: rule__XAnnotationElementValue__Group_0_0_0__1__Impl : ( '#' ) ;
+    // InternalDataDSL.g:12673:1: rule__XAnnotationElementValue__Group_0_0_0__1__Impl : ( '#' ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11591:1: ( ( '#' ) )
-            // InternalDataDSL.g:11592:1: ( '#' )
+            // InternalDataDSL.g:12677:1: ( ( '#' ) )
+            // InternalDataDSL.g:12678:1: ( '#' )
             {
-            // InternalDataDSL.g:11592:1: ( '#' )
-            // InternalDataDSL.g:11593:2: '#'
+            // InternalDataDSL.g:12678:1: ( '#' )
+            // InternalDataDSL.g:12679:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); 
             }
-            match(input,126,FOLLOW_2); if (state.failed) return ;
+            match(input,132,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1()); 
             }
@@ -39225,14 +42846,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2"
-    // InternalDataDSL.g:11602:1: rule__XAnnotationElementValue__Group_0_0_0__2 : rule__XAnnotationElementValue__Group_0_0_0__2__Impl ;
+    // InternalDataDSL.g:12688:1: rule__XAnnotationElementValue__Group_0_0_0__2 : rule__XAnnotationElementValue__Group_0_0_0__2__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11606:1: ( rule__XAnnotationElementValue__Group_0_0_0__2__Impl )
-            // InternalDataDSL.g:11607:2: rule__XAnnotationElementValue__Group_0_0_0__2__Impl
+            // InternalDataDSL.g:12692:1: ( rule__XAnnotationElementValue__Group_0_0_0__2__Impl )
+            // InternalDataDSL.g:12693:2: rule__XAnnotationElementValue__Group_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_0_0__2__Impl();
@@ -39258,22 +42879,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_0_0__2__Impl"
-    // InternalDataDSL.g:11613:1: rule__XAnnotationElementValue__Group_0_0_0__2__Impl : ( '[' ) ;
+    // InternalDataDSL.g:12699:1: rule__XAnnotationElementValue__Group_0_0_0__2__Impl : ( '[' ) ;
     public final void rule__XAnnotationElementValue__Group_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11617:1: ( ( '[' ) )
-            // InternalDataDSL.g:11618:1: ( '[' )
+            // InternalDataDSL.g:12703:1: ( ( '[' ) )
+            // InternalDataDSL.g:12704:1: ( '[' )
             {
-            // InternalDataDSL.g:11618:1: ( '[' )
-            // InternalDataDSL.g:11619:2: '['
+            // InternalDataDSL.g:12704:1: ( '[' )
+            // InternalDataDSL.g:12705:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
             }
-            match(input,127,FOLLOW_2); if (state.failed) return ;
+            match(input,133,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2()); 
             }
@@ -39299,16 +42920,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0"
-    // InternalDataDSL.g:11629:1: rule__XAnnotationElementValue__Group_0_1__0 : rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 ;
+    // InternalDataDSL.g:12715:1: rule__XAnnotationElementValue__Group_0_1__0 : rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 ;
     public final void rule__XAnnotationElementValue__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11633:1: ( rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 )
-            // InternalDataDSL.g:11634:2: rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1
+            // InternalDataDSL.g:12719:1: ( rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1 )
+            // InternalDataDSL.g:12720:2: rule__XAnnotationElementValue__Group_0_1__0__Impl rule__XAnnotationElementValue__Group_0_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XAnnotationElementValue__Group_0_1__0__Impl();
 
             state._fsp--;
@@ -39337,23 +42958,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__0__Impl"
-    // InternalDataDSL.g:11641:1: rule__XAnnotationElementValue__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) ;
+    // InternalDataDSL.g:12727:1: rule__XAnnotationElementValue__Group_0_1__0__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11645:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) )
-            // InternalDataDSL.g:11646:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            // InternalDataDSL.g:12731:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) ) )
+            // InternalDataDSL.g:12732:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
             {
-            // InternalDataDSL.g:11646:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
-            // InternalDataDSL.g:11647:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            // InternalDataDSL.g:12732:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 ) )
+            // InternalDataDSL.g:12733:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_0()); 
             }
-            // InternalDataDSL.g:11648:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
-            // InternalDataDSL.g:11648:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_0
+            // InternalDataDSL.g:12734:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_0 )
+            // InternalDataDSL.g:12734:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__ElementsAssignment_0_1_0();
@@ -39388,14 +43009,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1"
-    // InternalDataDSL.g:11656:1: rule__XAnnotationElementValue__Group_0_1__1 : rule__XAnnotationElementValue__Group_0_1__1__Impl ;
+    // InternalDataDSL.g:12742:1: rule__XAnnotationElementValue__Group_0_1__1 : rule__XAnnotationElementValue__Group_0_1__1__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11660:1: ( rule__XAnnotationElementValue__Group_0_1__1__Impl )
-            // InternalDataDSL.g:11661:2: rule__XAnnotationElementValue__Group_0_1__1__Impl
+            // InternalDataDSL.g:12746:1: ( rule__XAnnotationElementValue__Group_0_1__1__Impl )
+            // InternalDataDSL.g:12747:2: rule__XAnnotationElementValue__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_1__1__Impl();
@@ -39421,37 +43042,37 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1__1__Impl"
-    // InternalDataDSL.g:11667:1: rule__XAnnotationElementValue__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) ;
+    // InternalDataDSL.g:12753:1: rule__XAnnotationElementValue__Group_0_1__1__Impl : ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) ;
     public final void rule__XAnnotationElementValue__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11671:1: ( ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) )
-            // InternalDataDSL.g:11672:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:12757:1: ( ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* ) )
+            // InternalDataDSL.g:12758:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
             {
-            // InternalDataDSL.g:11672:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
-            // InternalDataDSL.g:11673:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            // InternalDataDSL.g:12758:1: ( ( rule__XAnnotationElementValue__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:12759:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0_1_1()); 
             }
-            // InternalDataDSL.g:11674:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
-            loop109:
+            // InternalDataDSL.g:12760:2: ( rule__XAnnotationElementValue__Group_0_1_1__0 )*
+            loop114:
             do {
-                int alt109=2;
-                int LA109_0 = input.LA(1);
+                int alt114=2;
+                int LA114_0 = input.LA(1);
 
-                if ( (LA109_0==124) ) {
-                    alt109=1;
+                if ( (LA114_0==130) ) {
+                    alt114=1;
                 }
 
 
-                switch (alt109) {
+                switch (alt114) {
             	case 1 :
-            	    // InternalDataDSL.g:11674:3: rule__XAnnotationElementValue__Group_0_1_1__0
+            	    // InternalDataDSL.g:12760:3: rule__XAnnotationElementValue__Group_0_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XAnnotationElementValue__Group_0_1_1__0();
 
             	    state._fsp--;
@@ -39461,7 +43082,7 @@
             	    break;
 
             	default :
-            	    break loop109;
+            	    break loop114;
                 }
             } while (true);
 
@@ -39490,16 +43111,16 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0"
-    // InternalDataDSL.g:11683:1: rule__XAnnotationElementValue__Group_0_1_1__0 : rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 ;
+    // InternalDataDSL.g:12769:1: rule__XAnnotationElementValue__Group_0_1_1__0 : rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11687:1: ( rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 )
-            // InternalDataDSL.g:11688:2: rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1
+            // InternalDataDSL.g:12773:1: ( rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1 )
+            // InternalDataDSL.g:12774:2: rule__XAnnotationElementValue__Group_0_1_1__0__Impl rule__XAnnotationElementValue__Group_0_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAnnotationElementValue__Group_0_1_1__0__Impl();
 
             state._fsp--;
@@ -39528,22 +43149,22 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__0__Impl"
-    // InternalDataDSL.g:11695:1: rule__XAnnotationElementValue__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:12781:1: rule__XAnnotationElementValue__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11699:1: ( ( ',' ) )
-            // InternalDataDSL.g:11700:1: ( ',' )
+            // InternalDataDSL.g:12785:1: ( ( ',' ) )
+            // InternalDataDSL.g:12786:1: ( ',' )
             {
-            // InternalDataDSL.g:11700:1: ( ',' )
-            // InternalDataDSL.g:11701:2: ','
+            // InternalDataDSL.g:12786:1: ( ',' )
+            // InternalDataDSL.g:12787:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0()); 
             }
@@ -39569,14 +43190,14 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1"
-    // InternalDataDSL.g:11710:1: rule__XAnnotationElementValue__Group_0_1_1__1 : rule__XAnnotationElementValue__Group_0_1_1__1__Impl ;
+    // InternalDataDSL.g:12796:1: rule__XAnnotationElementValue__Group_0_1_1__1 : rule__XAnnotationElementValue__Group_0_1_1__1__Impl ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11714:1: ( rule__XAnnotationElementValue__Group_0_1_1__1__Impl )
-            // InternalDataDSL.g:11715:2: rule__XAnnotationElementValue__Group_0_1_1__1__Impl
+            // InternalDataDSL.g:12800:1: ( rule__XAnnotationElementValue__Group_0_1_1__1__Impl )
+            // InternalDataDSL.g:12801:2: rule__XAnnotationElementValue__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__Group_0_1_1__1__Impl();
@@ -39602,23 +43223,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__Group_0_1_1__1__Impl"
-    // InternalDataDSL.g:11721:1: rule__XAnnotationElementValue__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) ;
+    // InternalDataDSL.g:12807:1: rule__XAnnotationElementValue__Group_0_1_1__1__Impl : ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) ;
     public final void rule__XAnnotationElementValue__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11725:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) )
-            // InternalDataDSL.g:11726:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:12811:1: ( ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) ) )
+            // InternalDataDSL.g:12812:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
             {
-            // InternalDataDSL.g:11726:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
-            // InternalDataDSL.g:11727:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            // InternalDataDSL.g:12812:1: ( ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:12813:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsAssignment_0_1_1_1()); 
             }
-            // InternalDataDSL.g:11728:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
-            // InternalDataDSL.g:11728:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
+            // InternalDataDSL.g:12814:2: ( rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 )
+            // InternalDataDSL.g:12814:3: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1();
@@ -39653,16 +43274,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__0"
-    // InternalDataDSL.g:11737:1: rule__XAssignment__Group_0__0 : rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 ;
+    // InternalDataDSL.g:12823:1: rule__XAssignment__Group_0__0 : rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 ;
     public final void rule__XAssignment__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11741:1: ( rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 )
-            // InternalDataDSL.g:11742:2: rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1
+            // InternalDataDSL.g:12827:1: ( rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1 )
+            // InternalDataDSL.g:12828:2: rule__XAssignment__Group_0__0__Impl rule__XAssignment__Group_0__1
             {
-            pushFollow(FOLLOW_89);
+            pushFollow(FOLLOW_97);
             rule__XAssignment__Group_0__0__Impl();
 
             state._fsp--;
@@ -39691,23 +43312,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__0__Impl"
-    // InternalDataDSL.g:11749:1: rule__XAssignment__Group_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:12835:1: rule__XAssignment__Group_0__0__Impl : ( () ) ;
     public final void rule__XAssignment__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11753:1: ( ( () ) )
-            // InternalDataDSL.g:11754:1: ( () )
+            // InternalDataDSL.g:12839:1: ( ( () ) )
+            // InternalDataDSL.g:12840:1: ( () )
             {
-            // InternalDataDSL.g:11754:1: ( () )
-            // InternalDataDSL.g:11755:2: ()
+            // InternalDataDSL.g:12840:1: ( () )
+            // InternalDataDSL.g:12841:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXAssignmentAction_0_0()); 
             }
-            // InternalDataDSL.g:11756:2: ()
-            // InternalDataDSL.g:11756:3: 
+            // InternalDataDSL.g:12842:2: ()
+            // InternalDataDSL.g:12842:3: 
             {
             }
 
@@ -39732,16 +43353,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__1"
-    // InternalDataDSL.g:11764:1: rule__XAssignment__Group_0__1 : rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 ;
+    // InternalDataDSL.g:12850:1: rule__XAssignment__Group_0__1 : rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 ;
     public final void rule__XAssignment__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11768:1: ( rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 )
-            // InternalDataDSL.g:11769:2: rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2
+            // InternalDataDSL.g:12854:1: ( rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2 )
+            // InternalDataDSL.g:12855:2: rule__XAssignment__Group_0__1__Impl rule__XAssignment__Group_0__2
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__XAssignment__Group_0__1__Impl();
 
             state._fsp--;
@@ -39770,23 +43391,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__1__Impl"
-    // InternalDataDSL.g:11776:1: rule__XAssignment__Group_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) ;
+    // InternalDataDSL.g:12862:1: rule__XAssignment__Group_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) ;
     public final void rule__XAssignment__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11780:1: ( ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) )
-            // InternalDataDSL.g:11781:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            // InternalDataDSL.g:12866:1: ( ( ( rule__XAssignment__FeatureAssignment_0_1 ) ) )
+            // InternalDataDSL.g:12867:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
             {
-            // InternalDataDSL.g:11781:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
-            // InternalDataDSL.g:11782:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            // InternalDataDSL.g:12867:1: ( ( rule__XAssignment__FeatureAssignment_0_1 ) )
+            // InternalDataDSL.g:12868:2: ( rule__XAssignment__FeatureAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_0_1()); 
             }
-            // InternalDataDSL.g:11783:2: ( rule__XAssignment__FeatureAssignment_0_1 )
-            // InternalDataDSL.g:11783:3: rule__XAssignment__FeatureAssignment_0_1
+            // InternalDataDSL.g:12869:2: ( rule__XAssignment__FeatureAssignment_0_1 )
+            // InternalDataDSL.g:12869:3: rule__XAssignment__FeatureAssignment_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__FeatureAssignment_0_1();
@@ -39821,16 +43442,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__2"
-    // InternalDataDSL.g:11791:1: rule__XAssignment__Group_0__2 : rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 ;
+    // InternalDataDSL.g:12877:1: rule__XAssignment__Group_0__2 : rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 ;
     public final void rule__XAssignment__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11795:1: ( rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 )
-            // InternalDataDSL.g:11796:2: rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3
+            // InternalDataDSL.g:12881:1: ( rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3 )
+            // InternalDataDSL.g:12882:2: rule__XAssignment__Group_0__2__Impl rule__XAssignment__Group_0__3
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAssignment__Group_0__2__Impl();
 
             state._fsp--;
@@ -39859,17 +43480,17 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__2__Impl"
-    // InternalDataDSL.g:11803:1: rule__XAssignment__Group_0__2__Impl : ( ruleOpSingleAssign ) ;
+    // InternalDataDSL.g:12889:1: rule__XAssignment__Group_0__2__Impl : ( ruleOpSingleAssign ) ;
     public final void rule__XAssignment__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11807:1: ( ( ruleOpSingleAssign ) )
-            // InternalDataDSL.g:11808:1: ( ruleOpSingleAssign )
+            // InternalDataDSL.g:12893:1: ( ( ruleOpSingleAssign ) )
+            // InternalDataDSL.g:12894:1: ( ruleOpSingleAssign )
             {
-            // InternalDataDSL.g:11808:1: ( ruleOpSingleAssign )
-            // InternalDataDSL.g:11809:2: ruleOpSingleAssign
+            // InternalDataDSL.g:12894:1: ( ruleOpSingleAssign )
+            // InternalDataDSL.g:12895:2: ruleOpSingleAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2()); 
@@ -39904,14 +43525,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__3"
-    // InternalDataDSL.g:11818:1: rule__XAssignment__Group_0__3 : rule__XAssignment__Group_0__3__Impl ;
+    // InternalDataDSL.g:12904:1: rule__XAssignment__Group_0__3 : rule__XAssignment__Group_0__3__Impl ;
     public final void rule__XAssignment__Group_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11822:1: ( rule__XAssignment__Group_0__3__Impl )
-            // InternalDataDSL.g:11823:2: rule__XAssignment__Group_0__3__Impl
+            // InternalDataDSL.g:12908:1: ( rule__XAssignment__Group_0__3__Impl )
+            // InternalDataDSL.g:12909:2: rule__XAssignment__Group_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_0__3__Impl();
@@ -39937,23 +43558,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_0__3__Impl"
-    // InternalDataDSL.g:11829:1: rule__XAssignment__Group_0__3__Impl : ( ( rule__XAssignment__ValueAssignment_0_3 ) ) ;
+    // InternalDataDSL.g:12915:1: rule__XAssignment__Group_0__3__Impl : ( ( rule__XAssignment__ValueAssignment_0_3 ) ) ;
     public final void rule__XAssignment__Group_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11833:1: ( ( ( rule__XAssignment__ValueAssignment_0_3 ) ) )
-            // InternalDataDSL.g:11834:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            // InternalDataDSL.g:12919:1: ( ( ( rule__XAssignment__ValueAssignment_0_3 ) ) )
+            // InternalDataDSL.g:12920:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
             {
-            // InternalDataDSL.g:11834:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
-            // InternalDataDSL.g:11835:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            // InternalDataDSL.g:12920:1: ( ( rule__XAssignment__ValueAssignment_0_3 ) )
+            // InternalDataDSL.g:12921:2: ( rule__XAssignment__ValueAssignment_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getValueAssignment_0_3()); 
             }
-            // InternalDataDSL.g:11836:2: ( rule__XAssignment__ValueAssignment_0_3 )
-            // InternalDataDSL.g:11836:3: rule__XAssignment__ValueAssignment_0_3
+            // InternalDataDSL.g:12922:2: ( rule__XAssignment__ValueAssignment_0_3 )
+            // InternalDataDSL.g:12922:3: rule__XAssignment__ValueAssignment_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__ValueAssignment_0_3();
@@ -39988,16 +43609,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__0"
-    // InternalDataDSL.g:11845:1: rule__XAssignment__Group_1__0 : rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 ;
+    // InternalDataDSL.g:12931:1: rule__XAssignment__Group_1__0 : rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 ;
     public final void rule__XAssignment__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11849:1: ( rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 )
-            // InternalDataDSL.g:11850:2: rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1
+            // InternalDataDSL.g:12935:1: ( rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1 )
+            // InternalDataDSL.g:12936:2: rule__XAssignment__Group_1__0__Impl rule__XAssignment__Group_1__1
             {
-            pushFollow(FOLLOW_90);
+            pushFollow(FOLLOW_98);
             rule__XAssignment__Group_1__0__Impl();
 
             state._fsp--;
@@ -40026,17 +43647,17 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__0__Impl"
-    // InternalDataDSL.g:11857:1: rule__XAssignment__Group_1__0__Impl : ( ruleXOrExpression ) ;
+    // InternalDataDSL.g:12943:1: rule__XAssignment__Group_1__0__Impl : ( ruleXOrExpression ) ;
     public final void rule__XAssignment__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11861:1: ( ( ruleXOrExpression ) )
-            // InternalDataDSL.g:11862:1: ( ruleXOrExpression )
+            // InternalDataDSL.g:12947:1: ( ( ruleXOrExpression ) )
+            // InternalDataDSL.g:12948:1: ( ruleXOrExpression )
             {
-            // InternalDataDSL.g:11862:1: ( ruleXOrExpression )
-            // InternalDataDSL.g:11863:2: ruleXOrExpression
+            // InternalDataDSL.g:12948:1: ( ruleXOrExpression )
+            // InternalDataDSL.g:12949:2: ruleXOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0()); 
@@ -40071,14 +43692,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__1"
-    // InternalDataDSL.g:11872:1: rule__XAssignment__Group_1__1 : rule__XAssignment__Group_1__1__Impl ;
+    // InternalDataDSL.g:12958:1: rule__XAssignment__Group_1__1 : rule__XAssignment__Group_1__1__Impl ;
     public final void rule__XAssignment__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11876:1: ( rule__XAssignment__Group_1__1__Impl )
-            // InternalDataDSL.g:11877:2: rule__XAssignment__Group_1__1__Impl
+            // InternalDataDSL.g:12962:1: ( rule__XAssignment__Group_1__1__Impl )
+            // InternalDataDSL.g:12963:2: rule__XAssignment__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1__1__Impl();
@@ -40104,27 +43725,27 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1__1__Impl"
-    // InternalDataDSL.g:11883:1: rule__XAssignment__Group_1__1__Impl : ( ( rule__XAssignment__Group_1_1__0 )? ) ;
+    // InternalDataDSL.g:12969:1: rule__XAssignment__Group_1__1__Impl : ( ( rule__XAssignment__Group_1_1__0 )? ) ;
     public final void rule__XAssignment__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11887:1: ( ( ( rule__XAssignment__Group_1_1__0 )? ) )
-            // InternalDataDSL.g:11888:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            // InternalDataDSL.g:12973:1: ( ( ( rule__XAssignment__Group_1_1__0 )? ) )
+            // InternalDataDSL.g:12974:1: ( ( rule__XAssignment__Group_1_1__0 )? )
             {
-            // InternalDataDSL.g:11888:1: ( ( rule__XAssignment__Group_1_1__0 )? )
-            // InternalDataDSL.g:11889:2: ( rule__XAssignment__Group_1_1__0 )?
+            // InternalDataDSL.g:12974:1: ( ( rule__XAssignment__Group_1_1__0 )? )
+            // InternalDataDSL.g:12975:2: ( rule__XAssignment__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1()); 
             }
-            // InternalDataDSL.g:11890:2: ( rule__XAssignment__Group_1_1__0 )?
-            int alt110=2;
-            alt110 = dfa110.predict(input);
-            switch (alt110) {
+            // InternalDataDSL.g:12976:2: ( rule__XAssignment__Group_1_1__0 )?
+            int alt115=2;
+            alt115 = dfa115.predict(input);
+            switch (alt115) {
                 case 1 :
-                    // InternalDataDSL.g:11890:3: rule__XAssignment__Group_1_1__0
+                    // InternalDataDSL.g:12976:3: rule__XAssignment__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XAssignment__Group_1_1__0();
@@ -40162,16 +43783,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__0"
-    // InternalDataDSL.g:11899:1: rule__XAssignment__Group_1_1__0 : rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 ;
+    // InternalDataDSL.g:12985:1: rule__XAssignment__Group_1_1__0 : rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 ;
     public final void rule__XAssignment__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11903:1: ( rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 )
-            // InternalDataDSL.g:11904:2: rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1
+            // InternalDataDSL.g:12989:1: ( rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1 )
+            // InternalDataDSL.g:12990:2: rule__XAssignment__Group_1_1__0__Impl rule__XAssignment__Group_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAssignment__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -40200,23 +43821,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__0__Impl"
-    // InternalDataDSL.g:11911:1: rule__XAssignment__Group_1_1__0__Impl : ( ( rule__XAssignment__Group_1_1_0__0 ) ) ;
+    // InternalDataDSL.g:12997:1: rule__XAssignment__Group_1_1__0__Impl : ( ( rule__XAssignment__Group_1_1_0__0 ) ) ;
     public final void rule__XAssignment__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11915:1: ( ( ( rule__XAssignment__Group_1_1_0__0 ) ) )
-            // InternalDataDSL.g:11916:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:13001:1: ( ( ( rule__XAssignment__Group_1_1_0__0 ) ) )
+            // InternalDataDSL.g:13002:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
             {
-            // InternalDataDSL.g:11916:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
-            // InternalDataDSL.g:11917:2: ( rule__XAssignment__Group_1_1_0__0 )
+            // InternalDataDSL.g:13002:1: ( ( rule__XAssignment__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:13003:2: ( rule__XAssignment__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0()); 
             }
-            // InternalDataDSL.g:11918:2: ( rule__XAssignment__Group_1_1_0__0 )
-            // InternalDataDSL.g:11918:3: rule__XAssignment__Group_1_1_0__0
+            // InternalDataDSL.g:13004:2: ( rule__XAssignment__Group_1_1_0__0 )
+            // InternalDataDSL.g:13004:3: rule__XAssignment__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0__0();
@@ -40251,14 +43872,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__1"
-    // InternalDataDSL.g:11926:1: rule__XAssignment__Group_1_1__1 : rule__XAssignment__Group_1_1__1__Impl ;
+    // InternalDataDSL.g:13012:1: rule__XAssignment__Group_1_1__1 : rule__XAssignment__Group_1_1__1__Impl ;
     public final void rule__XAssignment__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11930:1: ( rule__XAssignment__Group_1_1__1__Impl )
-            // InternalDataDSL.g:11931:2: rule__XAssignment__Group_1_1__1__Impl
+            // InternalDataDSL.g:13016:1: ( rule__XAssignment__Group_1_1__1__Impl )
+            // InternalDataDSL.g:13017:2: rule__XAssignment__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1__1__Impl();
@@ -40284,23 +43905,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1__1__Impl"
-    // InternalDataDSL.g:11937:1: rule__XAssignment__Group_1_1__1__Impl : ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) ;
+    // InternalDataDSL.g:13023:1: rule__XAssignment__Group_1_1__1__Impl : ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) ;
     public final void rule__XAssignment__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11941:1: ( ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) )
-            // InternalDataDSL.g:11942:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            // InternalDataDSL.g:13027:1: ( ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) ) )
+            // InternalDataDSL.g:13028:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
             {
-            // InternalDataDSL.g:11942:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
-            // InternalDataDSL.g:11943:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            // InternalDataDSL.g:13028:1: ( ( rule__XAssignment__RightOperandAssignment_1_1_1 ) )
+            // InternalDataDSL.g:13029:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getRightOperandAssignment_1_1_1()); 
             }
-            // InternalDataDSL.g:11944:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
-            // InternalDataDSL.g:11944:3: rule__XAssignment__RightOperandAssignment_1_1_1
+            // InternalDataDSL.g:13030:2: ( rule__XAssignment__RightOperandAssignment_1_1_1 )
+            // InternalDataDSL.g:13030:3: rule__XAssignment__RightOperandAssignment_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__RightOperandAssignment_1_1_1();
@@ -40335,14 +43956,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0__0"
-    // InternalDataDSL.g:11953:1: rule__XAssignment__Group_1_1_0__0 : rule__XAssignment__Group_1_1_0__0__Impl ;
+    // InternalDataDSL.g:13039:1: rule__XAssignment__Group_1_1_0__0 : rule__XAssignment__Group_1_1_0__0__Impl ;
     public final void rule__XAssignment__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11957:1: ( rule__XAssignment__Group_1_1_0__0__Impl )
-            // InternalDataDSL.g:11958:2: rule__XAssignment__Group_1_1_0__0__Impl
+            // InternalDataDSL.g:13043:1: ( rule__XAssignment__Group_1_1_0__0__Impl )
+            // InternalDataDSL.g:13044:2: rule__XAssignment__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0__0__Impl();
@@ -40368,23 +43989,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0__0__Impl"
-    // InternalDataDSL.g:11964:1: rule__XAssignment__Group_1_1_0__0__Impl : ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:13050:1: rule__XAssignment__Group_1_1_0__0__Impl : ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) ;
     public final void rule__XAssignment__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11968:1: ( ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) )
-            // InternalDataDSL.g:11969:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:13054:1: ( ( ( rule__XAssignment__Group_1_1_0_0__0 ) ) )
+            // InternalDataDSL.g:13055:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:11969:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
-            // InternalDataDSL.g:11970:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:13055:1: ( ( rule__XAssignment__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:13056:2: ( rule__XAssignment__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getGroup_1_1_0_0()); 
             }
-            // InternalDataDSL.g:11971:2: ( rule__XAssignment__Group_1_1_0_0__0 )
-            // InternalDataDSL.g:11971:3: rule__XAssignment__Group_1_1_0_0__0
+            // InternalDataDSL.g:13057:2: ( rule__XAssignment__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:13057:3: rule__XAssignment__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0_0__0();
@@ -40419,16 +44040,16 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0"
-    // InternalDataDSL.g:11980:1: rule__XAssignment__Group_1_1_0_0__0 : rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 ;
+    // InternalDataDSL.g:13066:1: rule__XAssignment__Group_1_1_0_0__0 : rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 ;
     public final void rule__XAssignment__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11984:1: ( rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 )
-            // InternalDataDSL.g:11985:2: rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1
+            // InternalDataDSL.g:13070:1: ( rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1 )
+            // InternalDataDSL.g:13071:2: rule__XAssignment__Group_1_1_0_0__0__Impl rule__XAssignment__Group_1_1_0_0__1
             {
-            pushFollow(FOLLOW_90);
+            pushFollow(FOLLOW_98);
             rule__XAssignment__Group_1_1_0_0__0__Impl();
 
             state._fsp--;
@@ -40457,23 +44078,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__0__Impl"
-    // InternalDataDSL.g:11992:1: rule__XAssignment__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:13078:1: rule__XAssignment__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAssignment__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:11996:1: ( ( () ) )
-            // InternalDataDSL.g:11997:1: ( () )
+            // InternalDataDSL.g:13082:1: ( ( () ) )
+            // InternalDataDSL.g:13083:1: ( () )
             {
-            // InternalDataDSL.g:11997:1: ( () )
-            // InternalDataDSL.g:11998:2: ()
+            // InternalDataDSL.g:13083:1: ( () )
+            // InternalDataDSL.g:13084:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
             }
-            // InternalDataDSL.g:11999:2: ()
-            // InternalDataDSL.g:11999:3: 
+            // InternalDataDSL.g:13085:2: ()
+            // InternalDataDSL.g:13085:3: 
             {
             }
 
@@ -40498,14 +44119,14 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1"
-    // InternalDataDSL.g:12007:1: rule__XAssignment__Group_1_1_0_0__1 : rule__XAssignment__Group_1_1_0_0__1__Impl ;
+    // InternalDataDSL.g:13093:1: rule__XAssignment__Group_1_1_0_0__1 : rule__XAssignment__Group_1_1_0_0__1__Impl ;
     public final void rule__XAssignment__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12011:1: ( rule__XAssignment__Group_1_1_0_0__1__Impl )
-            // InternalDataDSL.g:12012:2: rule__XAssignment__Group_1_1_0_0__1__Impl
+            // InternalDataDSL.g:13097:1: ( rule__XAssignment__Group_1_1_0_0__1__Impl )
+            // InternalDataDSL.g:13098:2: rule__XAssignment__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__Group_1_1_0_0__1__Impl();
@@ -40531,23 +44152,23 @@
 
 
     // $ANTLR start "rule__XAssignment__Group_1_1_0_0__1__Impl"
-    // InternalDataDSL.g:12018:1: rule__XAssignment__Group_1_1_0_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:13104:1: rule__XAssignment__Group_1_1_0_0__1__Impl : ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) ;
     public final void rule__XAssignment__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12022:1: ( ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) )
-            // InternalDataDSL.g:12023:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalDataDSL.g:13108:1: ( ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalDataDSL.g:13109:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:12023:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
-            // InternalDataDSL.g:12024:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            // InternalDataDSL.g:13109:1: ( ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalDataDSL.g:13110:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureAssignment_1_1_0_0_1()); 
             }
-            // InternalDataDSL.g:12025:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
-            // InternalDataDSL.g:12025:3: rule__XAssignment__FeatureAssignment_1_1_0_0_1
+            // InternalDataDSL.g:13111:2: ( rule__XAssignment__FeatureAssignment_1_1_0_0_1 )
+            // InternalDataDSL.g:13111:3: rule__XAssignment__FeatureAssignment_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAssignment__FeatureAssignment_1_1_0_0_1();
@@ -40582,16 +44203,16 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__0"
-    // InternalDataDSL.g:12034:1: rule__OpMultiAssign__Group_5__0 : rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 ;
+    // InternalDataDSL.g:13120:1: rule__OpMultiAssign__Group_5__0 : rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 ;
     public final void rule__OpMultiAssign__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12038:1: ( rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 )
-            // InternalDataDSL.g:12039:2: rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1
+            // InternalDataDSL.g:13124:1: ( rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1 )
+            // InternalDataDSL.g:13125:2: rule__OpMultiAssign__Group_5__0__Impl rule__OpMultiAssign__Group_5__1
             {
-            pushFollow(FOLLOW_91);
+            pushFollow(FOLLOW_99);
             rule__OpMultiAssign__Group_5__0__Impl();
 
             state._fsp--;
@@ -40620,17 +44241,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__0__Impl"
-    // InternalDataDSL.g:12046:1: rule__OpMultiAssign__Group_5__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:13132:1: rule__OpMultiAssign__Group_5__0__Impl : ( '<' ) ;
     public final void rule__OpMultiAssign__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12050:1: ( ( '<' ) )
-            // InternalDataDSL.g:12051:1: ( '<' )
+            // InternalDataDSL.g:13136:1: ( ( '<' ) )
+            // InternalDataDSL.g:13137:1: ( '<' )
             {
-            // InternalDataDSL.g:12051:1: ( '<' )
-            // InternalDataDSL.g:12052:2: '<'
+            // InternalDataDSL.g:13137:1: ( '<' )
+            // InternalDataDSL.g:13138:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0()); 
@@ -40661,16 +44282,16 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__1"
-    // InternalDataDSL.g:12061:1: rule__OpMultiAssign__Group_5__1 : rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 ;
+    // InternalDataDSL.g:13147:1: rule__OpMultiAssign__Group_5__1 : rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 ;
     public final void rule__OpMultiAssign__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12065:1: ( rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 )
-            // InternalDataDSL.g:12066:2: rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2
+            // InternalDataDSL.g:13151:1: ( rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2 )
+            // InternalDataDSL.g:13152:2: rule__OpMultiAssign__Group_5__1__Impl rule__OpMultiAssign__Group_5__2
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__OpMultiAssign__Group_5__1__Impl();
 
             state._fsp--;
@@ -40699,17 +44320,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__1__Impl"
-    // InternalDataDSL.g:12073:1: rule__OpMultiAssign__Group_5__1__Impl : ( '<' ) ;
+    // InternalDataDSL.g:13159:1: rule__OpMultiAssign__Group_5__1__Impl : ( '<' ) ;
     public final void rule__OpMultiAssign__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12077:1: ( ( '<' ) )
-            // InternalDataDSL.g:12078:1: ( '<' )
+            // InternalDataDSL.g:13163:1: ( ( '<' ) )
+            // InternalDataDSL.g:13164:1: ( '<' )
             {
-            // InternalDataDSL.g:12078:1: ( '<' )
-            // InternalDataDSL.g:12079:2: '<'
+            // InternalDataDSL.g:13164:1: ( '<' )
+            // InternalDataDSL.g:13165:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1()); 
@@ -40740,14 +44361,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__2"
-    // InternalDataDSL.g:12088:1: rule__OpMultiAssign__Group_5__2 : rule__OpMultiAssign__Group_5__2__Impl ;
+    // InternalDataDSL.g:13174:1: rule__OpMultiAssign__Group_5__2 : rule__OpMultiAssign__Group_5__2__Impl ;
     public final void rule__OpMultiAssign__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12092:1: ( rule__OpMultiAssign__Group_5__2__Impl )
-            // InternalDataDSL.g:12093:2: rule__OpMultiAssign__Group_5__2__Impl
+            // InternalDataDSL.g:13178:1: ( rule__OpMultiAssign__Group_5__2__Impl )
+            // InternalDataDSL.g:13179:2: rule__OpMultiAssign__Group_5__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Group_5__2__Impl();
@@ -40773,17 +44394,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_5__2__Impl"
-    // InternalDataDSL.g:12099:1: rule__OpMultiAssign__Group_5__2__Impl : ( '=' ) ;
+    // InternalDataDSL.g:13185:1: rule__OpMultiAssign__Group_5__2__Impl : ( '=' ) ;
     public final void rule__OpMultiAssign__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12103:1: ( ( '=' ) )
-            // InternalDataDSL.g:12104:1: ( '=' )
+            // InternalDataDSL.g:13189:1: ( ( '=' ) )
+            // InternalDataDSL.g:13190:1: ( '=' )
             {
-            // InternalDataDSL.g:12104:1: ( '=' )
-            // InternalDataDSL.g:12105:2: '='
+            // InternalDataDSL.g:13190:1: ( '=' )
+            // InternalDataDSL.g:13191:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getEqualsSignKeyword_5_2()); 
@@ -40814,16 +44435,16 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__0"
-    // InternalDataDSL.g:12115:1: rule__OpMultiAssign__Group_6__0 : rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 ;
+    // InternalDataDSL.g:13201:1: rule__OpMultiAssign__Group_6__0 : rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 ;
     public final void rule__OpMultiAssign__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12119:1: ( rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 )
-            // InternalDataDSL.g:12120:2: rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1
+            // InternalDataDSL.g:13205:1: ( rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1 )
+            // InternalDataDSL.g:13206:2: rule__OpMultiAssign__Group_6__0__Impl rule__OpMultiAssign__Group_6__1
             {
-            pushFollow(FOLLOW_92);
+            pushFollow(FOLLOW_100);
             rule__OpMultiAssign__Group_6__0__Impl();
 
             state._fsp--;
@@ -40852,17 +44473,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__0__Impl"
-    // InternalDataDSL.g:12127:1: rule__OpMultiAssign__Group_6__0__Impl : ( '>' ) ;
+    // InternalDataDSL.g:13213:1: rule__OpMultiAssign__Group_6__0__Impl : ( '>' ) ;
     public final void rule__OpMultiAssign__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12131:1: ( ( '>' ) )
-            // InternalDataDSL.g:12132:1: ( '>' )
+            // InternalDataDSL.g:13217:1: ( ( '>' ) )
+            // InternalDataDSL.g:13218:1: ( '>' )
             {
-            // InternalDataDSL.g:12132:1: ( '>' )
-            // InternalDataDSL.g:12133:2: '>'
+            // InternalDataDSL.g:13218:1: ( '>' )
+            // InternalDataDSL.g:13219:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0()); 
@@ -40893,16 +44514,16 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__1"
-    // InternalDataDSL.g:12142:1: rule__OpMultiAssign__Group_6__1 : rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 ;
+    // InternalDataDSL.g:13228:1: rule__OpMultiAssign__Group_6__1 : rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 ;
     public final void rule__OpMultiAssign__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12146:1: ( rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 )
-            // InternalDataDSL.g:12147:2: rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2
+            // InternalDataDSL.g:13232:1: ( rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2 )
+            // InternalDataDSL.g:13233:2: rule__OpMultiAssign__Group_6__1__Impl rule__OpMultiAssign__Group_6__2
             {
-            pushFollow(FOLLOW_92);
+            pushFollow(FOLLOW_100);
             rule__OpMultiAssign__Group_6__1__Impl();
 
             state._fsp--;
@@ -40931,31 +44552,31 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__1__Impl"
-    // InternalDataDSL.g:12154:1: rule__OpMultiAssign__Group_6__1__Impl : ( ( '>' )? ) ;
+    // InternalDataDSL.g:13240:1: rule__OpMultiAssign__Group_6__1__Impl : ( ( '>' )? ) ;
     public final void rule__OpMultiAssign__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12158:1: ( ( ( '>' )? ) )
-            // InternalDataDSL.g:12159:1: ( ( '>' )? )
+            // InternalDataDSL.g:13244:1: ( ( ( '>' )? ) )
+            // InternalDataDSL.g:13245:1: ( ( '>' )? )
             {
-            // InternalDataDSL.g:12159:1: ( ( '>' )? )
-            // InternalDataDSL.g:12160:2: ( '>' )?
+            // InternalDataDSL.g:13245:1: ( ( '>' )? )
+            // InternalDataDSL.g:13246:2: ( '>' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_1()); 
             }
-            // InternalDataDSL.g:12161:2: ( '>' )?
-            int alt111=2;
-            int LA111_0 = input.LA(1);
+            // InternalDataDSL.g:13247:2: ( '>' )?
+            int alt116=2;
+            int LA116_0 = input.LA(1);
 
-            if ( (LA111_0==26) ) {
-                alt111=1;
+            if ( (LA116_0==26) ) {
+                alt116=1;
             }
-            switch (alt111) {
+            switch (alt116) {
                 case 1 :
-                    // InternalDataDSL.g:12161:3: '>'
+                    // InternalDataDSL.g:13247:3: '>'
                     {
                     match(input,26,FOLLOW_2); if (state.failed) return ;
 
@@ -40989,14 +44610,14 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__2"
-    // InternalDataDSL.g:12169:1: rule__OpMultiAssign__Group_6__2 : rule__OpMultiAssign__Group_6__2__Impl ;
+    // InternalDataDSL.g:13255:1: rule__OpMultiAssign__Group_6__2 : rule__OpMultiAssign__Group_6__2__Impl ;
     public final void rule__OpMultiAssign__Group_6__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12173:1: ( rule__OpMultiAssign__Group_6__2__Impl )
-            // InternalDataDSL.g:12174:2: rule__OpMultiAssign__Group_6__2__Impl
+            // InternalDataDSL.g:13259:1: ( rule__OpMultiAssign__Group_6__2__Impl )
+            // InternalDataDSL.g:13260:2: rule__OpMultiAssign__Group_6__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpMultiAssign__Group_6__2__Impl();
@@ -41022,17 +44643,17 @@
 
 
     // $ANTLR start "rule__OpMultiAssign__Group_6__2__Impl"
-    // InternalDataDSL.g:12180:1: rule__OpMultiAssign__Group_6__2__Impl : ( '>=' ) ;
+    // InternalDataDSL.g:13266:1: rule__OpMultiAssign__Group_6__2__Impl : ( '>=' ) ;
     public final void rule__OpMultiAssign__Group_6__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12184:1: ( ( '>=' ) )
-            // InternalDataDSL.g:12185:1: ( '>=' )
+            // InternalDataDSL.g:13270:1: ( ( '>=' ) )
+            // InternalDataDSL.g:13271:1: ( '>=' )
             {
-            // InternalDataDSL.g:12185:1: ( '>=' )
-            // InternalDataDSL.g:12186:2: '>='
+            // InternalDataDSL.g:13271:1: ( '>=' )
+            // InternalDataDSL.g:13272:2: '>='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpMultiAssignAccess().getGreaterThanSignEqualsSignKeyword_6_2()); 
@@ -41063,16 +44684,16 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__0"
-    // InternalDataDSL.g:12196:1: rule__XOrExpression__Group__0 : rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 ;
+    // InternalDataDSL.g:13282:1: rule__XOrExpression__Group__0 : rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 ;
     public final void rule__XOrExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12200:1: ( rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 )
-            // InternalDataDSL.g:12201:2: rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1
+            // InternalDataDSL.g:13286:1: ( rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1 )
+            // InternalDataDSL.g:13287:2: rule__XOrExpression__Group__0__Impl rule__XOrExpression__Group__1
             {
-            pushFollow(FOLLOW_93);
+            pushFollow(FOLLOW_101);
             rule__XOrExpression__Group__0__Impl();
 
             state._fsp--;
@@ -41101,17 +44722,17 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__0__Impl"
-    // InternalDataDSL.g:12208:1: rule__XOrExpression__Group__0__Impl : ( ruleXAndExpression ) ;
+    // InternalDataDSL.g:13294:1: rule__XOrExpression__Group__0__Impl : ( ruleXAndExpression ) ;
     public final void rule__XOrExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12212:1: ( ( ruleXAndExpression ) )
-            // InternalDataDSL.g:12213:1: ( ruleXAndExpression )
+            // InternalDataDSL.g:13298:1: ( ( ruleXAndExpression ) )
+            // InternalDataDSL.g:13299:1: ( ruleXAndExpression )
             {
-            // InternalDataDSL.g:12213:1: ( ruleXAndExpression )
-            // InternalDataDSL.g:12214:2: ruleXAndExpression
+            // InternalDataDSL.g:13299:1: ( ruleXAndExpression )
+            // InternalDataDSL.g:13300:2: ruleXAndExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0()); 
@@ -41146,14 +44767,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__1"
-    // InternalDataDSL.g:12223:1: rule__XOrExpression__Group__1 : rule__XOrExpression__Group__1__Impl ;
+    // InternalDataDSL.g:13309:1: rule__XOrExpression__Group__1 : rule__XOrExpression__Group__1__Impl ;
     public final void rule__XOrExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12227:1: ( rule__XOrExpression__Group__1__Impl )
-            // InternalDataDSL.g:12228:2: rule__XOrExpression__Group__1__Impl
+            // InternalDataDSL.g:13313:1: ( rule__XOrExpression__Group__1__Impl )
+            // InternalDataDSL.g:13314:2: rule__XOrExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group__1__Impl();
@@ -41179,43 +44800,43 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group__1__Impl"
-    // InternalDataDSL.g:12234:1: rule__XOrExpression__Group__1__Impl : ( ( rule__XOrExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:13320:1: rule__XOrExpression__Group__1__Impl : ( ( rule__XOrExpression__Group_1__0 )* ) ;
     public final void rule__XOrExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12238:1: ( ( ( rule__XOrExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:12239:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13324:1: ( ( ( rule__XOrExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:13325:1: ( ( rule__XOrExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:12239:1: ( ( rule__XOrExpression__Group_1__0 )* )
-            // InternalDataDSL.g:12240:2: ( rule__XOrExpression__Group_1__0 )*
+            // InternalDataDSL.g:13325:1: ( ( rule__XOrExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13326:2: ( rule__XOrExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:12241:2: ( rule__XOrExpression__Group_1__0 )*
-            loop112:
+            // InternalDataDSL.g:13327:2: ( rule__XOrExpression__Group_1__0 )*
+            loop117:
             do {
-                int alt112=2;
-                int LA112_0 = input.LA(1);
+                int alt117=2;
+                int LA117_0 = input.LA(1);
 
-                if ( (LA112_0==14) ) {
-                    int LA112_2 = input.LA(2);
+                if ( (LA117_0==14) ) {
+                    int LA117_2 = input.LA(2);
 
-                    if ( (synpred172_InternalDataDSL()) ) {
-                        alt112=1;
+                    if ( (synpred183_InternalDataDSL()) ) {
+                        alt117=1;
                     }
 
 
                 }
 
 
-                switch (alt112) {
+                switch (alt117) {
             	case 1 :
-            	    // InternalDataDSL.g:12241:3: rule__XOrExpression__Group_1__0
+            	    // InternalDataDSL.g:13327:3: rule__XOrExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_94);
+            	    pushFollow(FOLLOW_102);
             	    rule__XOrExpression__Group_1__0();
 
             	    state._fsp--;
@@ -41225,7 +44846,7 @@
             	    break;
 
             	default :
-            	    break loop112;
+            	    break loop117;
                 }
             } while (true);
 
@@ -41254,16 +44875,16 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__0"
-    // InternalDataDSL.g:12250:1: rule__XOrExpression__Group_1__0 : rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 ;
+    // InternalDataDSL.g:13336:1: rule__XOrExpression__Group_1__0 : rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 ;
     public final void rule__XOrExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12254:1: ( rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 )
-            // InternalDataDSL.g:12255:2: rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1
+            // InternalDataDSL.g:13340:1: ( rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1 )
+            // InternalDataDSL.g:13341:2: rule__XOrExpression__Group_1__0__Impl rule__XOrExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XOrExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -41292,23 +44913,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:12262:1: rule__XOrExpression__Group_1__0__Impl : ( ( rule__XOrExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:13348:1: rule__XOrExpression__Group_1__0__Impl : ( ( rule__XOrExpression__Group_1_0__0 ) ) ;
     public final void rule__XOrExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12266:1: ( ( ( rule__XOrExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:12267:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13352:1: ( ( ( rule__XOrExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:13353:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:12267:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:12268:2: ( rule__XOrExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13353:1: ( ( rule__XOrExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13354:2: ( rule__XOrExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:12269:2: ( rule__XOrExpression__Group_1_0__0 )
-            // InternalDataDSL.g:12269:3: rule__XOrExpression__Group_1_0__0
+            // InternalDataDSL.g:13355:2: ( rule__XOrExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13355:3: rule__XOrExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0__0();
@@ -41343,14 +44964,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__1"
-    // InternalDataDSL.g:12277:1: rule__XOrExpression__Group_1__1 : rule__XOrExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:13363:1: rule__XOrExpression__Group_1__1 : rule__XOrExpression__Group_1__1__Impl ;
     public final void rule__XOrExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12281:1: ( rule__XOrExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:12282:2: rule__XOrExpression__Group_1__1__Impl
+            // InternalDataDSL.g:13367:1: ( rule__XOrExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:13368:2: rule__XOrExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1__1__Impl();
@@ -41376,23 +44997,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:12288:1: rule__XOrExpression__Group_1__1__Impl : ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:13374:1: rule__XOrExpression__Group_1__1__Impl : ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XOrExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12292:1: ( ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:12293:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13378:1: ( ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:13379:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:12293:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:12294:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13379:1: ( ( rule__XOrExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13380:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:12295:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:12295:3: rule__XOrExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:13381:2: ( rule__XOrExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13381:3: rule__XOrExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__RightOperandAssignment_1_1();
@@ -41427,14 +45048,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0__0"
-    // InternalDataDSL.g:12304:1: rule__XOrExpression__Group_1_0__0 : rule__XOrExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:13390:1: rule__XOrExpression__Group_1_0__0 : rule__XOrExpression__Group_1_0__0__Impl ;
     public final void rule__XOrExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12308:1: ( rule__XOrExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:12309:2: rule__XOrExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:13394:1: ( rule__XOrExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:13395:2: rule__XOrExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0__0__Impl();
@@ -41460,23 +45081,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:12315:1: rule__XOrExpression__Group_1_0__0__Impl : ( ( rule__XOrExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:13401:1: rule__XOrExpression__Group_1_0__0__Impl : ( ( rule__XOrExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XOrExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12319:1: ( ( ( rule__XOrExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:12320:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13405:1: ( ( ( rule__XOrExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:13406:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:12320:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:12321:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13406:1: ( ( rule__XOrExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13407:2: ( rule__XOrExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:12322:2: ( rule__XOrExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:12322:3: rule__XOrExpression__Group_1_0_0__0
+            // InternalDataDSL.g:13408:2: ( rule__XOrExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13408:3: rule__XOrExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0_0__0();
@@ -41511,16 +45132,16 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:12331:1: rule__XOrExpression__Group_1_0_0__0 : rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:13417:1: rule__XOrExpression__Group_1_0_0__0 : rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 ;
     public final void rule__XOrExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12335:1: ( rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:12336:2: rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1
+            // InternalDataDSL.g:13421:1: ( rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:13422:2: rule__XOrExpression__Group_1_0_0__0__Impl rule__XOrExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_93);
+            pushFollow(FOLLOW_101);
             rule__XOrExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -41549,23 +45170,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:12343:1: rule__XOrExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:13429:1: rule__XOrExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XOrExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12347:1: ( ( () ) )
-            // InternalDataDSL.g:12348:1: ( () )
+            // InternalDataDSL.g:13433:1: ( ( () ) )
+            // InternalDataDSL.g:13434:1: ( () )
             {
-            // InternalDataDSL.g:12348:1: ( () )
-            // InternalDataDSL.g:12349:2: ()
+            // InternalDataDSL.g:13434:1: ( () )
+            // InternalDataDSL.g:13435:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:12350:2: ()
-            // InternalDataDSL.g:12350:3: 
+            // InternalDataDSL.g:13436:2: ()
+            // InternalDataDSL.g:13436:3: 
             {
             }
 
@@ -41590,14 +45211,14 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:12358:1: rule__XOrExpression__Group_1_0_0__1 : rule__XOrExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:13444:1: rule__XOrExpression__Group_1_0_0__1 : rule__XOrExpression__Group_1_0_0__1__Impl ;
     public final void rule__XOrExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12362:1: ( rule__XOrExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:12363:2: rule__XOrExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:13448:1: ( rule__XOrExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:13449:2: rule__XOrExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__Group_1_0_0__1__Impl();
@@ -41623,23 +45244,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:12369:1: rule__XOrExpression__Group_1_0_0__1__Impl : ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:13455:1: rule__XOrExpression__Group_1_0_0__1__Impl : ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XOrExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12373:1: ( ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:12374:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13459:1: ( ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:13460:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:12374:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:12375:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13460:1: ( ( rule__XOrExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13461:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:12376:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:12376:3: rule__XOrExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:13462:2: ( rule__XOrExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13462:3: rule__XOrExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XOrExpression__FeatureAssignment_1_0_0_1();
@@ -41674,16 +45295,16 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__0"
-    // InternalDataDSL.g:12385:1: rule__XAndExpression__Group__0 : rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 ;
+    // InternalDataDSL.g:13471:1: rule__XAndExpression__Group__0 : rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 ;
     public final void rule__XAndExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12389:1: ( rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 )
-            // InternalDataDSL.g:12390:2: rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1
+            // InternalDataDSL.g:13475:1: ( rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1 )
+            // InternalDataDSL.g:13476:2: rule__XAndExpression__Group__0__Impl rule__XAndExpression__Group__1
             {
-            pushFollow(FOLLOW_95);
+            pushFollow(FOLLOW_103);
             rule__XAndExpression__Group__0__Impl();
 
             state._fsp--;
@@ -41712,17 +45333,17 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__0__Impl"
-    // InternalDataDSL.g:12397:1: rule__XAndExpression__Group__0__Impl : ( ruleXEqualityExpression ) ;
+    // InternalDataDSL.g:13483:1: rule__XAndExpression__Group__0__Impl : ( ruleXEqualityExpression ) ;
     public final void rule__XAndExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12401:1: ( ( ruleXEqualityExpression ) )
-            // InternalDataDSL.g:12402:1: ( ruleXEqualityExpression )
+            // InternalDataDSL.g:13487:1: ( ( ruleXEqualityExpression ) )
+            // InternalDataDSL.g:13488:1: ( ruleXEqualityExpression )
             {
-            // InternalDataDSL.g:12402:1: ( ruleXEqualityExpression )
-            // InternalDataDSL.g:12403:2: ruleXEqualityExpression
+            // InternalDataDSL.g:13488:1: ( ruleXEqualityExpression )
+            // InternalDataDSL.g:13489:2: ruleXEqualityExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0()); 
@@ -41757,14 +45378,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__1"
-    // InternalDataDSL.g:12412:1: rule__XAndExpression__Group__1 : rule__XAndExpression__Group__1__Impl ;
+    // InternalDataDSL.g:13498:1: rule__XAndExpression__Group__1 : rule__XAndExpression__Group__1__Impl ;
     public final void rule__XAndExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12416:1: ( rule__XAndExpression__Group__1__Impl )
-            // InternalDataDSL.g:12417:2: rule__XAndExpression__Group__1__Impl
+            // InternalDataDSL.g:13502:1: ( rule__XAndExpression__Group__1__Impl )
+            // InternalDataDSL.g:13503:2: rule__XAndExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group__1__Impl();
@@ -41790,43 +45411,43 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group__1__Impl"
-    // InternalDataDSL.g:12423:1: rule__XAndExpression__Group__1__Impl : ( ( rule__XAndExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:13509:1: rule__XAndExpression__Group__1__Impl : ( ( rule__XAndExpression__Group_1__0 )* ) ;
     public final void rule__XAndExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12427:1: ( ( ( rule__XAndExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:12428:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13513:1: ( ( ( rule__XAndExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:13514:1: ( ( rule__XAndExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:12428:1: ( ( rule__XAndExpression__Group_1__0 )* )
-            // InternalDataDSL.g:12429:2: ( rule__XAndExpression__Group_1__0 )*
+            // InternalDataDSL.g:13514:1: ( ( rule__XAndExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13515:2: ( rule__XAndExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:12430:2: ( rule__XAndExpression__Group_1__0 )*
-            loop113:
+            // InternalDataDSL.g:13516:2: ( rule__XAndExpression__Group_1__0 )*
+            loop118:
             do {
-                int alt113=2;
-                int LA113_0 = input.LA(1);
+                int alt118=2;
+                int LA118_0 = input.LA(1);
 
-                if ( (LA113_0==15) ) {
-                    int LA113_2 = input.LA(2);
+                if ( (LA118_0==15) ) {
+                    int LA118_2 = input.LA(2);
 
-                    if ( (synpred173_InternalDataDSL()) ) {
-                        alt113=1;
+                    if ( (synpred184_InternalDataDSL()) ) {
+                        alt118=1;
                     }
 
 
                 }
 
 
-                switch (alt113) {
+                switch (alt118) {
             	case 1 :
-            	    // InternalDataDSL.g:12430:3: rule__XAndExpression__Group_1__0
+            	    // InternalDataDSL.g:13516:3: rule__XAndExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_96);
+            	    pushFollow(FOLLOW_104);
             	    rule__XAndExpression__Group_1__0();
 
             	    state._fsp--;
@@ -41836,7 +45457,7 @@
             	    break;
 
             	default :
-            	    break loop113;
+            	    break loop118;
                 }
             } while (true);
 
@@ -41865,16 +45486,16 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__0"
-    // InternalDataDSL.g:12439:1: rule__XAndExpression__Group_1__0 : rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 ;
+    // InternalDataDSL.g:13525:1: rule__XAndExpression__Group_1__0 : rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 ;
     public final void rule__XAndExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12443:1: ( rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 )
-            // InternalDataDSL.g:12444:2: rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1
+            // InternalDataDSL.g:13529:1: ( rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1 )
+            // InternalDataDSL.g:13530:2: rule__XAndExpression__Group_1__0__Impl rule__XAndExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAndExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -41903,23 +45524,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:12451:1: rule__XAndExpression__Group_1__0__Impl : ( ( rule__XAndExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:13537:1: rule__XAndExpression__Group_1__0__Impl : ( ( rule__XAndExpression__Group_1_0__0 ) ) ;
     public final void rule__XAndExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12455:1: ( ( ( rule__XAndExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:12456:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13541:1: ( ( ( rule__XAndExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:13542:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:12456:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:12457:2: ( rule__XAndExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13542:1: ( ( rule__XAndExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13543:2: ( rule__XAndExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:12458:2: ( rule__XAndExpression__Group_1_0__0 )
-            // InternalDataDSL.g:12458:3: rule__XAndExpression__Group_1_0__0
+            // InternalDataDSL.g:13544:2: ( rule__XAndExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13544:3: rule__XAndExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0__0();
@@ -41954,14 +45575,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__1"
-    // InternalDataDSL.g:12466:1: rule__XAndExpression__Group_1__1 : rule__XAndExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:13552:1: rule__XAndExpression__Group_1__1 : rule__XAndExpression__Group_1__1__Impl ;
     public final void rule__XAndExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12470:1: ( rule__XAndExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:12471:2: rule__XAndExpression__Group_1__1__Impl
+            // InternalDataDSL.g:13556:1: ( rule__XAndExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:13557:2: rule__XAndExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1__1__Impl();
@@ -41987,23 +45608,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:12477:1: rule__XAndExpression__Group_1__1__Impl : ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:13563:1: rule__XAndExpression__Group_1__1__Impl : ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XAndExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12481:1: ( ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:12482:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13567:1: ( ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:13568:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:12482:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:12483:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13568:1: ( ( rule__XAndExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13569:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:12484:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:12484:3: rule__XAndExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:13570:2: ( rule__XAndExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13570:3: rule__XAndExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__RightOperandAssignment_1_1();
@@ -42038,14 +45659,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0__0"
-    // InternalDataDSL.g:12493:1: rule__XAndExpression__Group_1_0__0 : rule__XAndExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:13579:1: rule__XAndExpression__Group_1_0__0 : rule__XAndExpression__Group_1_0__0__Impl ;
     public final void rule__XAndExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12497:1: ( rule__XAndExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:12498:2: rule__XAndExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:13583:1: ( rule__XAndExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:13584:2: rule__XAndExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0__0__Impl();
@@ -42071,23 +45692,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:12504:1: rule__XAndExpression__Group_1_0__0__Impl : ( ( rule__XAndExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:13590:1: rule__XAndExpression__Group_1_0__0__Impl : ( ( rule__XAndExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XAndExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12508:1: ( ( ( rule__XAndExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:12509:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13594:1: ( ( ( rule__XAndExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:13595:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:12509:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:12510:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13595:1: ( ( rule__XAndExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13596:2: ( rule__XAndExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:12511:2: ( rule__XAndExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:12511:3: rule__XAndExpression__Group_1_0_0__0
+            // InternalDataDSL.g:13597:2: ( rule__XAndExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13597:3: rule__XAndExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0_0__0();
@@ -42122,16 +45743,16 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:12520:1: rule__XAndExpression__Group_1_0_0__0 : rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:13606:1: rule__XAndExpression__Group_1_0_0__0 : rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 ;
     public final void rule__XAndExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12524:1: ( rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:12525:2: rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1
+            // InternalDataDSL.g:13610:1: ( rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:13611:2: rule__XAndExpression__Group_1_0_0__0__Impl rule__XAndExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_95);
+            pushFollow(FOLLOW_103);
             rule__XAndExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -42160,23 +45781,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:12532:1: rule__XAndExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:13618:1: rule__XAndExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAndExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12536:1: ( ( () ) )
-            // InternalDataDSL.g:12537:1: ( () )
+            // InternalDataDSL.g:13622:1: ( ( () ) )
+            // InternalDataDSL.g:13623:1: ( () )
             {
-            // InternalDataDSL.g:12537:1: ( () )
-            // InternalDataDSL.g:12538:2: ()
+            // InternalDataDSL.g:13623:1: ( () )
+            // InternalDataDSL.g:13624:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:12539:2: ()
-            // InternalDataDSL.g:12539:3: 
+            // InternalDataDSL.g:13625:2: ()
+            // InternalDataDSL.g:13625:3: 
             {
             }
 
@@ -42201,14 +45822,14 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:12547:1: rule__XAndExpression__Group_1_0_0__1 : rule__XAndExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:13633:1: rule__XAndExpression__Group_1_0_0__1 : rule__XAndExpression__Group_1_0_0__1__Impl ;
     public final void rule__XAndExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12551:1: ( rule__XAndExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:12552:2: rule__XAndExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:13637:1: ( rule__XAndExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:13638:2: rule__XAndExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__Group_1_0_0__1__Impl();
@@ -42234,23 +45855,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:12558:1: rule__XAndExpression__Group_1_0_0__1__Impl : ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:13644:1: rule__XAndExpression__Group_1_0_0__1__Impl : ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XAndExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12562:1: ( ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:12563:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13648:1: ( ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:13649:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:12563:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:12564:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13649:1: ( ( rule__XAndExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13650:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:12565:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:12565:3: rule__XAndExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:13651:2: ( rule__XAndExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13651:3: rule__XAndExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAndExpression__FeatureAssignment_1_0_0_1();
@@ -42285,16 +45906,16 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__0"
-    // InternalDataDSL.g:12574:1: rule__XEqualityExpression__Group__0 : rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 ;
+    // InternalDataDSL.g:13660:1: rule__XEqualityExpression__Group__0 : rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 ;
     public final void rule__XEqualityExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12578:1: ( rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 )
-            // InternalDataDSL.g:12579:2: rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1
+            // InternalDataDSL.g:13664:1: ( rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1 )
+            // InternalDataDSL.g:13665:2: rule__XEqualityExpression__Group__0__Impl rule__XEqualityExpression__Group__1
             {
-            pushFollow(FOLLOW_97);
+            pushFollow(FOLLOW_105);
             rule__XEqualityExpression__Group__0__Impl();
 
             state._fsp--;
@@ -42323,17 +45944,17 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__0__Impl"
-    // InternalDataDSL.g:12586:1: rule__XEqualityExpression__Group__0__Impl : ( ruleXRelationalExpression ) ;
+    // InternalDataDSL.g:13672:1: rule__XEqualityExpression__Group__0__Impl : ( ruleXRelationalExpression ) ;
     public final void rule__XEqualityExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12590:1: ( ( ruleXRelationalExpression ) )
-            // InternalDataDSL.g:12591:1: ( ruleXRelationalExpression )
+            // InternalDataDSL.g:13676:1: ( ( ruleXRelationalExpression ) )
+            // InternalDataDSL.g:13677:1: ( ruleXRelationalExpression )
             {
-            // InternalDataDSL.g:12591:1: ( ruleXRelationalExpression )
-            // InternalDataDSL.g:12592:2: ruleXRelationalExpression
+            // InternalDataDSL.g:13677:1: ( ruleXRelationalExpression )
+            // InternalDataDSL.g:13678:2: ruleXRelationalExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0()); 
@@ -42368,14 +45989,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__1"
-    // InternalDataDSL.g:12601:1: rule__XEqualityExpression__Group__1 : rule__XEqualityExpression__Group__1__Impl ;
+    // InternalDataDSL.g:13687:1: rule__XEqualityExpression__Group__1 : rule__XEqualityExpression__Group__1__Impl ;
     public final void rule__XEqualityExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12605:1: ( rule__XEqualityExpression__Group__1__Impl )
-            // InternalDataDSL.g:12606:2: rule__XEqualityExpression__Group__1__Impl
+            // InternalDataDSL.g:13691:1: ( rule__XEqualityExpression__Group__1__Impl )
+            // InternalDataDSL.g:13692:2: rule__XEqualityExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group__1__Impl();
@@ -42401,32 +46022,32 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group__1__Impl"
-    // InternalDataDSL.g:12612:1: rule__XEqualityExpression__Group__1__Impl : ( ( rule__XEqualityExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:13698:1: rule__XEqualityExpression__Group__1__Impl : ( ( rule__XEqualityExpression__Group_1__0 )* ) ;
     public final void rule__XEqualityExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12616:1: ( ( ( rule__XEqualityExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:12617:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13702:1: ( ( ( rule__XEqualityExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:13703:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:12617:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
-            // InternalDataDSL.g:12618:2: ( rule__XEqualityExpression__Group_1__0 )*
+            // InternalDataDSL.g:13703:1: ( ( rule__XEqualityExpression__Group_1__0 )* )
+            // InternalDataDSL.g:13704:2: ( rule__XEqualityExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:12619:2: ( rule__XEqualityExpression__Group_1__0 )*
-            loop114:
+            // InternalDataDSL.g:13705:2: ( rule__XEqualityExpression__Group_1__0 )*
+            loop119:
             do {
-                int alt114=2;
+                int alt119=2;
                 switch ( input.LA(1) ) {
                 case 21:
                     {
-                    int LA114_2 = input.LA(2);
+                    int LA119_2 = input.LA(2);
 
-                    if ( (synpred174_InternalDataDSL()) ) {
-                        alt114=1;
+                    if ( (synpred185_InternalDataDSL()) ) {
+                        alt119=1;
                     }
 
 
@@ -42434,10 +46055,10 @@
                     break;
                 case 22:
                     {
-                    int LA114_3 = input.LA(2);
+                    int LA119_3 = input.LA(2);
 
-                    if ( (synpred174_InternalDataDSL()) ) {
-                        alt114=1;
+                    if ( (synpred185_InternalDataDSL()) ) {
+                        alt119=1;
                     }
 
 
@@ -42445,10 +46066,10 @@
                     break;
                 case 23:
                     {
-                    int LA114_4 = input.LA(2);
+                    int LA119_4 = input.LA(2);
 
-                    if ( (synpred174_InternalDataDSL()) ) {
-                        alt114=1;
+                    if ( (synpred185_InternalDataDSL()) ) {
+                        alt119=1;
                     }
 
 
@@ -42456,10 +46077,10 @@
                     break;
                 case 24:
                     {
-                    int LA114_5 = input.LA(2);
+                    int LA119_5 = input.LA(2);
 
-                    if ( (synpred174_InternalDataDSL()) ) {
-                        alt114=1;
+                    if ( (synpred185_InternalDataDSL()) ) {
+                        alt119=1;
                     }
 
 
@@ -42468,11 +46089,11 @@
 
                 }
 
-                switch (alt114) {
+                switch (alt119) {
             	case 1 :
-            	    // InternalDataDSL.g:12619:3: rule__XEqualityExpression__Group_1__0
+            	    // InternalDataDSL.g:13705:3: rule__XEqualityExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_98);
+            	    pushFollow(FOLLOW_106);
             	    rule__XEqualityExpression__Group_1__0();
 
             	    state._fsp--;
@@ -42482,7 +46103,7 @@
             	    break;
 
             	default :
-            	    break loop114;
+            	    break loop119;
                 }
             } while (true);
 
@@ -42511,16 +46132,16 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__0"
-    // InternalDataDSL.g:12628:1: rule__XEqualityExpression__Group_1__0 : rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 ;
+    // InternalDataDSL.g:13714:1: rule__XEqualityExpression__Group_1__0 : rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 ;
     public final void rule__XEqualityExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12632:1: ( rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 )
-            // InternalDataDSL.g:12633:2: rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1
+            // InternalDataDSL.g:13718:1: ( rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1 )
+            // InternalDataDSL.g:13719:2: rule__XEqualityExpression__Group_1__0__Impl rule__XEqualityExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XEqualityExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -42549,23 +46170,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:12640:1: rule__XEqualityExpression__Group_1__0__Impl : ( ( rule__XEqualityExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:13726:1: rule__XEqualityExpression__Group_1__0__Impl : ( ( rule__XEqualityExpression__Group_1_0__0 ) ) ;
     public final void rule__XEqualityExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12644:1: ( ( ( rule__XEqualityExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:12645:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13730:1: ( ( ( rule__XEqualityExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:13731:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:12645:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:12646:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13731:1: ( ( rule__XEqualityExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:13732:2: ( rule__XEqualityExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:12647:2: ( rule__XEqualityExpression__Group_1_0__0 )
-            // InternalDataDSL.g:12647:3: rule__XEqualityExpression__Group_1_0__0
+            // InternalDataDSL.g:13733:2: ( rule__XEqualityExpression__Group_1_0__0 )
+            // InternalDataDSL.g:13733:3: rule__XEqualityExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0__0();
@@ -42600,14 +46221,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__1"
-    // InternalDataDSL.g:12655:1: rule__XEqualityExpression__Group_1__1 : rule__XEqualityExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:13741:1: rule__XEqualityExpression__Group_1__1 : rule__XEqualityExpression__Group_1__1__Impl ;
     public final void rule__XEqualityExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12659:1: ( rule__XEqualityExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:12660:2: rule__XEqualityExpression__Group_1__1__Impl
+            // InternalDataDSL.g:13745:1: ( rule__XEqualityExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:13746:2: rule__XEqualityExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1__1__Impl();
@@ -42633,23 +46254,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:12666:1: rule__XEqualityExpression__Group_1__1__Impl : ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:13752:1: rule__XEqualityExpression__Group_1__1__Impl : ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XEqualityExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12670:1: ( ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:12671:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13756:1: ( ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:13757:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:12671:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:12672:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13757:1: ( ( rule__XEqualityExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:13758:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:12673:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:12673:3: rule__XEqualityExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:13759:2: ( rule__XEqualityExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:13759:3: rule__XEqualityExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__RightOperandAssignment_1_1();
@@ -42684,14 +46305,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0__0"
-    // InternalDataDSL.g:12682:1: rule__XEqualityExpression__Group_1_0__0 : rule__XEqualityExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:13768:1: rule__XEqualityExpression__Group_1_0__0 : rule__XEqualityExpression__Group_1_0__0__Impl ;
     public final void rule__XEqualityExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12686:1: ( rule__XEqualityExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:12687:2: rule__XEqualityExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:13772:1: ( rule__XEqualityExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:13773:2: rule__XEqualityExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0__0__Impl();
@@ -42717,23 +46338,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:12693:1: rule__XEqualityExpression__Group_1_0__0__Impl : ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:13779:1: rule__XEqualityExpression__Group_1_0__0__Impl : ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XEqualityExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12697:1: ( ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:12698:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13783:1: ( ( ( rule__XEqualityExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:13784:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:12698:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:12699:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13784:1: ( ( rule__XEqualityExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13785:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:12700:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:12700:3: rule__XEqualityExpression__Group_1_0_0__0
+            // InternalDataDSL.g:13786:2: ( rule__XEqualityExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13786:3: rule__XEqualityExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0_0__0();
@@ -42768,16 +46389,16 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:12709:1: rule__XEqualityExpression__Group_1_0_0__0 : rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:13795:1: rule__XEqualityExpression__Group_1_0_0__0 : rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 ;
     public final void rule__XEqualityExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12713:1: ( rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:12714:2: rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1
+            // InternalDataDSL.g:13799:1: ( rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:13800:2: rule__XEqualityExpression__Group_1_0_0__0__Impl rule__XEqualityExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_97);
+            pushFollow(FOLLOW_105);
             rule__XEqualityExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -42806,23 +46427,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:12721:1: rule__XEqualityExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:13807:1: rule__XEqualityExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XEqualityExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12725:1: ( ( () ) )
-            // InternalDataDSL.g:12726:1: ( () )
+            // InternalDataDSL.g:13811:1: ( ( () ) )
+            // InternalDataDSL.g:13812:1: ( () )
             {
-            // InternalDataDSL.g:12726:1: ( () )
-            // InternalDataDSL.g:12727:2: ()
+            // InternalDataDSL.g:13812:1: ( () )
+            // InternalDataDSL.g:13813:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:12728:2: ()
-            // InternalDataDSL.g:12728:3: 
+            // InternalDataDSL.g:13814:2: ()
+            // InternalDataDSL.g:13814:3: 
             {
             }
 
@@ -42847,14 +46468,14 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:12736:1: rule__XEqualityExpression__Group_1_0_0__1 : rule__XEqualityExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:13822:1: rule__XEqualityExpression__Group_1_0_0__1 : rule__XEqualityExpression__Group_1_0_0__1__Impl ;
     public final void rule__XEqualityExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12740:1: ( rule__XEqualityExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:12741:2: rule__XEqualityExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:13826:1: ( rule__XEqualityExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:13827:2: rule__XEqualityExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__Group_1_0_0__1__Impl();
@@ -42880,23 +46501,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:12747:1: rule__XEqualityExpression__Group_1_0_0__1__Impl : ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:13833:1: rule__XEqualityExpression__Group_1_0_0__1__Impl : ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XEqualityExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12751:1: ( ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:12752:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13837:1: ( ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:13838:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:12752:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:12753:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13838:1: ( ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:13839:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:12754:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:12754:3: rule__XEqualityExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:13840:2: ( rule__XEqualityExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:13840:3: rule__XEqualityExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XEqualityExpression__FeatureAssignment_1_0_0_1();
@@ -42931,16 +46552,16 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__0"
-    // InternalDataDSL.g:12763:1: rule__XRelationalExpression__Group__0 : rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 ;
+    // InternalDataDSL.g:13849:1: rule__XRelationalExpression__Group__0 : rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 ;
     public final void rule__XRelationalExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12767:1: ( rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 )
-            // InternalDataDSL.g:12768:2: rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1
+            // InternalDataDSL.g:13853:1: ( rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1 )
+            // InternalDataDSL.g:13854:2: rule__XRelationalExpression__Group__0__Impl rule__XRelationalExpression__Group__1
             {
-            pushFollow(FOLLOW_99);
+            pushFollow(FOLLOW_107);
             rule__XRelationalExpression__Group__0__Impl();
 
             state._fsp--;
@@ -42969,17 +46590,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__0__Impl"
-    // InternalDataDSL.g:12775:1: rule__XRelationalExpression__Group__0__Impl : ( ruleXOtherOperatorExpression ) ;
+    // InternalDataDSL.g:13861:1: rule__XRelationalExpression__Group__0__Impl : ( ruleXOtherOperatorExpression ) ;
     public final void rule__XRelationalExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12779:1: ( ( ruleXOtherOperatorExpression ) )
-            // InternalDataDSL.g:12780:1: ( ruleXOtherOperatorExpression )
+            // InternalDataDSL.g:13865:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalDataDSL.g:13866:1: ( ruleXOtherOperatorExpression )
             {
-            // InternalDataDSL.g:12780:1: ( ruleXOtherOperatorExpression )
-            // InternalDataDSL.g:12781:2: ruleXOtherOperatorExpression
+            // InternalDataDSL.g:13866:1: ( ruleXOtherOperatorExpression )
+            // InternalDataDSL.g:13867:2: ruleXOtherOperatorExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0()); 
@@ -43014,14 +46635,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__1"
-    // InternalDataDSL.g:12790:1: rule__XRelationalExpression__Group__1 : rule__XRelationalExpression__Group__1__Impl ;
+    // InternalDataDSL.g:13876:1: rule__XRelationalExpression__Group__1 : rule__XRelationalExpression__Group__1__Impl ;
     public final void rule__XRelationalExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12794:1: ( rule__XRelationalExpression__Group__1__Impl )
-            // InternalDataDSL.g:12795:2: rule__XRelationalExpression__Group__1__Impl
+            // InternalDataDSL.g:13880:1: ( rule__XRelationalExpression__Group__1__Impl )
+            // InternalDataDSL.g:13881:2: rule__XRelationalExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group__1__Impl();
@@ -43047,32 +46668,32 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group__1__Impl"
-    // InternalDataDSL.g:12801:1: rule__XRelationalExpression__Group__1__Impl : ( ( rule__XRelationalExpression__Alternatives_1 )* ) ;
+    // InternalDataDSL.g:13887:1: rule__XRelationalExpression__Group__1__Impl : ( ( rule__XRelationalExpression__Alternatives_1 )* ) ;
     public final void rule__XRelationalExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12805:1: ( ( ( rule__XRelationalExpression__Alternatives_1 )* ) )
-            // InternalDataDSL.g:12806:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            // InternalDataDSL.g:13891:1: ( ( ( rule__XRelationalExpression__Alternatives_1 )* ) )
+            // InternalDataDSL.g:13892:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
             {
-            // InternalDataDSL.g:12806:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
-            // InternalDataDSL.g:12807:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            // InternalDataDSL.g:13892:1: ( ( rule__XRelationalExpression__Alternatives_1 )* )
+            // InternalDataDSL.g:13893:2: ( rule__XRelationalExpression__Alternatives_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getAlternatives_1()); 
             }
-            // InternalDataDSL.g:12808:2: ( rule__XRelationalExpression__Alternatives_1 )*
-            loop115:
+            // InternalDataDSL.g:13894:2: ( rule__XRelationalExpression__Alternatives_1 )*
+            loop120:
             do {
-                int alt115=2;
+                int alt120=2;
                 switch ( input.LA(1) ) {
                 case 27:
                     {
-                    int LA115_2 = input.LA(2);
+                    int LA120_2 = input.LA(2);
 
-                    if ( (synpred175_InternalDataDSL()) ) {
-                        alt115=1;
+                    if ( (synpred186_InternalDataDSL()) ) {
+                        alt120=1;
                     }
 
 
@@ -43080,21 +46701,21 @@
                     break;
                 case 26:
                     {
-                    int LA115_3 = input.LA(2);
+                    int LA120_3 = input.LA(2);
 
-                    if ( (synpred175_InternalDataDSL()) ) {
-                        alt115=1;
+                    if ( (synpred186_InternalDataDSL()) ) {
+                        alt120=1;
                     }
 
 
                     }
                     break;
-                case 128:
+                case 134:
                     {
-                    int LA115_4 = input.LA(2);
+                    int LA120_4 = input.LA(2);
 
-                    if ( (synpred175_InternalDataDSL()) ) {
-                        alt115=1;
+                    if ( (synpred186_InternalDataDSL()) ) {
+                        alt120=1;
                     }
 
 
@@ -43102,10 +46723,10 @@
                     break;
                 case 25:
                     {
-                    int LA115_5 = input.LA(2);
+                    int LA120_5 = input.LA(2);
 
-                    if ( (synpred175_InternalDataDSL()) ) {
-                        alt115=1;
+                    if ( (synpred186_InternalDataDSL()) ) {
+                        alt120=1;
                     }
 
 
@@ -43114,11 +46735,11 @@
 
                 }
 
-                switch (alt115) {
+                switch (alt120) {
             	case 1 :
-            	    // InternalDataDSL.g:12808:3: rule__XRelationalExpression__Alternatives_1
+            	    // InternalDataDSL.g:13894:3: rule__XRelationalExpression__Alternatives_1
             	    {
-            	    pushFollow(FOLLOW_100);
+            	    pushFollow(FOLLOW_108);
             	    rule__XRelationalExpression__Alternatives_1();
 
             	    state._fsp--;
@@ -43128,7 +46749,7 @@
             	    break;
 
             	default :
-            	    break loop115;
+            	    break loop120;
                 }
             } while (true);
 
@@ -43157,16 +46778,16 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__0"
-    // InternalDataDSL.g:12817:1: rule__XRelationalExpression__Group_1_0__0 : rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 ;
+    // InternalDataDSL.g:13903:1: rule__XRelationalExpression__Group_1_0__0 : rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 ;
     public final void rule__XRelationalExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12821:1: ( rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 )
-            // InternalDataDSL.g:12822:2: rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1
+            // InternalDataDSL.g:13907:1: ( rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1 )
+            // InternalDataDSL.g:13908:2: rule__XRelationalExpression__Group_1_0__0__Impl rule__XRelationalExpression__Group_1_0__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XRelationalExpression__Group_1_0__0__Impl();
 
             state._fsp--;
@@ -43195,23 +46816,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:12829:1: rule__XRelationalExpression__Group_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:13915:1: rule__XRelationalExpression__Group_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12833:1: ( ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:12834:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13919:1: ( ( ( rule__XRelationalExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:13920:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:12834:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:12835:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13920:1: ( ( rule__XRelationalExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:13921:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:12836:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:12836:3: rule__XRelationalExpression__Group_1_0_0__0
+            // InternalDataDSL.g:13922:2: ( rule__XRelationalExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:13922:3: rule__XRelationalExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0__0();
@@ -43246,14 +46867,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__1"
-    // InternalDataDSL.g:12844:1: rule__XRelationalExpression__Group_1_0__1 : rule__XRelationalExpression__Group_1_0__1__Impl ;
+    // InternalDataDSL.g:13930:1: rule__XRelationalExpression__Group_1_0__1 : rule__XRelationalExpression__Group_1_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12848:1: ( rule__XRelationalExpression__Group_1_0__1__Impl )
-            // InternalDataDSL.g:12849:2: rule__XRelationalExpression__Group_1_0__1__Impl
+            // InternalDataDSL.g:13934:1: ( rule__XRelationalExpression__Group_1_0__1__Impl )
+            // InternalDataDSL.g:13935:2: rule__XRelationalExpression__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0__1__Impl();
@@ -43279,23 +46900,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0__1__Impl"
-    // InternalDataDSL.g:12855:1: rule__XRelationalExpression__Group_1_0__1__Impl : ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) ;
+    // InternalDataDSL.g:13941:1: rule__XRelationalExpression__Group_1_0__1__Impl : ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12859:1: ( ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) )
-            // InternalDataDSL.g:12860:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            // InternalDataDSL.g:13945:1: ( ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) ) )
+            // InternalDataDSL.g:13946:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
             {
-            // InternalDataDSL.g:12860:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
-            // InternalDataDSL.g:12861:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            // InternalDataDSL.g:13946:1: ( ( rule__XRelationalExpression__TypeAssignment_1_0_1 ) )
+            // InternalDataDSL.g:13947:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getTypeAssignment_1_0_1()); 
             }
-            // InternalDataDSL.g:12862:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
-            // InternalDataDSL.g:12862:3: rule__XRelationalExpression__TypeAssignment_1_0_1
+            // InternalDataDSL.g:13948:2: ( rule__XRelationalExpression__TypeAssignment_1_0_1 )
+            // InternalDataDSL.g:13948:3: rule__XRelationalExpression__TypeAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__TypeAssignment_1_0_1();
@@ -43330,14 +46951,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:12871:1: rule__XRelationalExpression__Group_1_0_0__0 : rule__XRelationalExpression__Group_1_0_0__0__Impl ;
+    // InternalDataDSL.g:13957:1: rule__XRelationalExpression__Group_1_0_0__0 : rule__XRelationalExpression__Group_1_0_0__0__Impl ;
     public final void rule__XRelationalExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12875:1: ( rule__XRelationalExpression__Group_1_0_0__0__Impl )
-            // InternalDataDSL.g:12876:2: rule__XRelationalExpression__Group_1_0_0__0__Impl
+            // InternalDataDSL.g:13961:1: ( rule__XRelationalExpression__Group_1_0_0__0__Impl )
+            // InternalDataDSL.g:13962:2: rule__XRelationalExpression__Group_1_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0__0__Impl();
@@ -43363,23 +46984,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:12882:1: rule__XRelationalExpression__Group_1_0_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) ;
+    // InternalDataDSL.g:13968:1: rule__XRelationalExpression__Group_1_0_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12886:1: ( ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) )
-            // InternalDataDSL.g:12887:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            // InternalDataDSL.g:13972:1: ( ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) ) )
+            // InternalDataDSL.g:13973:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
             {
-            // InternalDataDSL.g:12887:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
-            // InternalDataDSL.g:12888:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            // InternalDataDSL.g:13973:1: ( ( rule__XRelationalExpression__Group_1_0_0_0__0 ) )
+            // InternalDataDSL.g:13974:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_0_0_0()); 
             }
-            // InternalDataDSL.g:12889:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
-            // InternalDataDSL.g:12889:3: rule__XRelationalExpression__Group_1_0_0_0__0
+            // InternalDataDSL.g:13975:2: ( rule__XRelationalExpression__Group_1_0_0_0__0 )
+            // InternalDataDSL.g:13975:3: rule__XRelationalExpression__Group_1_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0_0__0();
@@ -43414,16 +47035,16 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0"
-    // InternalDataDSL.g:12898:1: rule__XRelationalExpression__Group_1_0_0_0__0 : rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 ;
+    // InternalDataDSL.g:13984:1: rule__XRelationalExpression__Group_1_0_0_0__0 : rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12902:1: ( rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 )
-            // InternalDataDSL.g:12903:2: rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1
+            // InternalDataDSL.g:13988:1: ( rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1 )
+            // InternalDataDSL.g:13989:2: rule__XRelationalExpression__Group_1_0_0_0__0__Impl rule__XRelationalExpression__Group_1_0_0_0__1
             {
-            pushFollow(FOLLOW_102);
+            pushFollow(FOLLOW_110);
             rule__XRelationalExpression__Group_1_0_0_0__0__Impl();
 
             state._fsp--;
@@ -43452,23 +47073,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__0__Impl"
-    // InternalDataDSL.g:12910:1: rule__XRelationalExpression__Group_1_0_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:13996:1: rule__XRelationalExpression__Group_1_0_0_0__0__Impl : ( () ) ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12914:1: ( ( () ) )
-            // InternalDataDSL.g:12915:1: ( () )
+            // InternalDataDSL.g:14000:1: ( ( () ) )
+            // InternalDataDSL.g:14001:1: ( () )
             {
-            // InternalDataDSL.g:12915:1: ( () )
-            // InternalDataDSL.g:12916:2: ()
+            // InternalDataDSL.g:14001:1: ( () )
+            // InternalDataDSL.g:14002:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXInstanceOfExpressionExpressionAction_1_0_0_0_0()); 
             }
-            // InternalDataDSL.g:12917:2: ()
-            // InternalDataDSL.g:12917:3: 
+            // InternalDataDSL.g:14003:2: ()
+            // InternalDataDSL.g:14003:3: 
             {
             }
 
@@ -43493,14 +47114,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1"
-    // InternalDataDSL.g:12925:1: rule__XRelationalExpression__Group_1_0_0_0__1 : rule__XRelationalExpression__Group_1_0_0_0__1__Impl ;
+    // InternalDataDSL.g:14011:1: rule__XRelationalExpression__Group_1_0_0_0__1 : rule__XRelationalExpression__Group_1_0_0_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12929:1: ( rule__XRelationalExpression__Group_1_0_0_0__1__Impl )
-            // InternalDataDSL.g:12930:2: rule__XRelationalExpression__Group_1_0_0_0__1__Impl
+            // InternalDataDSL.g:14015:1: ( rule__XRelationalExpression__Group_1_0_0_0__1__Impl )
+            // InternalDataDSL.g:14016:2: rule__XRelationalExpression__Group_1_0_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_0_0_0__1__Impl();
@@ -43526,22 +47147,22 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_0_0_0__1__Impl"
-    // InternalDataDSL.g:12936:1: rule__XRelationalExpression__Group_1_0_0_0__1__Impl : ( 'instanceof' ) ;
+    // InternalDataDSL.g:14022:1: rule__XRelationalExpression__Group_1_0_0_0__1__Impl : ( 'instanceof' ) ;
     public final void rule__XRelationalExpression__Group_1_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12940:1: ( ( 'instanceof' ) )
-            // InternalDataDSL.g:12941:1: ( 'instanceof' )
+            // InternalDataDSL.g:14026:1: ( ( 'instanceof' ) )
+            // InternalDataDSL.g:14027:1: ( 'instanceof' )
             {
-            // InternalDataDSL.g:12941:1: ( 'instanceof' )
-            // InternalDataDSL.g:12942:2: 'instanceof'
+            // InternalDataDSL.g:14027:1: ( 'instanceof' )
+            // InternalDataDSL.g:14028:2: 'instanceof'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); 
             }
-            match(input,128,FOLLOW_2); if (state.failed) return ;
+            match(input,134,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1()); 
             }
@@ -43567,16 +47188,16 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__0"
-    // InternalDataDSL.g:12952:1: rule__XRelationalExpression__Group_1_1__0 : rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 ;
+    // InternalDataDSL.g:14038:1: rule__XRelationalExpression__Group_1_1__0 : rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 ;
     public final void rule__XRelationalExpression__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12956:1: ( rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 )
-            // InternalDataDSL.g:12957:2: rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1
+            // InternalDataDSL.g:14042:1: ( rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1 )
+            // InternalDataDSL.g:14043:2: rule__XRelationalExpression__Group_1_1__0__Impl rule__XRelationalExpression__Group_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XRelationalExpression__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -43605,23 +47226,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__0__Impl"
-    // InternalDataDSL.g:12964:1: rule__XRelationalExpression__Group_1_1__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) ;
+    // InternalDataDSL.g:14050:1: rule__XRelationalExpression__Group_1_1__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12968:1: ( ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) )
-            // InternalDataDSL.g:12969:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:14054:1: ( ( ( rule__XRelationalExpression__Group_1_1_0__0 ) ) )
+            // InternalDataDSL.g:14055:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
             {
-            // InternalDataDSL.g:12969:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
-            // InternalDataDSL.g:12970:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            // InternalDataDSL.g:14055:1: ( ( rule__XRelationalExpression__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:14056:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0()); 
             }
-            // InternalDataDSL.g:12971:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
-            // InternalDataDSL.g:12971:3: rule__XRelationalExpression__Group_1_1_0__0
+            // InternalDataDSL.g:14057:2: ( rule__XRelationalExpression__Group_1_1_0__0 )
+            // InternalDataDSL.g:14057:3: rule__XRelationalExpression__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0__0();
@@ -43656,14 +47277,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__1"
-    // InternalDataDSL.g:12979:1: rule__XRelationalExpression__Group_1_1__1 : rule__XRelationalExpression__Group_1_1__1__Impl ;
+    // InternalDataDSL.g:14065:1: rule__XRelationalExpression__Group_1_1__1 : rule__XRelationalExpression__Group_1_1__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12983:1: ( rule__XRelationalExpression__Group_1_1__1__Impl )
-            // InternalDataDSL.g:12984:2: rule__XRelationalExpression__Group_1_1__1__Impl
+            // InternalDataDSL.g:14069:1: ( rule__XRelationalExpression__Group_1_1__1__Impl )
+            // InternalDataDSL.g:14070:2: rule__XRelationalExpression__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1__1__Impl();
@@ -43689,23 +47310,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1__1__Impl"
-    // InternalDataDSL.g:12990:1: rule__XRelationalExpression__Group_1_1__1__Impl : ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) ;
+    // InternalDataDSL.g:14076:1: rule__XRelationalExpression__Group_1_1__1__Impl : ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:12994:1: ( ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) )
-            // InternalDataDSL.g:12995:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            // InternalDataDSL.g:14080:1: ( ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) ) )
+            // InternalDataDSL.g:14081:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
             {
-            // InternalDataDSL.g:12995:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
-            // InternalDataDSL.g:12996:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            // InternalDataDSL.g:14081:1: ( ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 ) )
+            // InternalDataDSL.g:14082:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getRightOperandAssignment_1_1_1()); 
             }
-            // InternalDataDSL.g:12997:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
-            // InternalDataDSL.g:12997:3: rule__XRelationalExpression__RightOperandAssignment_1_1_1
+            // InternalDataDSL.g:14083:2: ( rule__XRelationalExpression__RightOperandAssignment_1_1_1 )
+            // InternalDataDSL.g:14083:3: rule__XRelationalExpression__RightOperandAssignment_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__RightOperandAssignment_1_1_1();
@@ -43740,14 +47361,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0"
-    // InternalDataDSL.g:13006:1: rule__XRelationalExpression__Group_1_1_0__0 : rule__XRelationalExpression__Group_1_1_0__0__Impl ;
+    // InternalDataDSL.g:14092:1: rule__XRelationalExpression__Group_1_1_0__0 : rule__XRelationalExpression__Group_1_1_0__0__Impl ;
     public final void rule__XRelationalExpression__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13010:1: ( rule__XRelationalExpression__Group_1_1_0__0__Impl )
-            // InternalDataDSL.g:13011:2: rule__XRelationalExpression__Group_1_1_0__0__Impl
+            // InternalDataDSL.g:14096:1: ( rule__XRelationalExpression__Group_1_1_0__0__Impl )
+            // InternalDataDSL.g:14097:2: rule__XRelationalExpression__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0__0__Impl();
@@ -43773,23 +47394,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0__0__Impl"
-    // InternalDataDSL.g:13017:1: rule__XRelationalExpression__Group_1_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:14103:1: rule__XRelationalExpression__Group_1_1_0__0__Impl : ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13021:1: ( ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13022:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:14107:1: ( ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) ) )
+            // InternalDataDSL.g:14108:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13022:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
-            // InternalDataDSL.g:13023:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:14108:1: ( ( rule__XRelationalExpression__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:14109:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getGroup_1_1_0_0()); 
             }
-            // InternalDataDSL.g:13024:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
-            // InternalDataDSL.g:13024:3: rule__XRelationalExpression__Group_1_1_0_0__0
+            // InternalDataDSL.g:14110:2: ( rule__XRelationalExpression__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:14110:3: rule__XRelationalExpression__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0_0__0();
@@ -43824,16 +47445,16 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0"
-    // InternalDataDSL.g:13033:1: rule__XRelationalExpression__Group_1_1_0_0__0 : rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 ;
+    // InternalDataDSL.g:14119:1: rule__XRelationalExpression__Group_1_1_0_0__0 : rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13037:1: ( rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 )
-            // InternalDataDSL.g:13038:2: rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1
+            // InternalDataDSL.g:14123:1: ( rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1 )
+            // InternalDataDSL.g:14124:2: rule__XRelationalExpression__Group_1_1_0_0__0__Impl rule__XRelationalExpression__Group_1_1_0_0__1
             {
-            pushFollow(FOLLOW_99);
+            pushFollow(FOLLOW_107);
             rule__XRelationalExpression__Group_1_1_0_0__0__Impl();
 
             state._fsp--;
@@ -43862,23 +47483,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__0__Impl"
-    // InternalDataDSL.g:13045:1: rule__XRelationalExpression__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:14131:1: rule__XRelationalExpression__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13049:1: ( ( () ) )
-            // InternalDataDSL.g:13050:1: ( () )
+            // InternalDataDSL.g:14135:1: ( ( () ) )
+            // InternalDataDSL.g:14136:1: ( () )
             {
-            // InternalDataDSL.g:13050:1: ( () )
-            // InternalDataDSL.g:13051:2: ()
+            // InternalDataDSL.g:14136:1: ( () )
+            // InternalDataDSL.g:14137:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getXBinaryOperationLeftOperandAction_1_1_0_0_0()); 
             }
-            // InternalDataDSL.g:13052:2: ()
-            // InternalDataDSL.g:13052:3: 
+            // InternalDataDSL.g:14138:2: ()
+            // InternalDataDSL.g:14138:3: 
             {
             }
 
@@ -43903,14 +47524,14 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1"
-    // InternalDataDSL.g:13060:1: rule__XRelationalExpression__Group_1_1_0_0__1 : rule__XRelationalExpression__Group_1_1_0_0__1__Impl ;
+    // InternalDataDSL.g:14146:1: rule__XRelationalExpression__Group_1_1_0_0__1 : rule__XRelationalExpression__Group_1_1_0_0__1__Impl ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13064:1: ( rule__XRelationalExpression__Group_1_1_0_0__1__Impl )
-            // InternalDataDSL.g:13065:2: rule__XRelationalExpression__Group_1_1_0_0__1__Impl
+            // InternalDataDSL.g:14150:1: ( rule__XRelationalExpression__Group_1_1_0_0__1__Impl )
+            // InternalDataDSL.g:14151:2: rule__XRelationalExpression__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__Group_1_1_0_0__1__Impl();
@@ -43936,23 +47557,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__Group_1_1_0_0__1__Impl"
-    // InternalDataDSL.g:13071:1: rule__XRelationalExpression__Group_1_1_0_0__1__Impl : ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:14157:1: rule__XRelationalExpression__Group_1_1_0_0__1__Impl : ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) ;
     public final void rule__XRelationalExpression__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13075:1: ( ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) )
-            // InternalDataDSL.g:13076:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalDataDSL.g:14161:1: ( ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) ) )
+            // InternalDataDSL.g:14162:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:13076:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
-            // InternalDataDSL.g:13077:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            // InternalDataDSL.g:14162:1: ( ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 ) )
+            // InternalDataDSL.g:14163:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureAssignment_1_1_0_0_1()); 
             }
-            // InternalDataDSL.g:13078:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
-            // InternalDataDSL.g:13078:3: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
+            // InternalDataDSL.g:14164:2: ( rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 )
+            // InternalDataDSL.g:14164:3: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1();
@@ -43987,16 +47608,16 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__0"
-    // InternalDataDSL.g:13087:1: rule__OpCompare__Group_1__0 : rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 ;
+    // InternalDataDSL.g:14173:1: rule__OpCompare__Group_1__0 : rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 ;
     public final void rule__OpCompare__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13091:1: ( rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 )
-            // InternalDataDSL.g:13092:2: rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1
+            // InternalDataDSL.g:14177:1: ( rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1 )
+            // InternalDataDSL.g:14178:2: rule__OpCompare__Group_1__0__Impl rule__OpCompare__Group_1__1
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__OpCompare__Group_1__0__Impl();
 
             state._fsp--;
@@ -44025,17 +47646,17 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__0__Impl"
-    // InternalDataDSL.g:13099:1: rule__OpCompare__Group_1__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:14185:1: rule__OpCompare__Group_1__0__Impl : ( '<' ) ;
     public final void rule__OpCompare__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13103:1: ( ( '<' ) )
-            // InternalDataDSL.g:13104:1: ( '<' )
+            // InternalDataDSL.g:14189:1: ( ( '<' ) )
+            // InternalDataDSL.g:14190:1: ( '<' )
             {
-            // InternalDataDSL.g:13104:1: ( '<' )
-            // InternalDataDSL.g:13105:2: '<'
+            // InternalDataDSL.g:14190:1: ( '<' )
+            // InternalDataDSL.g:14191:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0()); 
@@ -44066,14 +47687,14 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__1"
-    // InternalDataDSL.g:13114:1: rule__OpCompare__Group_1__1 : rule__OpCompare__Group_1__1__Impl ;
+    // InternalDataDSL.g:14200:1: rule__OpCompare__Group_1__1 : rule__OpCompare__Group_1__1__Impl ;
     public final void rule__OpCompare__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13118:1: ( rule__OpCompare__Group_1__1__Impl )
-            // InternalDataDSL.g:13119:2: rule__OpCompare__Group_1__1__Impl
+            // InternalDataDSL.g:14204:1: ( rule__OpCompare__Group_1__1__Impl )
+            // InternalDataDSL.g:14205:2: rule__OpCompare__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpCompare__Group_1__1__Impl();
@@ -44099,17 +47720,17 @@
 
 
     // $ANTLR start "rule__OpCompare__Group_1__1__Impl"
-    // InternalDataDSL.g:13125:1: rule__OpCompare__Group_1__1__Impl : ( '=' ) ;
+    // InternalDataDSL.g:14211:1: rule__OpCompare__Group_1__1__Impl : ( '=' ) ;
     public final void rule__OpCompare__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13129:1: ( ( '=' ) )
-            // InternalDataDSL.g:13130:1: ( '=' )
+            // InternalDataDSL.g:14215:1: ( ( '=' ) )
+            // InternalDataDSL.g:14216:1: ( '=' )
             {
-            // InternalDataDSL.g:13130:1: ( '=' )
-            // InternalDataDSL.g:13131:2: '='
+            // InternalDataDSL.g:14216:1: ( '=' )
+            // InternalDataDSL.g:14217:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpCompareAccess().getEqualsSignKeyword_1_1()); 
@@ -44140,16 +47761,16 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__0"
-    // InternalDataDSL.g:13141:1: rule__XOtherOperatorExpression__Group__0 : rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 ;
+    // InternalDataDSL.g:14227:1: rule__XOtherOperatorExpression__Group__0 : rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 ;
     public final void rule__XOtherOperatorExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13145:1: ( rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 )
-            // InternalDataDSL.g:13146:2: rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1
+            // InternalDataDSL.g:14231:1: ( rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1 )
+            // InternalDataDSL.g:14232:2: rule__XOtherOperatorExpression__Group__0__Impl rule__XOtherOperatorExpression__Group__1
             {
-            pushFollow(FOLLOW_103);
+            pushFollow(FOLLOW_111);
             rule__XOtherOperatorExpression__Group__0__Impl();
 
             state._fsp--;
@@ -44178,17 +47799,17 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__0__Impl"
-    // InternalDataDSL.g:13153:1: rule__XOtherOperatorExpression__Group__0__Impl : ( ruleXAdditiveExpression ) ;
+    // InternalDataDSL.g:14239:1: rule__XOtherOperatorExpression__Group__0__Impl : ( ruleXAdditiveExpression ) ;
     public final void rule__XOtherOperatorExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13157:1: ( ( ruleXAdditiveExpression ) )
-            // InternalDataDSL.g:13158:1: ( ruleXAdditiveExpression )
+            // InternalDataDSL.g:14243:1: ( ( ruleXAdditiveExpression ) )
+            // InternalDataDSL.g:14244:1: ( ruleXAdditiveExpression )
             {
-            // InternalDataDSL.g:13158:1: ( ruleXAdditiveExpression )
-            // InternalDataDSL.g:13159:2: ruleXAdditiveExpression
+            // InternalDataDSL.g:14244:1: ( ruleXAdditiveExpression )
+            // InternalDataDSL.g:14245:2: ruleXAdditiveExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0()); 
@@ -44223,14 +47844,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__1"
-    // InternalDataDSL.g:13168:1: rule__XOtherOperatorExpression__Group__1 : rule__XOtherOperatorExpression__Group__1__Impl ;
+    // InternalDataDSL.g:14254:1: rule__XOtherOperatorExpression__Group__1 : rule__XOtherOperatorExpression__Group__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13172:1: ( rule__XOtherOperatorExpression__Group__1__Impl )
-            // InternalDataDSL.g:13173:2: rule__XOtherOperatorExpression__Group__1__Impl
+            // InternalDataDSL.g:14258:1: ( rule__XOtherOperatorExpression__Group__1__Impl )
+            // InternalDataDSL.g:14259:2: rule__XOtherOperatorExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group__1__Impl();
@@ -44256,31 +47877,31 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group__1__Impl"
-    // InternalDataDSL.g:13179:1: rule__XOtherOperatorExpression__Group__1__Impl : ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:14265:1: rule__XOtherOperatorExpression__Group__1__Impl : ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) ;
     public final void rule__XOtherOperatorExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13183:1: ( ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:13184:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14269:1: ( ( ( rule__XOtherOperatorExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:14270:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:13184:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
-            // InternalDataDSL.g:13185:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            // InternalDataDSL.g:14270:1: ( ( rule__XOtherOperatorExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14271:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:13186:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
-            loop116:
+            // InternalDataDSL.g:14272:2: ( rule__XOtherOperatorExpression__Group_1__0 )*
+            loop121:
             do {
-                int alt116=2;
-                alt116 = dfa116.predict(input);
-                switch (alt116) {
+                int alt121=2;
+                alt121 = dfa121.predict(input);
+                switch (alt121) {
             	case 1 :
-            	    // InternalDataDSL.g:13186:3: rule__XOtherOperatorExpression__Group_1__0
+            	    // InternalDataDSL.g:14272:3: rule__XOtherOperatorExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_104);
+            	    pushFollow(FOLLOW_112);
             	    rule__XOtherOperatorExpression__Group_1__0();
 
             	    state._fsp--;
@@ -44290,7 +47911,7 @@
             	    break;
 
             	default :
-            	    break loop116;
+            	    break loop121;
                 }
             } while (true);
 
@@ -44319,16 +47940,16 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0"
-    // InternalDataDSL.g:13195:1: rule__XOtherOperatorExpression__Group_1__0 : rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 ;
+    // InternalDataDSL.g:14281:1: rule__XOtherOperatorExpression__Group_1__0 : rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 ;
     public final void rule__XOtherOperatorExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13199:1: ( rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 )
-            // InternalDataDSL.g:13200:2: rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1
+            // InternalDataDSL.g:14285:1: ( rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1 )
+            // InternalDataDSL.g:14286:2: rule__XOtherOperatorExpression__Group_1__0__Impl rule__XOtherOperatorExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XOtherOperatorExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -44357,23 +47978,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:13207:1: rule__XOtherOperatorExpression__Group_1__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:14293:1: rule__XOtherOperatorExpression__Group_1__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13211:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:13212:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:14297:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:14298:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:13212:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:13213:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            // InternalDataDSL.g:14298:1: ( ( rule__XOtherOperatorExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:14299:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:13214:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
-            // InternalDataDSL.g:13214:3: rule__XOtherOperatorExpression__Group_1_0__0
+            // InternalDataDSL.g:14300:2: ( rule__XOtherOperatorExpression__Group_1_0__0 )
+            // InternalDataDSL.g:14300:3: rule__XOtherOperatorExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0__0();
@@ -44408,14 +48029,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1"
-    // InternalDataDSL.g:13222:1: rule__XOtherOperatorExpression__Group_1__1 : rule__XOtherOperatorExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:14308:1: rule__XOtherOperatorExpression__Group_1__1 : rule__XOtherOperatorExpression__Group_1__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13226:1: ( rule__XOtherOperatorExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:13227:2: rule__XOtherOperatorExpression__Group_1__1__Impl
+            // InternalDataDSL.g:14312:1: ( rule__XOtherOperatorExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:14313:2: rule__XOtherOperatorExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1__1__Impl();
@@ -44441,23 +48062,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:13233:1: rule__XOtherOperatorExpression__Group_1__1__Impl : ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:14319:1: rule__XOtherOperatorExpression__Group_1__1__Impl : ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13237:1: ( ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:13238:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:14323:1: ( ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:14324:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:13238:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:13239:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:14324:1: ( ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:14325:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:13240:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:13240:3: rule__XOtherOperatorExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:14326:2: ( rule__XOtherOperatorExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:14326:3: rule__XOtherOperatorExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__RightOperandAssignment_1_1();
@@ -44492,14 +48113,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0"
-    // InternalDataDSL.g:13249:1: rule__XOtherOperatorExpression__Group_1_0__0 : rule__XOtherOperatorExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:14335:1: rule__XOtherOperatorExpression__Group_1_0__0 : rule__XOtherOperatorExpression__Group_1_0__0__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13253:1: ( rule__XOtherOperatorExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:13254:2: rule__XOtherOperatorExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:14339:1: ( rule__XOtherOperatorExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:14340:2: rule__XOtherOperatorExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0__0__Impl();
@@ -44525,23 +48146,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:13260:1: rule__XOtherOperatorExpression__Group_1_0__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:14346:1: rule__XOtherOperatorExpression__Group_1_0__0__Impl : ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13264:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13265:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:14350:1: ( ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:14351:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13265:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:13266:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:14351:1: ( ( rule__XOtherOperatorExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:14352:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:13267:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:13267:3: rule__XOtherOperatorExpression__Group_1_0_0__0
+            // InternalDataDSL.g:14353:2: ( rule__XOtherOperatorExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:14353:3: rule__XOtherOperatorExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0_0__0();
@@ -44576,16 +48197,16 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:13276:1: rule__XOtherOperatorExpression__Group_1_0_0__0 : rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:14362:1: rule__XOtherOperatorExpression__Group_1_0_0__0 : rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13280:1: ( rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:13281:2: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1
+            // InternalDataDSL.g:14366:1: ( rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:14367:2: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl rule__XOtherOperatorExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_103);
+            pushFollow(FOLLOW_111);
             rule__XOtherOperatorExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -44614,23 +48235,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:13288:1: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:14374:1: rule__XOtherOperatorExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13292:1: ( ( () ) )
-            // InternalDataDSL.g:13293:1: ( () )
+            // InternalDataDSL.g:14378:1: ( ( () ) )
+            // InternalDataDSL.g:14379:1: ( () )
             {
-            // InternalDataDSL.g:13293:1: ( () )
-            // InternalDataDSL.g:13294:2: ()
+            // InternalDataDSL.g:14379:1: ( () )
+            // InternalDataDSL.g:14380:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:13295:2: ()
-            // InternalDataDSL.g:13295:3: 
+            // InternalDataDSL.g:14381:2: ()
+            // InternalDataDSL.g:14381:3: 
             {
             }
 
@@ -44655,14 +48276,14 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:13303:1: rule__XOtherOperatorExpression__Group_1_0_0__1 : rule__XOtherOperatorExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:14389:1: rule__XOtherOperatorExpression__Group_1_0_0__1 : rule__XOtherOperatorExpression__Group_1_0_0__1__Impl ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13307:1: ( rule__XOtherOperatorExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:13308:2: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:14393:1: ( rule__XOtherOperatorExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:14394:2: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__Group_1_0_0__1__Impl();
@@ -44688,23 +48309,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:13314:1: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl : ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:14400:1: rule__XOtherOperatorExpression__Group_1_0_0__1__Impl : ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XOtherOperatorExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13318:1: ( ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:13319:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:14404:1: ( ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:14405:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:13319:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:13320:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:14405:1: ( ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:14406:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:13321:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:13321:3: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:14407:2: ( rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:14407:3: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1();
@@ -44739,16 +48360,16 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__0"
-    // InternalDataDSL.g:13330:1: rule__OpOther__Group_2__0 : rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 ;
+    // InternalDataDSL.g:14416:1: rule__OpOther__Group_2__0 : rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 ;
     public final void rule__OpOther__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13334:1: ( rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 )
-            // InternalDataDSL.g:13335:2: rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1
+            // InternalDataDSL.g:14420:1: ( rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1 )
+            // InternalDataDSL.g:14421:2: rule__OpOther__Group_2__0__Impl rule__OpOther__Group_2__1
             {
-            pushFollow(FOLLOW_105);
+            pushFollow(FOLLOW_113);
             rule__OpOther__Group_2__0__Impl();
 
             state._fsp--;
@@ -44777,17 +48398,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__0__Impl"
-    // InternalDataDSL.g:13342:1: rule__OpOther__Group_2__0__Impl : ( '>' ) ;
+    // InternalDataDSL.g:14428:1: rule__OpOther__Group_2__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13346:1: ( ( '>' ) )
-            // InternalDataDSL.g:13347:1: ( '>' )
+            // InternalDataDSL.g:14432:1: ( ( '>' ) )
+            // InternalDataDSL.g:14433:1: ( '>' )
             {
-            // InternalDataDSL.g:13347:1: ( '>' )
-            // InternalDataDSL.g:13348:2: '>'
+            // InternalDataDSL.g:14433:1: ( '>' )
+            // InternalDataDSL.g:14434:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0()); 
@@ -44818,14 +48439,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__1"
-    // InternalDataDSL.g:13357:1: rule__OpOther__Group_2__1 : rule__OpOther__Group_2__1__Impl ;
+    // InternalDataDSL.g:14443:1: rule__OpOther__Group_2__1 : rule__OpOther__Group_2__1__Impl ;
     public final void rule__OpOther__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13361:1: ( rule__OpOther__Group_2__1__Impl )
-            // InternalDataDSL.g:13362:2: rule__OpOther__Group_2__1__Impl
+            // InternalDataDSL.g:14447:1: ( rule__OpOther__Group_2__1__Impl )
+            // InternalDataDSL.g:14448:2: rule__OpOther__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_2__1__Impl();
@@ -44851,17 +48472,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_2__1__Impl"
-    // InternalDataDSL.g:13368:1: rule__OpOther__Group_2__1__Impl : ( '..' ) ;
+    // InternalDataDSL.g:14454:1: rule__OpOther__Group_2__1__Impl : ( '..' ) ;
     public final void rule__OpOther__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13372:1: ( ( '..' ) )
-            // InternalDataDSL.g:13373:1: ( '..' )
+            // InternalDataDSL.g:14458:1: ( ( '..' ) )
+            // InternalDataDSL.g:14459:1: ( '..' )
             {
-            // InternalDataDSL.g:13373:1: ( '..' )
-            // InternalDataDSL.g:13374:2: '..'
+            // InternalDataDSL.g:14459:1: ( '..' )
+            // InternalDataDSL.g:14460:2: '..'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getFullStopFullStopKeyword_2_1()); 
@@ -44892,16 +48513,16 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__0"
-    // InternalDataDSL.g:13384:1: rule__OpOther__Group_5__0 : rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 ;
+    // InternalDataDSL.g:14470:1: rule__OpOther__Group_5__0 : rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 ;
     public final void rule__OpOther__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13388:1: ( rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 )
-            // InternalDataDSL.g:13389:2: rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1
+            // InternalDataDSL.g:14474:1: ( rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1 )
+            // InternalDataDSL.g:14475:2: rule__OpOther__Group_5__0__Impl rule__OpOther__Group_5__1
             {
-            pushFollow(FOLLOW_106);
+            pushFollow(FOLLOW_114);
             rule__OpOther__Group_5__0__Impl();
 
             state._fsp--;
@@ -44930,17 +48551,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__0__Impl"
-    // InternalDataDSL.g:13396:1: rule__OpOther__Group_5__0__Impl : ( '>' ) ;
+    // InternalDataDSL.g:14482:1: rule__OpOther__Group_5__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13400:1: ( ( '>' ) )
-            // InternalDataDSL.g:13401:1: ( '>' )
+            // InternalDataDSL.g:14486:1: ( ( '>' ) )
+            // InternalDataDSL.g:14487:1: ( '>' )
             {
-            // InternalDataDSL.g:13401:1: ( '>' )
-            // InternalDataDSL.g:13402:2: '>'
+            // InternalDataDSL.g:14487:1: ( '>' )
+            // InternalDataDSL.g:14488:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0()); 
@@ -44971,14 +48592,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__1"
-    // InternalDataDSL.g:13411:1: rule__OpOther__Group_5__1 : rule__OpOther__Group_5__1__Impl ;
+    // InternalDataDSL.g:14497:1: rule__OpOther__Group_5__1 : rule__OpOther__Group_5__1__Impl ;
     public final void rule__OpOther__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13415:1: ( rule__OpOther__Group_5__1__Impl )
-            // InternalDataDSL.g:13416:2: rule__OpOther__Group_5__1__Impl
+            // InternalDataDSL.g:14501:1: ( rule__OpOther__Group_5__1__Impl )
+            // InternalDataDSL.g:14502:2: rule__OpOther__Group_5__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5__1__Impl();
@@ -45004,23 +48625,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5__1__Impl"
-    // InternalDataDSL.g:13422:1: rule__OpOther__Group_5__1__Impl : ( ( rule__OpOther__Alternatives_5_1 ) ) ;
+    // InternalDataDSL.g:14508:1: rule__OpOther__Group_5__1__Impl : ( ( rule__OpOther__Alternatives_5_1 ) ) ;
     public final void rule__OpOther__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13426:1: ( ( ( rule__OpOther__Alternatives_5_1 ) ) )
-            // InternalDataDSL.g:13427:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            // InternalDataDSL.g:14512:1: ( ( ( rule__OpOther__Alternatives_5_1 ) ) )
+            // InternalDataDSL.g:14513:1: ( ( rule__OpOther__Alternatives_5_1 ) )
             {
-            // InternalDataDSL.g:13427:1: ( ( rule__OpOther__Alternatives_5_1 ) )
-            // InternalDataDSL.g:13428:2: ( rule__OpOther__Alternatives_5_1 )
+            // InternalDataDSL.g:14513:1: ( ( rule__OpOther__Alternatives_5_1 ) )
+            // InternalDataDSL.g:14514:2: ( rule__OpOther__Alternatives_5_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives_5_1()); 
             }
-            // InternalDataDSL.g:13429:2: ( rule__OpOther__Alternatives_5_1 )
-            // InternalDataDSL.g:13429:3: rule__OpOther__Alternatives_5_1
+            // InternalDataDSL.g:14515:2: ( rule__OpOther__Alternatives_5_1 )
+            // InternalDataDSL.g:14515:3: rule__OpOther__Alternatives_5_1
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives_5_1();
@@ -45055,14 +48676,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0__0"
-    // InternalDataDSL.g:13438:1: rule__OpOther__Group_5_1_0__0 : rule__OpOther__Group_5_1_0__0__Impl ;
+    // InternalDataDSL.g:14524:1: rule__OpOther__Group_5_1_0__0 : rule__OpOther__Group_5_1_0__0__Impl ;
     public final void rule__OpOther__Group_5_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13442:1: ( rule__OpOther__Group_5_1_0__0__Impl )
-            // InternalDataDSL.g:13443:2: rule__OpOther__Group_5_1_0__0__Impl
+            // InternalDataDSL.g:14528:1: ( rule__OpOther__Group_5_1_0__0__Impl )
+            // InternalDataDSL.g:14529:2: rule__OpOther__Group_5_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0__0__Impl();
@@ -45088,23 +48709,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0__0__Impl"
-    // InternalDataDSL.g:13449:1: rule__OpOther__Group_5_1_0__0__Impl : ( ( rule__OpOther__Group_5_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:14535:1: rule__OpOther__Group_5_1_0__0__Impl : ( ( rule__OpOther__Group_5_1_0_0__0 ) ) ;
     public final void rule__OpOther__Group_5_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13453:1: ( ( ( rule__OpOther__Group_5_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13454:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            // InternalDataDSL.g:14539:1: ( ( ( rule__OpOther__Group_5_1_0_0__0 ) ) )
+            // InternalDataDSL.g:14540:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13454:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
-            // InternalDataDSL.g:13455:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            // InternalDataDSL.g:14540:1: ( ( rule__OpOther__Group_5_1_0_0__0 ) )
+            // InternalDataDSL.g:14541:2: ( rule__OpOther__Group_5_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGroup_5_1_0_0()); 
             }
-            // InternalDataDSL.g:13456:2: ( rule__OpOther__Group_5_1_0_0__0 )
-            // InternalDataDSL.g:13456:3: rule__OpOther__Group_5_1_0_0__0
+            // InternalDataDSL.g:14542:2: ( rule__OpOther__Group_5_1_0_0__0 )
+            // InternalDataDSL.g:14542:3: rule__OpOther__Group_5_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0_0__0();
@@ -45139,16 +48760,16 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__0"
-    // InternalDataDSL.g:13465:1: rule__OpOther__Group_5_1_0_0__0 : rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 ;
+    // InternalDataDSL.g:14551:1: rule__OpOther__Group_5_1_0_0__0 : rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 ;
     public final void rule__OpOther__Group_5_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13469:1: ( rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 )
-            // InternalDataDSL.g:13470:2: rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1
+            // InternalDataDSL.g:14555:1: ( rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1 )
+            // InternalDataDSL.g:14556:2: rule__OpOther__Group_5_1_0_0__0__Impl rule__OpOther__Group_5_1_0_0__1
             {
-            pushFollow(FOLLOW_106);
+            pushFollow(FOLLOW_114);
             rule__OpOther__Group_5_1_0_0__0__Impl();
 
             state._fsp--;
@@ -45177,17 +48798,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__0__Impl"
-    // InternalDataDSL.g:13477:1: rule__OpOther__Group_5_1_0_0__0__Impl : ( '>' ) ;
+    // InternalDataDSL.g:14563:1: rule__OpOther__Group_5_1_0_0__0__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13481:1: ( ( '>' ) )
-            // InternalDataDSL.g:13482:1: ( '>' )
+            // InternalDataDSL.g:14567:1: ( ( '>' ) )
+            // InternalDataDSL.g:14568:1: ( '>' )
             {
-            // InternalDataDSL.g:13482:1: ( '>' )
-            // InternalDataDSL.g:13483:2: '>'
+            // InternalDataDSL.g:14568:1: ( '>' )
+            // InternalDataDSL.g:14569:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0()); 
@@ -45218,14 +48839,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__1"
-    // InternalDataDSL.g:13492:1: rule__OpOther__Group_5_1_0_0__1 : rule__OpOther__Group_5_1_0_0__1__Impl ;
+    // InternalDataDSL.g:14578:1: rule__OpOther__Group_5_1_0_0__1 : rule__OpOther__Group_5_1_0_0__1__Impl ;
     public final void rule__OpOther__Group_5_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13496:1: ( rule__OpOther__Group_5_1_0_0__1__Impl )
-            // InternalDataDSL.g:13497:2: rule__OpOther__Group_5_1_0_0__1__Impl
+            // InternalDataDSL.g:14582:1: ( rule__OpOther__Group_5_1_0_0__1__Impl )
+            // InternalDataDSL.g:14583:2: rule__OpOther__Group_5_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_5_1_0_0__1__Impl();
@@ -45251,17 +48872,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_5_1_0_0__1__Impl"
-    // InternalDataDSL.g:13503:1: rule__OpOther__Group_5_1_0_0__1__Impl : ( '>' ) ;
+    // InternalDataDSL.g:14589:1: rule__OpOther__Group_5_1_0_0__1__Impl : ( '>' ) ;
     public final void rule__OpOther__Group_5_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13507:1: ( ( '>' ) )
-            // InternalDataDSL.g:13508:1: ( '>' )
+            // InternalDataDSL.g:14593:1: ( ( '>' ) )
+            // InternalDataDSL.g:14594:1: ( '>' )
             {
-            // InternalDataDSL.g:13508:1: ( '>' )
-            // InternalDataDSL.g:13509:2: '>'
+            // InternalDataDSL.g:14594:1: ( '>' )
+            // InternalDataDSL.g:14595:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_1()); 
@@ -45292,16 +48913,16 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__0"
-    // InternalDataDSL.g:13519:1: rule__OpOther__Group_6__0 : rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 ;
+    // InternalDataDSL.g:14605:1: rule__OpOther__Group_6__0 : rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 ;
     public final void rule__OpOther__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13523:1: ( rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 )
-            // InternalDataDSL.g:13524:2: rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1
+            // InternalDataDSL.g:14609:1: ( rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1 )
+            // InternalDataDSL.g:14610:2: rule__OpOther__Group_6__0__Impl rule__OpOther__Group_6__1
             {
-            pushFollow(FOLLOW_107);
+            pushFollow(FOLLOW_115);
             rule__OpOther__Group_6__0__Impl();
 
             state._fsp--;
@@ -45330,17 +48951,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__0__Impl"
-    // InternalDataDSL.g:13531:1: rule__OpOther__Group_6__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:14617:1: rule__OpOther__Group_6__0__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13535:1: ( ( '<' ) )
-            // InternalDataDSL.g:13536:1: ( '<' )
+            // InternalDataDSL.g:14621:1: ( ( '<' ) )
+            // InternalDataDSL.g:14622:1: ( '<' )
             {
-            // InternalDataDSL.g:13536:1: ( '<' )
-            // InternalDataDSL.g:13537:2: '<'
+            // InternalDataDSL.g:14622:1: ( '<' )
+            // InternalDataDSL.g:14623:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0()); 
@@ -45371,14 +48992,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__1"
-    // InternalDataDSL.g:13546:1: rule__OpOther__Group_6__1 : rule__OpOther__Group_6__1__Impl ;
+    // InternalDataDSL.g:14632:1: rule__OpOther__Group_6__1 : rule__OpOther__Group_6__1__Impl ;
     public final void rule__OpOther__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13550:1: ( rule__OpOther__Group_6__1__Impl )
-            // InternalDataDSL.g:13551:2: rule__OpOther__Group_6__1__Impl
+            // InternalDataDSL.g:14636:1: ( rule__OpOther__Group_6__1__Impl )
+            // InternalDataDSL.g:14637:2: rule__OpOther__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6__1__Impl();
@@ -45404,23 +49025,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6__1__Impl"
-    // InternalDataDSL.g:13557:1: rule__OpOther__Group_6__1__Impl : ( ( rule__OpOther__Alternatives_6_1 ) ) ;
+    // InternalDataDSL.g:14643:1: rule__OpOther__Group_6__1__Impl : ( ( rule__OpOther__Alternatives_6_1 ) ) ;
     public final void rule__OpOther__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13561:1: ( ( ( rule__OpOther__Alternatives_6_1 ) ) )
-            // InternalDataDSL.g:13562:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            // InternalDataDSL.g:14647:1: ( ( ( rule__OpOther__Alternatives_6_1 ) ) )
+            // InternalDataDSL.g:14648:1: ( ( rule__OpOther__Alternatives_6_1 ) )
             {
-            // InternalDataDSL.g:13562:1: ( ( rule__OpOther__Alternatives_6_1 ) )
-            // InternalDataDSL.g:13563:2: ( rule__OpOther__Alternatives_6_1 )
+            // InternalDataDSL.g:14648:1: ( ( rule__OpOther__Alternatives_6_1 ) )
+            // InternalDataDSL.g:14649:2: ( rule__OpOther__Alternatives_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getAlternatives_6_1()); 
             }
-            // InternalDataDSL.g:13564:2: ( rule__OpOther__Alternatives_6_1 )
-            // InternalDataDSL.g:13564:3: rule__OpOther__Alternatives_6_1
+            // InternalDataDSL.g:14650:2: ( rule__OpOther__Alternatives_6_1 )
+            // InternalDataDSL.g:14650:3: rule__OpOther__Alternatives_6_1
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Alternatives_6_1();
@@ -45455,14 +49076,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0__0"
-    // InternalDataDSL.g:13573:1: rule__OpOther__Group_6_1_0__0 : rule__OpOther__Group_6_1_0__0__Impl ;
+    // InternalDataDSL.g:14659:1: rule__OpOther__Group_6_1_0__0 : rule__OpOther__Group_6_1_0__0__Impl ;
     public final void rule__OpOther__Group_6_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13577:1: ( rule__OpOther__Group_6_1_0__0__Impl )
-            // InternalDataDSL.g:13578:2: rule__OpOther__Group_6_1_0__0__Impl
+            // InternalDataDSL.g:14663:1: ( rule__OpOther__Group_6_1_0__0__Impl )
+            // InternalDataDSL.g:14664:2: rule__OpOther__Group_6_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0__0__Impl();
@@ -45488,23 +49109,23 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0__0__Impl"
-    // InternalDataDSL.g:13584:1: rule__OpOther__Group_6_1_0__0__Impl : ( ( rule__OpOther__Group_6_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:14670:1: rule__OpOther__Group_6_1_0__0__Impl : ( ( rule__OpOther__Group_6_1_0_0__0 ) ) ;
     public final void rule__OpOther__Group_6_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13588:1: ( ( ( rule__OpOther__Group_6_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13589:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            // InternalDataDSL.g:14674:1: ( ( ( rule__OpOther__Group_6_1_0_0__0 ) ) )
+            // InternalDataDSL.g:14675:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13589:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
-            // InternalDataDSL.g:13590:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            // InternalDataDSL.g:14675:1: ( ( rule__OpOther__Group_6_1_0_0__0 ) )
+            // InternalDataDSL.g:14676:2: ( rule__OpOther__Group_6_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getGroup_6_1_0_0()); 
             }
-            // InternalDataDSL.g:13591:2: ( rule__OpOther__Group_6_1_0_0__0 )
-            // InternalDataDSL.g:13591:3: rule__OpOther__Group_6_1_0_0__0
+            // InternalDataDSL.g:14677:2: ( rule__OpOther__Group_6_1_0_0__0 )
+            // InternalDataDSL.g:14677:3: rule__OpOther__Group_6_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0_0__0();
@@ -45539,16 +49160,16 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__0"
-    // InternalDataDSL.g:13600:1: rule__OpOther__Group_6_1_0_0__0 : rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 ;
+    // InternalDataDSL.g:14686:1: rule__OpOther__Group_6_1_0_0__0 : rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 ;
     public final void rule__OpOther__Group_6_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13604:1: ( rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 )
-            // InternalDataDSL.g:13605:2: rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1
+            // InternalDataDSL.g:14690:1: ( rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1 )
+            // InternalDataDSL.g:14691:2: rule__OpOther__Group_6_1_0_0__0__Impl rule__OpOther__Group_6_1_0_0__1
             {
-            pushFollow(FOLLOW_91);
+            pushFollow(FOLLOW_99);
             rule__OpOther__Group_6_1_0_0__0__Impl();
 
             state._fsp--;
@@ -45577,17 +49198,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__0__Impl"
-    // InternalDataDSL.g:13612:1: rule__OpOther__Group_6_1_0_0__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:14698:1: rule__OpOther__Group_6_1_0_0__0__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13616:1: ( ( '<' ) )
-            // InternalDataDSL.g:13617:1: ( '<' )
+            // InternalDataDSL.g:14702:1: ( ( '<' ) )
+            // InternalDataDSL.g:14703:1: ( '<' )
             {
-            // InternalDataDSL.g:13617:1: ( '<' )
-            // InternalDataDSL.g:13618:2: '<'
+            // InternalDataDSL.g:14703:1: ( '<' )
+            // InternalDataDSL.g:14704:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0()); 
@@ -45618,14 +49239,14 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__1"
-    // InternalDataDSL.g:13627:1: rule__OpOther__Group_6_1_0_0__1 : rule__OpOther__Group_6_1_0_0__1__Impl ;
+    // InternalDataDSL.g:14713:1: rule__OpOther__Group_6_1_0_0__1 : rule__OpOther__Group_6_1_0_0__1__Impl ;
     public final void rule__OpOther__Group_6_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13631:1: ( rule__OpOther__Group_6_1_0_0__1__Impl )
-            // InternalDataDSL.g:13632:2: rule__OpOther__Group_6_1_0_0__1__Impl
+            // InternalDataDSL.g:14717:1: ( rule__OpOther__Group_6_1_0_0__1__Impl )
+            // InternalDataDSL.g:14718:2: rule__OpOther__Group_6_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__OpOther__Group_6_1_0_0__1__Impl();
@@ -45651,17 +49272,17 @@
 
 
     // $ANTLR start "rule__OpOther__Group_6_1_0_0__1__Impl"
-    // InternalDataDSL.g:13638:1: rule__OpOther__Group_6_1_0_0__1__Impl : ( '<' ) ;
+    // InternalDataDSL.g:14724:1: rule__OpOther__Group_6_1_0_0__1__Impl : ( '<' ) ;
     public final void rule__OpOther__Group_6_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13642:1: ( ( '<' ) )
-            // InternalDataDSL.g:13643:1: ( '<' )
+            // InternalDataDSL.g:14728:1: ( ( '<' ) )
+            // InternalDataDSL.g:14729:1: ( '<' )
             {
-            // InternalDataDSL.g:13643:1: ( '<' )
-            // InternalDataDSL.g:13644:2: '<'
+            // InternalDataDSL.g:14729:1: ( '<' )
+            // InternalDataDSL.g:14730:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_1()); 
@@ -45692,16 +49313,16 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__0"
-    // InternalDataDSL.g:13654:1: rule__XAdditiveExpression__Group__0 : rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 ;
+    // InternalDataDSL.g:14740:1: rule__XAdditiveExpression__Group__0 : rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 ;
     public final void rule__XAdditiveExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13658:1: ( rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 )
-            // InternalDataDSL.g:13659:2: rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1
+            // InternalDataDSL.g:14744:1: ( rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1 )
+            // InternalDataDSL.g:14745:2: rule__XAdditiveExpression__Group__0__Impl rule__XAdditiveExpression__Group__1
             {
-            pushFollow(FOLLOW_108);
+            pushFollow(FOLLOW_116);
             rule__XAdditiveExpression__Group__0__Impl();
 
             state._fsp--;
@@ -45730,17 +49351,17 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__0__Impl"
-    // InternalDataDSL.g:13666:1: rule__XAdditiveExpression__Group__0__Impl : ( ruleXMultiplicativeExpression ) ;
+    // InternalDataDSL.g:14752:1: rule__XAdditiveExpression__Group__0__Impl : ( ruleXMultiplicativeExpression ) ;
     public final void rule__XAdditiveExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13670:1: ( ( ruleXMultiplicativeExpression ) )
-            // InternalDataDSL.g:13671:1: ( ruleXMultiplicativeExpression )
+            // InternalDataDSL.g:14756:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalDataDSL.g:14757:1: ( ruleXMultiplicativeExpression )
             {
-            // InternalDataDSL.g:13671:1: ( ruleXMultiplicativeExpression )
-            // InternalDataDSL.g:13672:2: ruleXMultiplicativeExpression
+            // InternalDataDSL.g:14757:1: ( ruleXMultiplicativeExpression )
+            // InternalDataDSL.g:14758:2: ruleXMultiplicativeExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0()); 
@@ -45775,14 +49396,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__1"
-    // InternalDataDSL.g:13681:1: rule__XAdditiveExpression__Group__1 : rule__XAdditiveExpression__Group__1__Impl ;
+    // InternalDataDSL.g:14767:1: rule__XAdditiveExpression__Group__1 : rule__XAdditiveExpression__Group__1__Impl ;
     public final void rule__XAdditiveExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13685:1: ( rule__XAdditiveExpression__Group__1__Impl )
-            // InternalDataDSL.g:13686:2: rule__XAdditiveExpression__Group__1__Impl
+            // InternalDataDSL.g:14771:1: ( rule__XAdditiveExpression__Group__1__Impl )
+            // InternalDataDSL.g:14772:2: rule__XAdditiveExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group__1__Impl();
@@ -45808,52 +49429,52 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group__1__Impl"
-    // InternalDataDSL.g:13692:1: rule__XAdditiveExpression__Group__1__Impl : ( ( rule__XAdditiveExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:14778:1: rule__XAdditiveExpression__Group__1__Impl : ( ( rule__XAdditiveExpression__Group_1__0 )* ) ;
     public final void rule__XAdditiveExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13696:1: ( ( ( rule__XAdditiveExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:13697:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14782:1: ( ( ( rule__XAdditiveExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:14783:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:13697:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
-            // InternalDataDSL.g:13698:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            // InternalDataDSL.g:14783:1: ( ( rule__XAdditiveExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14784:2: ( rule__XAdditiveExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:13699:2: ( rule__XAdditiveExpression__Group_1__0 )*
-            loop117:
+            // InternalDataDSL.g:14785:2: ( rule__XAdditiveExpression__Group_1__0 )*
+            loop122:
             do {
-                int alt117=2;
-                int LA117_0 = input.LA(1);
+                int alt122=2;
+                int LA122_0 = input.LA(1);
 
-                if ( (LA117_0==35) ) {
-                    int LA117_2 = input.LA(2);
+                if ( (LA122_0==35) ) {
+                    int LA122_2 = input.LA(2);
 
-                    if ( (synpred177_InternalDataDSL()) ) {
-                        alt117=1;
+                    if ( (synpred188_InternalDataDSL()) ) {
+                        alt122=1;
                     }
 
 
                 }
-                else if ( (LA117_0==34) ) {
-                    int LA117_3 = input.LA(2);
+                else if ( (LA122_0==34) ) {
+                    int LA122_3 = input.LA(2);
 
-                    if ( (synpred177_InternalDataDSL()) ) {
-                        alt117=1;
+                    if ( (synpred188_InternalDataDSL()) ) {
+                        alt122=1;
                     }
 
 
                 }
 
 
-                switch (alt117) {
+                switch (alt122) {
             	case 1 :
-            	    // InternalDataDSL.g:13699:3: rule__XAdditiveExpression__Group_1__0
+            	    // InternalDataDSL.g:14785:3: rule__XAdditiveExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_109);
+            	    pushFollow(FOLLOW_117);
             	    rule__XAdditiveExpression__Group_1__0();
 
             	    state._fsp--;
@@ -45863,7 +49484,7 @@
             	    break;
 
             	default :
-            	    break loop117;
+            	    break loop122;
                 }
             } while (true);
 
@@ -45892,16 +49513,16 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__0"
-    // InternalDataDSL.g:13708:1: rule__XAdditiveExpression__Group_1__0 : rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 ;
+    // InternalDataDSL.g:14794:1: rule__XAdditiveExpression__Group_1__0 : rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 ;
     public final void rule__XAdditiveExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13712:1: ( rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 )
-            // InternalDataDSL.g:13713:2: rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1
+            // InternalDataDSL.g:14798:1: ( rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1 )
+            // InternalDataDSL.g:14799:2: rule__XAdditiveExpression__Group_1__0__Impl rule__XAdditiveExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XAdditiveExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -45930,23 +49551,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:13720:1: rule__XAdditiveExpression__Group_1__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:14806:1: rule__XAdditiveExpression__Group_1__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) ;
     public final void rule__XAdditiveExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13724:1: ( ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:13725:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:14810:1: ( ( ( rule__XAdditiveExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:14811:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:13725:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:13726:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            // InternalDataDSL.g:14811:1: ( ( rule__XAdditiveExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:14812:2: ( rule__XAdditiveExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:13727:2: ( rule__XAdditiveExpression__Group_1_0__0 )
-            // InternalDataDSL.g:13727:3: rule__XAdditiveExpression__Group_1_0__0
+            // InternalDataDSL.g:14813:2: ( rule__XAdditiveExpression__Group_1_0__0 )
+            // InternalDataDSL.g:14813:3: rule__XAdditiveExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0__0();
@@ -45981,14 +49602,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__1"
-    // InternalDataDSL.g:13735:1: rule__XAdditiveExpression__Group_1__1 : rule__XAdditiveExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:14821:1: rule__XAdditiveExpression__Group_1__1 : rule__XAdditiveExpression__Group_1__1__Impl ;
     public final void rule__XAdditiveExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13739:1: ( rule__XAdditiveExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:13740:2: rule__XAdditiveExpression__Group_1__1__Impl
+            // InternalDataDSL.g:14825:1: ( rule__XAdditiveExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:14826:2: rule__XAdditiveExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1__1__Impl();
@@ -46014,23 +49635,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:13746:1: rule__XAdditiveExpression__Group_1__1__Impl : ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:14832:1: rule__XAdditiveExpression__Group_1__1__Impl : ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XAdditiveExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13750:1: ( ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:13751:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:14836:1: ( ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:14837:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:13751:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:13752:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:14837:1: ( ( rule__XAdditiveExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:14838:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:13753:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:13753:3: rule__XAdditiveExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:14839:2: ( rule__XAdditiveExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:14839:3: rule__XAdditiveExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__RightOperandAssignment_1_1();
@@ -46065,14 +49686,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0"
-    // InternalDataDSL.g:13762:1: rule__XAdditiveExpression__Group_1_0__0 : rule__XAdditiveExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:14848:1: rule__XAdditiveExpression__Group_1_0__0 : rule__XAdditiveExpression__Group_1_0__0__Impl ;
     public final void rule__XAdditiveExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13766:1: ( rule__XAdditiveExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:13767:2: rule__XAdditiveExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:14852:1: ( rule__XAdditiveExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:14853:2: rule__XAdditiveExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0__0__Impl();
@@ -46098,23 +49719,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:13773:1: rule__XAdditiveExpression__Group_1_0__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:14859:1: rule__XAdditiveExpression__Group_1_0__0__Impl : ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XAdditiveExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13777:1: ( ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13778:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:14863:1: ( ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:14864:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13778:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:13779:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:14864:1: ( ( rule__XAdditiveExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:14865:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:13780:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:13780:3: rule__XAdditiveExpression__Group_1_0_0__0
+            // InternalDataDSL.g:14866:2: ( rule__XAdditiveExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:14866:3: rule__XAdditiveExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0_0__0();
@@ -46149,16 +49770,16 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:13789:1: rule__XAdditiveExpression__Group_1_0_0__0 : rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:14875:1: rule__XAdditiveExpression__Group_1_0_0__0 : rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 ;
     public final void rule__XAdditiveExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13793:1: ( rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:13794:2: rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1
+            // InternalDataDSL.g:14879:1: ( rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:14880:2: rule__XAdditiveExpression__Group_1_0_0__0__Impl rule__XAdditiveExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_108);
+            pushFollow(FOLLOW_116);
             rule__XAdditiveExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -46187,23 +49808,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:13801:1: rule__XAdditiveExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:14887:1: rule__XAdditiveExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XAdditiveExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13805:1: ( ( () ) )
-            // InternalDataDSL.g:13806:1: ( () )
+            // InternalDataDSL.g:14891:1: ( ( () ) )
+            // InternalDataDSL.g:14892:1: ( () )
             {
-            // InternalDataDSL.g:13806:1: ( () )
-            // InternalDataDSL.g:13807:2: ()
+            // InternalDataDSL.g:14892:1: ( () )
+            // InternalDataDSL.g:14893:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:13808:2: ()
-            // InternalDataDSL.g:13808:3: 
+            // InternalDataDSL.g:14894:2: ()
+            // InternalDataDSL.g:14894:3: 
             {
             }
 
@@ -46228,14 +49849,14 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:13816:1: rule__XAdditiveExpression__Group_1_0_0__1 : rule__XAdditiveExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:14902:1: rule__XAdditiveExpression__Group_1_0_0__1 : rule__XAdditiveExpression__Group_1_0_0__1__Impl ;
     public final void rule__XAdditiveExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13820:1: ( rule__XAdditiveExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:13821:2: rule__XAdditiveExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:14906:1: ( rule__XAdditiveExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:14907:2: rule__XAdditiveExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__Group_1_0_0__1__Impl();
@@ -46261,23 +49882,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:13827:1: rule__XAdditiveExpression__Group_1_0_0__1__Impl : ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:14913:1: rule__XAdditiveExpression__Group_1_0_0__1__Impl : ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XAdditiveExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13831:1: ( ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:13832:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:14917:1: ( ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:14918:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:13832:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:13833:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:14918:1: ( ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:14919:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:13834:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:13834:3: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:14920:2: ( rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:14920:3: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XAdditiveExpression__FeatureAssignment_1_0_0_1();
@@ -46312,16 +49933,16 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__0"
-    // InternalDataDSL.g:13843:1: rule__XMultiplicativeExpression__Group__0 : rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 ;
+    // InternalDataDSL.g:14929:1: rule__XMultiplicativeExpression__Group__0 : rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 ;
     public final void rule__XMultiplicativeExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13847:1: ( rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 )
-            // InternalDataDSL.g:13848:2: rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1
+            // InternalDataDSL.g:14933:1: ( rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1 )
+            // InternalDataDSL.g:14934:2: rule__XMultiplicativeExpression__Group__0__Impl rule__XMultiplicativeExpression__Group__1
             {
-            pushFollow(FOLLOW_110);
+            pushFollow(FOLLOW_118);
             rule__XMultiplicativeExpression__Group__0__Impl();
 
             state._fsp--;
@@ -46350,17 +49971,17 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__0__Impl"
-    // InternalDataDSL.g:13855:1: rule__XMultiplicativeExpression__Group__0__Impl : ( ruleXUnaryOperation ) ;
+    // InternalDataDSL.g:14941:1: rule__XMultiplicativeExpression__Group__0__Impl : ( ruleXUnaryOperation ) ;
     public final void rule__XMultiplicativeExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13859:1: ( ( ruleXUnaryOperation ) )
-            // InternalDataDSL.g:13860:1: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:14945:1: ( ( ruleXUnaryOperation ) )
+            // InternalDataDSL.g:14946:1: ( ruleXUnaryOperation )
             {
-            // InternalDataDSL.g:13860:1: ( ruleXUnaryOperation )
-            // InternalDataDSL.g:13861:2: ruleXUnaryOperation
+            // InternalDataDSL.g:14946:1: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:14947:2: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0()); 
@@ -46395,14 +50016,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__1"
-    // InternalDataDSL.g:13870:1: rule__XMultiplicativeExpression__Group__1 : rule__XMultiplicativeExpression__Group__1__Impl ;
+    // InternalDataDSL.g:14956:1: rule__XMultiplicativeExpression__Group__1 : rule__XMultiplicativeExpression__Group__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13874:1: ( rule__XMultiplicativeExpression__Group__1__Impl )
-            // InternalDataDSL.g:13875:2: rule__XMultiplicativeExpression__Group__1__Impl
+            // InternalDataDSL.g:14960:1: ( rule__XMultiplicativeExpression__Group__1__Impl )
+            // InternalDataDSL.g:14961:2: rule__XMultiplicativeExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group__1__Impl();
@@ -46428,32 +50049,32 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group__1__Impl"
-    // InternalDataDSL.g:13881:1: rule__XMultiplicativeExpression__Group__1__Impl : ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:14967:1: rule__XMultiplicativeExpression__Group__1__Impl : ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) ;
     public final void rule__XMultiplicativeExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13885:1: ( ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:13886:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14971:1: ( ( ( rule__XMultiplicativeExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:14972:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:13886:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
-            // InternalDataDSL.g:13887:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            // InternalDataDSL.g:14972:1: ( ( rule__XMultiplicativeExpression__Group_1__0 )* )
+            // InternalDataDSL.g:14973:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:13888:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
-            loop118:
+            // InternalDataDSL.g:14974:2: ( rule__XMultiplicativeExpression__Group_1__0 )*
+            loop123:
             do {
-                int alt118=2;
+                int alt123=2;
                 switch ( input.LA(1) ) {
                 case 36:
                     {
-                    int LA118_2 = input.LA(2);
+                    int LA123_2 = input.LA(2);
 
-                    if ( (synpred178_InternalDataDSL()) ) {
-                        alt118=1;
+                    if ( (synpred189_InternalDataDSL()) ) {
+                        alt123=1;
                     }
 
 
@@ -46461,10 +50082,10 @@
                     break;
                 case 37:
                     {
-                    int LA118_3 = input.LA(2);
+                    int LA123_3 = input.LA(2);
 
-                    if ( (synpred178_InternalDataDSL()) ) {
-                        alt118=1;
+                    if ( (synpred189_InternalDataDSL()) ) {
+                        alt123=1;
                     }
 
 
@@ -46472,10 +50093,10 @@
                     break;
                 case 38:
                     {
-                    int LA118_4 = input.LA(2);
+                    int LA123_4 = input.LA(2);
 
-                    if ( (synpred178_InternalDataDSL()) ) {
-                        alt118=1;
+                    if ( (synpred189_InternalDataDSL()) ) {
+                        alt123=1;
                     }
 
 
@@ -46483,10 +50104,10 @@
                     break;
                 case 39:
                     {
-                    int LA118_5 = input.LA(2);
+                    int LA123_5 = input.LA(2);
 
-                    if ( (synpred178_InternalDataDSL()) ) {
-                        alt118=1;
+                    if ( (synpred189_InternalDataDSL()) ) {
+                        alt123=1;
                     }
 
 
@@ -46495,11 +50116,11 @@
 
                 }
 
-                switch (alt118) {
+                switch (alt123) {
             	case 1 :
-            	    // InternalDataDSL.g:13888:3: rule__XMultiplicativeExpression__Group_1__0
+            	    // InternalDataDSL.g:14974:3: rule__XMultiplicativeExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_111);
+            	    pushFollow(FOLLOW_119);
             	    rule__XMultiplicativeExpression__Group_1__0();
 
             	    state._fsp--;
@@ -46509,7 +50130,7 @@
             	    break;
 
             	default :
-            	    break loop118;
+            	    break loop123;
                 }
             } while (true);
 
@@ -46538,16 +50159,16 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0"
-    // InternalDataDSL.g:13897:1: rule__XMultiplicativeExpression__Group_1__0 : rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 ;
+    // InternalDataDSL.g:14983:1: rule__XMultiplicativeExpression__Group_1__0 : rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 ;
     public final void rule__XMultiplicativeExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13901:1: ( rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 )
-            // InternalDataDSL.g:13902:2: rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1
+            // InternalDataDSL.g:14987:1: ( rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1 )
+            // InternalDataDSL.g:14988:2: rule__XMultiplicativeExpression__Group_1__0__Impl rule__XMultiplicativeExpression__Group_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XMultiplicativeExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -46576,23 +50197,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:13909:1: rule__XMultiplicativeExpression__Group_1__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:14995:1: rule__XMultiplicativeExpression__Group_1__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13913:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:13914:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:14999:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:15000:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:13914:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:13915:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            // InternalDataDSL.g:15000:1: ( ( rule__XMultiplicativeExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:15001:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:13916:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
-            // InternalDataDSL.g:13916:3: rule__XMultiplicativeExpression__Group_1_0__0
+            // InternalDataDSL.g:15002:2: ( rule__XMultiplicativeExpression__Group_1_0__0 )
+            // InternalDataDSL.g:15002:3: rule__XMultiplicativeExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0__0();
@@ -46627,14 +50248,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1"
-    // InternalDataDSL.g:13924:1: rule__XMultiplicativeExpression__Group_1__1 : rule__XMultiplicativeExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:15010:1: rule__XMultiplicativeExpression__Group_1__1 : rule__XMultiplicativeExpression__Group_1__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13928:1: ( rule__XMultiplicativeExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:13929:2: rule__XMultiplicativeExpression__Group_1__1__Impl
+            // InternalDataDSL.g:15014:1: ( rule__XMultiplicativeExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:15015:2: rule__XMultiplicativeExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1__1__Impl();
@@ -46660,23 +50281,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:13935:1: rule__XMultiplicativeExpression__Group_1__1__Impl : ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:15021:1: rule__XMultiplicativeExpression__Group_1__1__Impl : ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13939:1: ( ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) )
-            // InternalDataDSL.g:13940:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:15025:1: ( ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) ) )
+            // InternalDataDSL.g:15026:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:13940:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
-            // InternalDataDSL.g:13941:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:15026:1: ( ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 ) )
+            // InternalDataDSL.g:15027:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandAssignment_1_1()); 
             }
-            // InternalDataDSL.g:13942:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
-            // InternalDataDSL.g:13942:3: rule__XMultiplicativeExpression__RightOperandAssignment_1_1
+            // InternalDataDSL.g:15028:2: ( rule__XMultiplicativeExpression__RightOperandAssignment_1_1 )
+            // InternalDataDSL.g:15028:3: rule__XMultiplicativeExpression__RightOperandAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__RightOperandAssignment_1_1();
@@ -46711,14 +50332,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0"
-    // InternalDataDSL.g:13951:1: rule__XMultiplicativeExpression__Group_1_0__0 : rule__XMultiplicativeExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:15037:1: rule__XMultiplicativeExpression__Group_1_0__0 : rule__XMultiplicativeExpression__Group_1_0__0__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13955:1: ( rule__XMultiplicativeExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:13956:2: rule__XMultiplicativeExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:15041:1: ( rule__XMultiplicativeExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:15042:2: rule__XMultiplicativeExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0__0__Impl();
@@ -46744,23 +50365,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:13962:1: rule__XMultiplicativeExpression__Group_1_0__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:15048:1: rule__XMultiplicativeExpression__Group_1_0__0__Impl : ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13966:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:13967:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15052:1: ( ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:15053:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:13967:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:13968:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:15053:1: ( ( rule__XMultiplicativeExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15054:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:13969:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:13969:3: rule__XMultiplicativeExpression__Group_1_0_0__0
+            // InternalDataDSL.g:15055:2: ( rule__XMultiplicativeExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:15055:3: rule__XMultiplicativeExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0_0__0();
@@ -46795,16 +50416,16 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:13978:1: rule__XMultiplicativeExpression__Group_1_0_0__0 : rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:15064:1: rule__XMultiplicativeExpression__Group_1_0_0__0 : rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13982:1: ( rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:13983:2: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1
+            // InternalDataDSL.g:15068:1: ( rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:15069:2: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl rule__XMultiplicativeExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_110);
+            pushFollow(FOLLOW_118);
             rule__XMultiplicativeExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -46833,23 +50454,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:13990:1: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15076:1: rule__XMultiplicativeExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:13994:1: ( ( () ) )
-            // InternalDataDSL.g:13995:1: ( () )
+            // InternalDataDSL.g:15080:1: ( ( () ) )
+            // InternalDataDSL.g:15081:1: ( () )
             {
-            // InternalDataDSL.g:13995:1: ( () )
-            // InternalDataDSL.g:13996:2: ()
+            // InternalDataDSL.g:15081:1: ( () )
+            // InternalDataDSL.g:15082:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getXBinaryOperationLeftOperandAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:13997:2: ()
-            // InternalDataDSL.g:13997:3: 
+            // InternalDataDSL.g:15083:2: ()
+            // InternalDataDSL.g:15083:3: 
             {
             }
 
@@ -46874,14 +50495,14 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:14005:1: rule__XMultiplicativeExpression__Group_1_0_0__1 : rule__XMultiplicativeExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:15091:1: rule__XMultiplicativeExpression__Group_1_0_0__1 : rule__XMultiplicativeExpression__Group_1_0_0__1__Impl ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14009:1: ( rule__XMultiplicativeExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:14010:2: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:15095:1: ( rule__XMultiplicativeExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:15096:2: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__Group_1_0_0__1__Impl();
@@ -46907,23 +50528,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:14016:1: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl : ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:15102:1: rule__XMultiplicativeExpression__Group_1_0_0__1__Impl : ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) ;
     public final void rule__XMultiplicativeExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14020:1: ( ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) )
-            // InternalDataDSL.g:14021:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:15106:1: ( ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) ) )
+            // InternalDataDSL.g:15107:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:14021:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
-            // InternalDataDSL.g:14022:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:15107:1: ( ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 ) )
+            // InternalDataDSL.g:15108:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureAssignment_1_0_0_1()); 
             }
-            // InternalDataDSL.g:14023:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
-            // InternalDataDSL.g:14023:3: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
+            // InternalDataDSL.g:15109:2: ( rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 )
+            // InternalDataDSL.g:15109:3: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1();
@@ -46958,16 +50579,16 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__0"
-    // InternalDataDSL.g:14032:1: rule__XUnaryOperation__Group_0__0 : rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 ;
+    // InternalDataDSL.g:15118:1: rule__XUnaryOperation__Group_0__0 : rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 ;
     public final void rule__XUnaryOperation__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14036:1: ( rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 )
-            // InternalDataDSL.g:14037:2: rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1
+            // InternalDataDSL.g:15122:1: ( rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1 )
+            // InternalDataDSL.g:15123:2: rule__XUnaryOperation__Group_0__0__Impl rule__XUnaryOperation__Group_0__1
             {
-            pushFollow(FOLLOW_112);
+            pushFollow(FOLLOW_120);
             rule__XUnaryOperation__Group_0__0__Impl();
 
             state._fsp--;
@@ -46996,23 +50617,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__0__Impl"
-    // InternalDataDSL.g:14044:1: rule__XUnaryOperation__Group_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15130:1: rule__XUnaryOperation__Group_0__0__Impl : ( () ) ;
     public final void rule__XUnaryOperation__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14048:1: ( ( () ) )
-            // InternalDataDSL.g:14049:1: ( () )
+            // InternalDataDSL.g:15134:1: ( ( () ) )
+            // InternalDataDSL.g:15135:1: ( () )
             {
-            // InternalDataDSL.g:14049:1: ( () )
-            // InternalDataDSL.g:14050:2: ()
+            // InternalDataDSL.g:15135:1: ( () )
+            // InternalDataDSL.g:15136:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getXUnaryOperationAction_0_0()); 
             }
-            // InternalDataDSL.g:14051:2: ()
-            // InternalDataDSL.g:14051:3: 
+            // InternalDataDSL.g:15137:2: ()
+            // InternalDataDSL.g:15137:3: 
             {
             }
 
@@ -47037,16 +50658,16 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__1"
-    // InternalDataDSL.g:14059:1: rule__XUnaryOperation__Group_0__1 : rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 ;
+    // InternalDataDSL.g:15145:1: rule__XUnaryOperation__Group_0__1 : rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 ;
     public final void rule__XUnaryOperation__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14063:1: ( rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 )
-            // InternalDataDSL.g:14064:2: rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2
+            // InternalDataDSL.g:15149:1: ( rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2 )
+            // InternalDataDSL.g:15150:2: rule__XUnaryOperation__Group_0__1__Impl rule__XUnaryOperation__Group_0__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XUnaryOperation__Group_0__1__Impl();
 
             state._fsp--;
@@ -47075,23 +50696,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__1__Impl"
-    // InternalDataDSL.g:14071:1: rule__XUnaryOperation__Group_0__1__Impl : ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) ;
+    // InternalDataDSL.g:15157:1: rule__XUnaryOperation__Group_0__1__Impl : ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) ;
     public final void rule__XUnaryOperation__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14075:1: ( ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) )
-            // InternalDataDSL.g:14076:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            // InternalDataDSL.g:15161:1: ( ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) ) )
+            // InternalDataDSL.g:15162:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
             {
-            // InternalDataDSL.g:14076:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
-            // InternalDataDSL.g:14077:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            // InternalDataDSL.g:15162:1: ( ( rule__XUnaryOperation__FeatureAssignment_0_1 ) )
+            // InternalDataDSL.g:15163:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureAssignment_0_1()); 
             }
-            // InternalDataDSL.g:14078:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
-            // InternalDataDSL.g:14078:3: rule__XUnaryOperation__FeatureAssignment_0_1
+            // InternalDataDSL.g:15164:2: ( rule__XUnaryOperation__FeatureAssignment_0_1 )
+            // InternalDataDSL.g:15164:3: rule__XUnaryOperation__FeatureAssignment_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__FeatureAssignment_0_1();
@@ -47126,14 +50747,14 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__2"
-    // InternalDataDSL.g:14086:1: rule__XUnaryOperation__Group_0__2 : rule__XUnaryOperation__Group_0__2__Impl ;
+    // InternalDataDSL.g:15172:1: rule__XUnaryOperation__Group_0__2 : rule__XUnaryOperation__Group_0__2__Impl ;
     public final void rule__XUnaryOperation__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14090:1: ( rule__XUnaryOperation__Group_0__2__Impl )
-            // InternalDataDSL.g:14091:2: rule__XUnaryOperation__Group_0__2__Impl
+            // InternalDataDSL.g:15176:1: ( rule__XUnaryOperation__Group_0__2__Impl )
+            // InternalDataDSL.g:15177:2: rule__XUnaryOperation__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__Group_0__2__Impl();
@@ -47159,23 +50780,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__Group_0__2__Impl"
-    // InternalDataDSL.g:14097:1: rule__XUnaryOperation__Group_0__2__Impl : ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) ;
+    // InternalDataDSL.g:15183:1: rule__XUnaryOperation__Group_0__2__Impl : ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) ;
     public final void rule__XUnaryOperation__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14101:1: ( ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) )
-            // InternalDataDSL.g:14102:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            // InternalDataDSL.g:15187:1: ( ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) ) )
+            // InternalDataDSL.g:15188:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
             {
-            // InternalDataDSL.g:14102:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
-            // InternalDataDSL.g:14103:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            // InternalDataDSL.g:15188:1: ( ( rule__XUnaryOperation__OperandAssignment_0_2 ) )
+            // InternalDataDSL.g:15189:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getOperandAssignment_0_2()); 
             }
-            // InternalDataDSL.g:14104:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
-            // InternalDataDSL.g:14104:3: rule__XUnaryOperation__OperandAssignment_0_2
+            // InternalDataDSL.g:15190:2: ( rule__XUnaryOperation__OperandAssignment_0_2 )
+            // InternalDataDSL.g:15190:3: rule__XUnaryOperation__OperandAssignment_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XUnaryOperation__OperandAssignment_0_2();
@@ -47210,16 +50831,16 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__0"
-    // InternalDataDSL.g:14113:1: rule__XCastedExpression__Group__0 : rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 ;
+    // InternalDataDSL.g:15199:1: rule__XCastedExpression__Group__0 : rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 ;
     public final void rule__XCastedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14117:1: ( rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 )
-            // InternalDataDSL.g:14118:2: rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1
+            // InternalDataDSL.g:15203:1: ( rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1 )
+            // InternalDataDSL.g:15204:2: rule__XCastedExpression__Group__0__Impl rule__XCastedExpression__Group__1
             {
-            pushFollow(FOLLOW_65);
+            pushFollow(FOLLOW_70);
             rule__XCastedExpression__Group__0__Impl();
 
             state._fsp--;
@@ -47248,17 +50869,17 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__0__Impl"
-    // InternalDataDSL.g:14125:1: rule__XCastedExpression__Group__0__Impl : ( ruleXPostfixOperation ) ;
+    // InternalDataDSL.g:15211:1: rule__XCastedExpression__Group__0__Impl : ( ruleXPostfixOperation ) ;
     public final void rule__XCastedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14129:1: ( ( ruleXPostfixOperation ) )
-            // InternalDataDSL.g:14130:1: ( ruleXPostfixOperation )
+            // InternalDataDSL.g:15215:1: ( ( ruleXPostfixOperation ) )
+            // InternalDataDSL.g:15216:1: ( ruleXPostfixOperation )
             {
-            // InternalDataDSL.g:14130:1: ( ruleXPostfixOperation )
-            // InternalDataDSL.g:14131:2: ruleXPostfixOperation
+            // InternalDataDSL.g:15216:1: ( ruleXPostfixOperation )
+            // InternalDataDSL.g:15217:2: ruleXPostfixOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0()); 
@@ -47293,14 +50914,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__1"
-    // InternalDataDSL.g:14140:1: rule__XCastedExpression__Group__1 : rule__XCastedExpression__Group__1__Impl ;
+    // InternalDataDSL.g:15226:1: rule__XCastedExpression__Group__1 : rule__XCastedExpression__Group__1__Impl ;
     public final void rule__XCastedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14144:1: ( rule__XCastedExpression__Group__1__Impl )
-            // InternalDataDSL.g:14145:2: rule__XCastedExpression__Group__1__Impl
+            // InternalDataDSL.g:15230:1: ( rule__XCastedExpression__Group__1__Impl )
+            // InternalDataDSL.g:15231:2: rule__XCastedExpression__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group__1__Impl();
@@ -47326,43 +50947,43 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group__1__Impl"
-    // InternalDataDSL.g:14151:1: rule__XCastedExpression__Group__1__Impl : ( ( rule__XCastedExpression__Group_1__0 )* ) ;
+    // InternalDataDSL.g:15237:1: rule__XCastedExpression__Group__1__Impl : ( ( rule__XCastedExpression__Group_1__0 )* ) ;
     public final void rule__XCastedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14155:1: ( ( ( rule__XCastedExpression__Group_1__0 )* ) )
-            // InternalDataDSL.g:14156:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            // InternalDataDSL.g:15241:1: ( ( ( rule__XCastedExpression__Group_1__0 )* ) )
+            // InternalDataDSL.g:15242:1: ( ( rule__XCastedExpression__Group_1__0 )* )
             {
-            // InternalDataDSL.g:14156:1: ( ( rule__XCastedExpression__Group_1__0 )* )
-            // InternalDataDSL.g:14157:2: ( rule__XCastedExpression__Group_1__0 )*
+            // InternalDataDSL.g:15242:1: ( ( rule__XCastedExpression__Group_1__0 )* )
+            // InternalDataDSL.g:15243:2: ( rule__XCastedExpression__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:14158:2: ( rule__XCastedExpression__Group_1__0 )*
-            loop119:
+            // InternalDataDSL.g:15244:2: ( rule__XCastedExpression__Group_1__0 )*
+            loop124:
             do {
-                int alt119=2;
-                int LA119_0 = input.LA(1);
+                int alt124=2;
+                int LA124_0 = input.LA(1);
 
-                if ( (LA119_0==115) ) {
-                    int LA119_2 = input.LA(2);
+                if ( (LA124_0==119) ) {
+                    int LA124_2 = input.LA(2);
 
-                    if ( (synpred179_InternalDataDSL()) ) {
-                        alt119=1;
+                    if ( (synpred190_InternalDataDSL()) ) {
+                        alt124=1;
                     }
 
 
                 }
 
 
-                switch (alt119) {
+                switch (alt124) {
             	case 1 :
-            	    // InternalDataDSL.g:14158:3: rule__XCastedExpression__Group_1__0
+            	    // InternalDataDSL.g:15244:3: rule__XCastedExpression__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_113);
+            	    pushFollow(FOLLOW_121);
             	    rule__XCastedExpression__Group_1__0();
 
             	    state._fsp--;
@@ -47372,7 +50993,7 @@
             	    break;
 
             	default :
-            	    break loop119;
+            	    break loop124;
                 }
             } while (true);
 
@@ -47401,16 +51022,16 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__0"
-    // InternalDataDSL.g:14167:1: rule__XCastedExpression__Group_1__0 : rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 ;
+    // InternalDataDSL.g:15253:1: rule__XCastedExpression__Group_1__0 : rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 ;
     public final void rule__XCastedExpression__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14171:1: ( rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 )
-            // InternalDataDSL.g:14172:2: rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1
+            // InternalDataDSL.g:15257:1: ( rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1 )
+            // InternalDataDSL.g:15258:2: rule__XCastedExpression__Group_1__0__Impl rule__XCastedExpression__Group_1__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XCastedExpression__Group_1__0__Impl();
 
             state._fsp--;
@@ -47439,23 +51060,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__0__Impl"
-    // InternalDataDSL.g:14179:1: rule__XCastedExpression__Group_1__0__Impl : ( ( rule__XCastedExpression__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:15265:1: rule__XCastedExpression__Group_1__0__Impl : ( ( rule__XCastedExpression__Group_1_0__0 ) ) ;
     public final void rule__XCastedExpression__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14183:1: ( ( ( rule__XCastedExpression__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:14184:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:15269:1: ( ( ( rule__XCastedExpression__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:15270:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:14184:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
-            // InternalDataDSL.g:14185:2: ( rule__XCastedExpression__Group_1_0__0 )
+            // InternalDataDSL.g:15270:1: ( ( rule__XCastedExpression__Group_1_0__0 ) )
+            // InternalDataDSL.g:15271:2: ( rule__XCastedExpression__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:14186:2: ( rule__XCastedExpression__Group_1_0__0 )
-            // InternalDataDSL.g:14186:3: rule__XCastedExpression__Group_1_0__0
+            // InternalDataDSL.g:15272:2: ( rule__XCastedExpression__Group_1_0__0 )
+            // InternalDataDSL.g:15272:3: rule__XCastedExpression__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0__0();
@@ -47490,14 +51111,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__1"
-    // InternalDataDSL.g:14194:1: rule__XCastedExpression__Group_1__1 : rule__XCastedExpression__Group_1__1__Impl ;
+    // InternalDataDSL.g:15280:1: rule__XCastedExpression__Group_1__1 : rule__XCastedExpression__Group_1__1__Impl ;
     public final void rule__XCastedExpression__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14198:1: ( rule__XCastedExpression__Group_1__1__Impl )
-            // InternalDataDSL.g:14199:2: rule__XCastedExpression__Group_1__1__Impl
+            // InternalDataDSL.g:15284:1: ( rule__XCastedExpression__Group_1__1__Impl )
+            // InternalDataDSL.g:15285:2: rule__XCastedExpression__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1__1__Impl();
@@ -47523,23 +51144,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1__1__Impl"
-    // InternalDataDSL.g:14205:1: rule__XCastedExpression__Group_1__1__Impl : ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:15291:1: rule__XCastedExpression__Group_1__1__Impl : ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) ;
     public final void rule__XCastedExpression__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14209:1: ( ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) )
-            // InternalDataDSL.g:14210:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            // InternalDataDSL.g:15295:1: ( ( ( rule__XCastedExpression__TypeAssignment_1_1 ) ) )
+            // InternalDataDSL.g:15296:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:14210:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
-            // InternalDataDSL.g:14211:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            // InternalDataDSL.g:15296:1: ( ( rule__XCastedExpression__TypeAssignment_1_1 ) )
+            // InternalDataDSL.g:15297:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getTypeAssignment_1_1()); 
             }
-            // InternalDataDSL.g:14212:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
-            // InternalDataDSL.g:14212:3: rule__XCastedExpression__TypeAssignment_1_1
+            // InternalDataDSL.g:15298:2: ( rule__XCastedExpression__TypeAssignment_1_1 )
+            // InternalDataDSL.g:15298:3: rule__XCastedExpression__TypeAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__TypeAssignment_1_1();
@@ -47574,14 +51195,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0__0"
-    // InternalDataDSL.g:14221:1: rule__XCastedExpression__Group_1_0__0 : rule__XCastedExpression__Group_1_0__0__Impl ;
+    // InternalDataDSL.g:15307:1: rule__XCastedExpression__Group_1_0__0 : rule__XCastedExpression__Group_1_0__0__Impl ;
     public final void rule__XCastedExpression__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14225:1: ( rule__XCastedExpression__Group_1_0__0__Impl )
-            // InternalDataDSL.g:14226:2: rule__XCastedExpression__Group_1_0__0__Impl
+            // InternalDataDSL.g:15311:1: ( rule__XCastedExpression__Group_1_0__0__Impl )
+            // InternalDataDSL.g:15312:2: rule__XCastedExpression__Group_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0__0__Impl();
@@ -47607,23 +51228,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0__0__Impl"
-    // InternalDataDSL.g:14232:1: rule__XCastedExpression__Group_1_0__0__Impl : ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:15318:1: rule__XCastedExpression__Group_1_0__0__Impl : ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) ;
     public final void rule__XCastedExpression__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14236:1: ( ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:14237:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15322:1: ( ( ( rule__XCastedExpression__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:15323:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:14237:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:14238:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:15323:1: ( ( rule__XCastedExpression__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15324:2: ( rule__XCastedExpression__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:14239:2: ( rule__XCastedExpression__Group_1_0_0__0 )
-            // InternalDataDSL.g:14239:3: rule__XCastedExpression__Group_1_0_0__0
+            // InternalDataDSL.g:15325:2: ( rule__XCastedExpression__Group_1_0_0__0 )
+            // InternalDataDSL.g:15325:3: rule__XCastedExpression__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0_0__0();
@@ -47658,16 +51279,16 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0"
-    // InternalDataDSL.g:14248:1: rule__XCastedExpression__Group_1_0_0__0 : rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 ;
+    // InternalDataDSL.g:15334:1: rule__XCastedExpression__Group_1_0_0__0 : rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 ;
     public final void rule__XCastedExpression__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14252:1: ( rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 )
-            // InternalDataDSL.g:14253:2: rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1
+            // InternalDataDSL.g:15338:1: ( rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1 )
+            // InternalDataDSL.g:15339:2: rule__XCastedExpression__Group_1_0_0__0__Impl rule__XCastedExpression__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_65);
+            pushFollow(FOLLOW_70);
             rule__XCastedExpression__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -47696,23 +51317,23 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:14260:1: rule__XCastedExpression__Group_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15346:1: rule__XCastedExpression__Group_1_0_0__0__Impl : ( () ) ;
     public final void rule__XCastedExpression__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14264:1: ( ( () ) )
-            // InternalDataDSL.g:14265:1: ( () )
+            // InternalDataDSL.g:15350:1: ( ( () ) )
+            // InternalDataDSL.g:15351:1: ( () )
             {
-            // InternalDataDSL.g:14265:1: ( () )
-            // InternalDataDSL.g:14266:2: ()
+            // InternalDataDSL.g:15351:1: ( () )
+            // InternalDataDSL.g:15352:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getXCastedExpressionTargetAction_1_0_0_0()); 
             }
-            // InternalDataDSL.g:14267:2: ()
-            // InternalDataDSL.g:14267:3: 
+            // InternalDataDSL.g:15353:2: ()
+            // InternalDataDSL.g:15353:3: 
             {
             }
 
@@ -47737,14 +51358,14 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1"
-    // InternalDataDSL.g:14275:1: rule__XCastedExpression__Group_1_0_0__1 : rule__XCastedExpression__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:15361:1: rule__XCastedExpression__Group_1_0_0__1 : rule__XCastedExpression__Group_1_0_0__1__Impl ;
     public final void rule__XCastedExpression__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14279:1: ( rule__XCastedExpression__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:14280:2: rule__XCastedExpression__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:15365:1: ( rule__XCastedExpression__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:15366:2: rule__XCastedExpression__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCastedExpression__Group_1_0_0__1__Impl();
@@ -47770,22 +51391,22 @@
 
 
     // $ANTLR start "rule__XCastedExpression__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:14286:1: rule__XCastedExpression__Group_1_0_0__1__Impl : ( 'as' ) ;
+    // InternalDataDSL.g:15372:1: rule__XCastedExpression__Group_1_0_0__1__Impl : ( 'as' ) ;
     public final void rule__XCastedExpression__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14290:1: ( ( 'as' ) )
-            // InternalDataDSL.g:14291:1: ( 'as' )
+            // InternalDataDSL.g:15376:1: ( ( 'as' ) )
+            // InternalDataDSL.g:15377:1: ( 'as' )
             {
-            // InternalDataDSL.g:14291:1: ( 'as' )
-            // InternalDataDSL.g:14292:2: 'as'
+            // InternalDataDSL.g:15377:1: ( 'as' )
+            // InternalDataDSL.g:15378:2: 'as'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); 
             }
-            match(input,115,FOLLOW_2); if (state.failed) return ;
+            match(input,119,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1()); 
             }
@@ -47811,16 +51432,16 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__0"
-    // InternalDataDSL.g:14302:1: rule__XPostfixOperation__Group__0 : rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 ;
+    // InternalDataDSL.g:15388:1: rule__XPostfixOperation__Group__0 : rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 ;
     public final void rule__XPostfixOperation__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14306:1: ( rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 )
-            // InternalDataDSL.g:14307:2: rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1
+            // InternalDataDSL.g:15392:1: ( rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1 )
+            // InternalDataDSL.g:15393:2: rule__XPostfixOperation__Group__0__Impl rule__XPostfixOperation__Group__1
             {
-            pushFollow(FOLLOW_114);
+            pushFollow(FOLLOW_122);
             rule__XPostfixOperation__Group__0__Impl();
 
             state._fsp--;
@@ -47849,17 +51470,17 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__0__Impl"
-    // InternalDataDSL.g:14314:1: rule__XPostfixOperation__Group__0__Impl : ( ruleXMemberFeatureCall ) ;
+    // InternalDataDSL.g:15400:1: rule__XPostfixOperation__Group__0__Impl : ( ruleXMemberFeatureCall ) ;
     public final void rule__XPostfixOperation__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14318:1: ( ( ruleXMemberFeatureCall ) )
-            // InternalDataDSL.g:14319:1: ( ruleXMemberFeatureCall )
+            // InternalDataDSL.g:15404:1: ( ( ruleXMemberFeatureCall ) )
+            // InternalDataDSL.g:15405:1: ( ruleXMemberFeatureCall )
             {
-            // InternalDataDSL.g:14319:1: ( ruleXMemberFeatureCall )
-            // InternalDataDSL.g:14320:2: ruleXMemberFeatureCall
+            // InternalDataDSL.g:15405:1: ( ruleXMemberFeatureCall )
+            // InternalDataDSL.g:15406:2: ruleXMemberFeatureCall
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0()); 
@@ -47894,14 +51515,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__1"
-    // InternalDataDSL.g:14329:1: rule__XPostfixOperation__Group__1 : rule__XPostfixOperation__Group__1__Impl ;
+    // InternalDataDSL.g:15415:1: rule__XPostfixOperation__Group__1 : rule__XPostfixOperation__Group__1__Impl ;
     public final void rule__XPostfixOperation__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14333:1: ( rule__XPostfixOperation__Group__1__Impl )
-            // InternalDataDSL.g:14334:2: rule__XPostfixOperation__Group__1__Impl
+            // InternalDataDSL.g:15419:1: ( rule__XPostfixOperation__Group__1__Impl )
+            // InternalDataDSL.g:15420:2: rule__XPostfixOperation__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group__1__Impl();
@@ -47927,42 +51548,42 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group__1__Impl"
-    // InternalDataDSL.g:14340:1: rule__XPostfixOperation__Group__1__Impl : ( ( rule__XPostfixOperation__Group_1__0 )? ) ;
+    // InternalDataDSL.g:15426:1: rule__XPostfixOperation__Group__1__Impl : ( ( rule__XPostfixOperation__Group_1__0 )? ) ;
     public final void rule__XPostfixOperation__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14344:1: ( ( ( rule__XPostfixOperation__Group_1__0 )? ) )
-            // InternalDataDSL.g:14345:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            // InternalDataDSL.g:15430:1: ( ( ( rule__XPostfixOperation__Group_1__0 )? ) )
+            // InternalDataDSL.g:15431:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
             {
-            // InternalDataDSL.g:14345:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
-            // InternalDataDSL.g:14346:2: ( rule__XPostfixOperation__Group_1__0 )?
+            // InternalDataDSL.g:15431:1: ( ( rule__XPostfixOperation__Group_1__0 )? )
+            // InternalDataDSL.g:15432:2: ( rule__XPostfixOperation__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:14347:2: ( rule__XPostfixOperation__Group_1__0 )?
-            int alt120=2;
-            int LA120_0 = input.LA(1);
+            // InternalDataDSL.g:15433:2: ( rule__XPostfixOperation__Group_1__0 )?
+            int alt125=2;
+            int LA125_0 = input.LA(1);
 
-            if ( (LA120_0==41) ) {
-                int LA120_1 = input.LA(2);
+            if ( (LA125_0==41) ) {
+                int LA125_1 = input.LA(2);
 
-                if ( (synpred180_InternalDataDSL()) ) {
-                    alt120=1;
+                if ( (synpred191_InternalDataDSL()) ) {
+                    alt125=1;
                 }
             }
-            else if ( (LA120_0==42) ) {
-                int LA120_2 = input.LA(2);
+            else if ( (LA125_0==42) ) {
+                int LA125_2 = input.LA(2);
 
-                if ( (synpred180_InternalDataDSL()) ) {
-                    alt120=1;
+                if ( (synpred191_InternalDataDSL()) ) {
+                    alt125=1;
                 }
             }
-            switch (alt120) {
+            switch (alt125) {
                 case 1 :
-                    // InternalDataDSL.g:14347:3: rule__XPostfixOperation__Group_1__0
+                    // InternalDataDSL.g:15433:3: rule__XPostfixOperation__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XPostfixOperation__Group_1__0();
@@ -48000,14 +51621,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1__0"
-    // InternalDataDSL.g:14356:1: rule__XPostfixOperation__Group_1__0 : rule__XPostfixOperation__Group_1__0__Impl ;
+    // InternalDataDSL.g:15442:1: rule__XPostfixOperation__Group_1__0 : rule__XPostfixOperation__Group_1__0__Impl ;
     public final void rule__XPostfixOperation__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14360:1: ( rule__XPostfixOperation__Group_1__0__Impl )
-            // InternalDataDSL.g:14361:2: rule__XPostfixOperation__Group_1__0__Impl
+            // InternalDataDSL.g:15446:1: ( rule__XPostfixOperation__Group_1__0__Impl )
+            // InternalDataDSL.g:15447:2: rule__XPostfixOperation__Group_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1__0__Impl();
@@ -48033,23 +51654,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1__0__Impl"
-    // InternalDataDSL.g:14367:1: rule__XPostfixOperation__Group_1__0__Impl : ( ( rule__XPostfixOperation__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:15453:1: rule__XPostfixOperation__Group_1__0__Impl : ( ( rule__XPostfixOperation__Group_1_0__0 ) ) ;
     public final void rule__XPostfixOperation__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14371:1: ( ( ( rule__XPostfixOperation__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:14372:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            // InternalDataDSL.g:15457:1: ( ( ( rule__XPostfixOperation__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:15458:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:14372:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
-            // InternalDataDSL.g:14373:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            // InternalDataDSL.g:15458:1: ( ( rule__XPostfixOperation__Group_1_0__0 ) )
+            // InternalDataDSL.g:15459:2: ( rule__XPostfixOperation__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:14374:2: ( rule__XPostfixOperation__Group_1_0__0 )
-            // InternalDataDSL.g:14374:3: rule__XPostfixOperation__Group_1_0__0
+            // InternalDataDSL.g:15460:2: ( rule__XPostfixOperation__Group_1_0__0 )
+            // InternalDataDSL.g:15460:3: rule__XPostfixOperation__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1_0__0();
@@ -48084,16 +51705,16 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__0"
-    // InternalDataDSL.g:14383:1: rule__XPostfixOperation__Group_1_0__0 : rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 ;
+    // InternalDataDSL.g:15469:1: rule__XPostfixOperation__Group_1_0__0 : rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 ;
     public final void rule__XPostfixOperation__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14387:1: ( rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 )
-            // InternalDataDSL.g:14388:2: rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1
+            // InternalDataDSL.g:15473:1: ( rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1 )
+            // InternalDataDSL.g:15474:2: rule__XPostfixOperation__Group_1_0__0__Impl rule__XPostfixOperation__Group_1_0__1
             {
-            pushFollow(FOLLOW_114);
+            pushFollow(FOLLOW_122);
             rule__XPostfixOperation__Group_1_0__0__Impl();
 
             state._fsp--;
@@ -48122,23 +51743,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__0__Impl"
-    // InternalDataDSL.g:14395:1: rule__XPostfixOperation__Group_1_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15481:1: rule__XPostfixOperation__Group_1_0__0__Impl : ( () ) ;
     public final void rule__XPostfixOperation__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14399:1: ( ( () ) )
-            // InternalDataDSL.g:14400:1: ( () )
+            // InternalDataDSL.g:15485:1: ( ( () ) )
+            // InternalDataDSL.g:15486:1: ( () )
             {
-            // InternalDataDSL.g:14400:1: ( () )
-            // InternalDataDSL.g:14401:2: ()
+            // InternalDataDSL.g:15486:1: ( () )
+            // InternalDataDSL.g:15487:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getXPostfixOperationOperandAction_1_0_0()); 
             }
-            // InternalDataDSL.g:14402:2: ()
-            // InternalDataDSL.g:14402:3: 
+            // InternalDataDSL.g:15488:2: ()
+            // InternalDataDSL.g:15488:3: 
             {
             }
 
@@ -48163,14 +51784,14 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__1"
-    // InternalDataDSL.g:14410:1: rule__XPostfixOperation__Group_1_0__1 : rule__XPostfixOperation__Group_1_0__1__Impl ;
+    // InternalDataDSL.g:15496:1: rule__XPostfixOperation__Group_1_0__1 : rule__XPostfixOperation__Group_1_0__1__Impl ;
     public final void rule__XPostfixOperation__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14414:1: ( rule__XPostfixOperation__Group_1_0__1__Impl )
-            // InternalDataDSL.g:14415:2: rule__XPostfixOperation__Group_1_0__1__Impl
+            // InternalDataDSL.g:15500:1: ( rule__XPostfixOperation__Group_1_0__1__Impl )
+            // InternalDataDSL.g:15501:2: rule__XPostfixOperation__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__Group_1_0__1__Impl();
@@ -48196,23 +51817,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__Group_1_0__1__Impl"
-    // InternalDataDSL.g:14421:1: rule__XPostfixOperation__Group_1_0__1__Impl : ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) ;
+    // InternalDataDSL.g:15507:1: rule__XPostfixOperation__Group_1_0__1__Impl : ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) ;
     public final void rule__XPostfixOperation__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14425:1: ( ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) )
-            // InternalDataDSL.g:14426:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            // InternalDataDSL.g:15511:1: ( ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) ) )
+            // InternalDataDSL.g:15512:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
             {
-            // InternalDataDSL.g:14426:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
-            // InternalDataDSL.g:14427:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            // InternalDataDSL.g:15512:1: ( ( rule__XPostfixOperation__FeatureAssignment_1_0_1 ) )
+            // InternalDataDSL.g:15513:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureAssignment_1_0_1()); 
             }
-            // InternalDataDSL.g:14428:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
-            // InternalDataDSL.g:14428:3: rule__XPostfixOperation__FeatureAssignment_1_0_1
+            // InternalDataDSL.g:15514:2: ( rule__XPostfixOperation__FeatureAssignment_1_0_1 )
+            // InternalDataDSL.g:15514:3: rule__XPostfixOperation__FeatureAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XPostfixOperation__FeatureAssignment_1_0_1();
@@ -48247,16 +51868,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__0"
-    // InternalDataDSL.g:14437:1: rule__XMemberFeatureCall__Group__0 : rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 ;
+    // InternalDataDSL.g:15523:1: rule__XMemberFeatureCall__Group__0 : rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 ;
     public final void rule__XMemberFeatureCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14441:1: ( rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 )
-            // InternalDataDSL.g:14442:2: rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1
+            // InternalDataDSL.g:15527:1: ( rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1 )
+            // InternalDataDSL.g:15528:2: rule__XMemberFeatureCall__Group__0__Impl rule__XMemberFeatureCall__Group__1
             {
-            pushFollow(FOLLOW_115);
+            pushFollow(FOLLOW_123);
             rule__XMemberFeatureCall__Group__0__Impl();
 
             state._fsp--;
@@ -48285,17 +51906,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__0__Impl"
-    // InternalDataDSL.g:14449:1: rule__XMemberFeatureCall__Group__0__Impl : ( ruleXPrimaryExpression ) ;
+    // InternalDataDSL.g:15535:1: rule__XMemberFeatureCall__Group__0__Impl : ( ruleXPrimaryExpression ) ;
     public final void rule__XMemberFeatureCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14453:1: ( ( ruleXPrimaryExpression ) )
-            // InternalDataDSL.g:14454:1: ( ruleXPrimaryExpression )
+            // InternalDataDSL.g:15539:1: ( ( ruleXPrimaryExpression ) )
+            // InternalDataDSL.g:15540:1: ( ruleXPrimaryExpression )
             {
-            // InternalDataDSL.g:14454:1: ( ruleXPrimaryExpression )
-            // InternalDataDSL.g:14455:2: ruleXPrimaryExpression
+            // InternalDataDSL.g:15540:1: ( ruleXPrimaryExpression )
+            // InternalDataDSL.g:15541:2: ruleXPrimaryExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0()); 
@@ -48330,14 +51951,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__1"
-    // InternalDataDSL.g:14464:1: rule__XMemberFeatureCall__Group__1 : rule__XMemberFeatureCall__Group__1__Impl ;
+    // InternalDataDSL.g:15550:1: rule__XMemberFeatureCall__Group__1 : rule__XMemberFeatureCall__Group__1__Impl ;
     public final void rule__XMemberFeatureCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14468:1: ( rule__XMemberFeatureCall__Group__1__Impl )
-            // InternalDataDSL.g:14469:2: rule__XMemberFeatureCall__Group__1__Impl
+            // InternalDataDSL.g:15554:1: ( rule__XMemberFeatureCall__Group__1__Impl )
+            // InternalDataDSL.g:15555:2: rule__XMemberFeatureCall__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group__1__Impl();
@@ -48363,54 +51984,54 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group__1__Impl"
-    // InternalDataDSL.g:14475:1: rule__XMemberFeatureCall__Group__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) ;
+    // InternalDataDSL.g:15561:1: rule__XMemberFeatureCall__Group__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) ;
     public final void rule__XMemberFeatureCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14479:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) )
-            // InternalDataDSL.g:14480:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            // InternalDataDSL.g:15565:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1 )* ) )
+            // InternalDataDSL.g:15566:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
             {
-            // InternalDataDSL.g:14480:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
-            // InternalDataDSL.g:14481:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            // InternalDataDSL.g:15566:1: ( ( rule__XMemberFeatureCall__Alternatives_1 )* )
+            // InternalDataDSL.g:15567:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1()); 
             }
-            // InternalDataDSL.g:14482:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
-            loop121:
+            // InternalDataDSL.g:15568:2: ( rule__XMemberFeatureCall__Alternatives_1 )*
+            loop126:
             do {
-                int alt121=2;
+                int alt126=2;
                 switch ( input.LA(1) ) {
                 case 43:
                     {
-                    int LA121_2 = input.LA(2);
+                    int LA126_2 = input.LA(2);
 
-                    if ( (synpred181_InternalDataDSL()) ) {
-                        alt121=1;
+                    if ( (synpred192_InternalDataDSL()) ) {
+                        alt126=1;
                     }
 
 
                     }
                     break;
-                case 162:
+                case 175:
                     {
-                    int LA121_3 = input.LA(2);
+                    int LA126_3 = input.LA(2);
 
-                    if ( (synpred181_InternalDataDSL()) ) {
-                        alt121=1;
+                    if ( (synpred192_InternalDataDSL()) ) {
+                        alt126=1;
                     }
 
 
                     }
                     break;
-                case 163:
+                case 176:
                     {
-                    int LA121_4 = input.LA(2);
+                    int LA126_4 = input.LA(2);
 
-                    if ( (synpred181_InternalDataDSL()) ) {
-                        alt121=1;
+                    if ( (synpred192_InternalDataDSL()) ) {
+                        alt126=1;
                     }
 
 
@@ -48419,11 +52040,11 @@
 
                 }
 
-                switch (alt121) {
+                switch (alt126) {
             	case 1 :
-            	    // InternalDataDSL.g:14482:3: rule__XMemberFeatureCall__Alternatives_1
+            	    // InternalDataDSL.g:15568:3: rule__XMemberFeatureCall__Alternatives_1
             	    {
-            	    pushFollow(FOLLOW_116);
+            	    pushFollow(FOLLOW_124);
             	    rule__XMemberFeatureCall__Alternatives_1();
 
             	    state._fsp--;
@@ -48433,7 +52054,7 @@
             	    break;
 
             	default :
-            	    break loop121;
+            	    break loop126;
                 }
             } while (true);
 
@@ -48462,16 +52083,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0"
-    // InternalDataDSL.g:14491:1: rule__XMemberFeatureCall__Group_1_0__0 : rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 ;
+    // InternalDataDSL.g:15577:1: rule__XMemberFeatureCall__Group_1_0__0 : rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14495:1: ( rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 )
-            // InternalDataDSL.g:14496:2: rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1
+            // InternalDataDSL.g:15581:1: ( rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1 )
+            // InternalDataDSL.g:15582:2: rule__XMemberFeatureCall__Group_1_0__0__Impl rule__XMemberFeatureCall__Group_1_0__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XMemberFeatureCall__Group_1_0__0__Impl();
 
             state._fsp--;
@@ -48500,23 +52121,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__0__Impl"
-    // InternalDataDSL.g:14503:1: rule__XMemberFeatureCall__Group_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:15589:1: rule__XMemberFeatureCall__Group_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14507:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) )
-            // InternalDataDSL.g:14508:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15593:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) ) )
+            // InternalDataDSL.g:15594:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:14508:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
-            // InternalDataDSL.g:14509:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            // InternalDataDSL.g:15594:1: ( ( rule__XMemberFeatureCall__Group_1_0_0__0 ) )
+            // InternalDataDSL.g:15595:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:14510:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
-            // InternalDataDSL.g:14510:3: rule__XMemberFeatureCall__Group_1_0_0__0
+            // InternalDataDSL.g:15596:2: ( rule__XMemberFeatureCall__Group_1_0_0__0 )
+            // InternalDataDSL.g:15596:3: rule__XMemberFeatureCall__Group_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0__0();
@@ -48551,14 +52172,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1"
-    // InternalDataDSL.g:14518:1: rule__XMemberFeatureCall__Group_1_0__1 : rule__XMemberFeatureCall__Group_1_0__1__Impl ;
+    // InternalDataDSL.g:15604:1: rule__XMemberFeatureCall__Group_1_0__1 : rule__XMemberFeatureCall__Group_1_0__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14522:1: ( rule__XMemberFeatureCall__Group_1_0__1__Impl )
-            // InternalDataDSL.g:14523:2: rule__XMemberFeatureCall__Group_1_0__1__Impl
+            // InternalDataDSL.g:15608:1: ( rule__XMemberFeatureCall__Group_1_0__1__Impl )
+            // InternalDataDSL.g:15609:2: rule__XMemberFeatureCall__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0__1__Impl();
@@ -48584,23 +52205,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0__1__Impl"
-    // InternalDataDSL.g:14529:1: rule__XMemberFeatureCall__Group_1_0__1__Impl : ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) ;
+    // InternalDataDSL.g:15615:1: rule__XMemberFeatureCall__Group_1_0__1__Impl : ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14533:1: ( ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) )
-            // InternalDataDSL.g:14534:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            // InternalDataDSL.g:15619:1: ( ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) ) )
+            // InternalDataDSL.g:15620:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
             {
-            // InternalDataDSL.g:14534:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
-            // InternalDataDSL.g:14535:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            // InternalDataDSL.g:15620:1: ( ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 ) )
+            // InternalDataDSL.g:15621:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getValueAssignment_1_0_1()); 
             }
-            // InternalDataDSL.g:14536:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
-            // InternalDataDSL.g:14536:3: rule__XMemberFeatureCall__ValueAssignment_1_0_1
+            // InternalDataDSL.g:15622:2: ( rule__XMemberFeatureCall__ValueAssignment_1_0_1 )
+            // InternalDataDSL.g:15622:3: rule__XMemberFeatureCall__ValueAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__ValueAssignment_1_0_1();
@@ -48635,14 +52256,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0"
-    // InternalDataDSL.g:14545:1: rule__XMemberFeatureCall__Group_1_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0__0__Impl ;
+    // InternalDataDSL.g:15631:1: rule__XMemberFeatureCall__Group_1_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0__0__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14549:1: ( rule__XMemberFeatureCall__Group_1_0_0__0__Impl )
-            // InternalDataDSL.g:14550:2: rule__XMemberFeatureCall__Group_1_0_0__0__Impl
+            // InternalDataDSL.g:15635:1: ( rule__XMemberFeatureCall__Group_1_0_0__0__Impl )
+            // InternalDataDSL.g:15636:2: rule__XMemberFeatureCall__Group_1_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0__0__Impl();
@@ -48668,23 +52289,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:14556:1: rule__XMemberFeatureCall__Group_1_0_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) ;
+    // InternalDataDSL.g:15642:1: rule__XMemberFeatureCall__Group_1_0_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14560:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) )
-            // InternalDataDSL.g:14561:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            // InternalDataDSL.g:15646:1: ( ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) ) )
+            // InternalDataDSL.g:15647:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
             {
-            // InternalDataDSL.g:14561:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
-            // InternalDataDSL.g:14562:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            // InternalDataDSL.g:15647:1: ( ( rule__XMemberFeatureCall__Group_1_0_0_0__0 ) )
+            // InternalDataDSL.g:15648:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_0_0_0()); 
             }
-            // InternalDataDSL.g:14563:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
-            // InternalDataDSL.g:14563:3: rule__XMemberFeatureCall__Group_1_0_0_0__0
+            // InternalDataDSL.g:15649:2: ( rule__XMemberFeatureCall__Group_1_0_0_0__0 )
+            // InternalDataDSL.g:15649:3: rule__XMemberFeatureCall__Group_1_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0_0__0();
@@ -48719,16 +52340,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0"
-    // InternalDataDSL.g:14572:1: rule__XMemberFeatureCall__Group_1_0_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 ;
+    // InternalDataDSL.g:15658:1: rule__XMemberFeatureCall__Group_1_0_0_0__0 : rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14576:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 )
-            // InternalDataDSL.g:14577:2: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1
+            // InternalDataDSL.g:15662:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1 )
+            // InternalDataDSL.g:15663:2: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl rule__XMemberFeatureCall__Group_1_0_0_0__1
             {
-            pushFollow(FOLLOW_117);
+            pushFollow(FOLLOW_125);
             rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl();
 
             state._fsp--;
@@ -48757,23 +52378,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl"
-    // InternalDataDSL.g:14584:1: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15670:1: rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl : ( () ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14588:1: ( ( () ) )
-            // InternalDataDSL.g:14589:1: ( () )
+            // InternalDataDSL.g:15674:1: ( ( () ) )
+            // InternalDataDSL.g:15675:1: ( () )
             {
-            // InternalDataDSL.g:14589:1: ( () )
-            // InternalDataDSL.g:14590:2: ()
+            // InternalDataDSL.g:15675:1: ( () )
+            // InternalDataDSL.g:15676:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXAssignmentAssignableAction_1_0_0_0_0()); 
             }
-            // InternalDataDSL.g:14591:2: ()
-            // InternalDataDSL.g:14591:3: 
+            // InternalDataDSL.g:15677:2: ()
+            // InternalDataDSL.g:15677:3: 
             {
             }
 
@@ -48798,16 +52419,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1"
-    // InternalDataDSL.g:14599:1: rule__XMemberFeatureCall__Group_1_0_0_0__1 : rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 ;
+    // InternalDataDSL.g:15685:1: rule__XMemberFeatureCall__Group_1_0_0_0__1 : rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14603:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 )
-            // InternalDataDSL.g:14604:2: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2
+            // InternalDataDSL.g:15689:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2 )
+            // InternalDataDSL.g:15690:2: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl rule__XMemberFeatureCall__Group_1_0_0_0__2
             {
-            pushFollow(FOLLOW_89);
+            pushFollow(FOLLOW_97);
             rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl();
 
             state._fsp--;
@@ -48836,23 +52457,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl"
-    // InternalDataDSL.g:14611:1: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) ;
+    // InternalDataDSL.g:15697:1: rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14615:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) )
-            // InternalDataDSL.g:14616:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            // InternalDataDSL.g:15701:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) ) )
+            // InternalDataDSL.g:15702:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
             {
-            // InternalDataDSL.g:14616:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
-            // InternalDataDSL.g:14617:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            // InternalDataDSL.g:15702:1: ( ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 ) )
+            // InternalDataDSL.g:15703:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_0_0_0_1()); 
             }
-            // InternalDataDSL.g:14618:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
-            // InternalDataDSL.g:14618:3: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
+            // InternalDataDSL.g:15704:2: ( rule__XMemberFeatureCall__Alternatives_1_0_0_0_1 )
+            // InternalDataDSL.g:15704:3: rule__XMemberFeatureCall__Alternatives_1_0_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Alternatives_1_0_0_0_1();
@@ -48887,16 +52508,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2"
-    // InternalDataDSL.g:14626:1: rule__XMemberFeatureCall__Group_1_0_0_0__2 : rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 ;
+    // InternalDataDSL.g:15712:1: rule__XMemberFeatureCall__Group_1_0_0_0__2 : rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14630:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 )
-            // InternalDataDSL.g:14631:2: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3
+            // InternalDataDSL.g:15716:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3 )
+            // InternalDataDSL.g:15717:2: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl rule__XMemberFeatureCall__Group_1_0_0_0__3
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl();
 
             state._fsp--;
@@ -48925,23 +52546,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl"
-    // InternalDataDSL.g:14638:1: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) ;
+    // InternalDataDSL.g:15724:1: rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14642:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) )
-            // InternalDataDSL.g:14643:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            // InternalDataDSL.g:15728:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) ) )
+            // InternalDataDSL.g:15729:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
             {
-            // InternalDataDSL.g:14643:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
-            // InternalDataDSL.g:14644:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            // InternalDataDSL.g:15729:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 ) )
+            // InternalDataDSL.g:15730:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_0_0_0_2()); 
             }
-            // InternalDataDSL.g:14645:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
-            // InternalDataDSL.g:14645:3: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
+            // InternalDataDSL.g:15731:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 )
+            // InternalDataDSL.g:15731:3: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2();
@@ -48976,14 +52597,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3"
-    // InternalDataDSL.g:14653:1: rule__XMemberFeatureCall__Group_1_0_0_0__3 : rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl ;
+    // InternalDataDSL.g:15739:1: rule__XMemberFeatureCall__Group_1_0_0_0__3 : rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14657:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl )
-            // InternalDataDSL.g:14658:2: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
+            // InternalDataDSL.g:15743:1: ( rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl )
+            // InternalDataDSL.g:15744:2: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl();
@@ -49009,17 +52630,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl"
-    // InternalDataDSL.g:14664:1: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl : ( ruleOpSingleAssign ) ;
+    // InternalDataDSL.g:15750:1: rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl : ( ruleOpSingleAssign ) ;
     public final void rule__XMemberFeatureCall__Group_1_0_0_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14668:1: ( ( ruleOpSingleAssign ) )
-            // InternalDataDSL.g:14669:1: ( ruleOpSingleAssign )
+            // InternalDataDSL.g:15754:1: ( ( ruleOpSingleAssign ) )
+            // InternalDataDSL.g:15755:1: ( ruleOpSingleAssign )
             {
-            // InternalDataDSL.g:14669:1: ( ruleOpSingleAssign )
-            // InternalDataDSL.g:14670:2: ruleOpSingleAssign
+            // InternalDataDSL.g:15755:1: ( ruleOpSingleAssign )
+            // InternalDataDSL.g:15756:2: ruleOpSingleAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3()); 
@@ -49054,16 +52675,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0"
-    // InternalDataDSL.g:14680:1: rule__XMemberFeatureCall__Group_1_1__0 : rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 ;
+    // InternalDataDSL.g:15766:1: rule__XMemberFeatureCall__Group_1_1__0 : rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14684:1: ( rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 )
-            // InternalDataDSL.g:14685:2: rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1
+            // InternalDataDSL.g:15770:1: ( rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1 )
+            // InternalDataDSL.g:15771:2: rule__XMemberFeatureCall__Group_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1__1
             {
-            pushFollow(FOLLOW_118);
+            pushFollow(FOLLOW_126);
             rule__XMemberFeatureCall__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -49092,23 +52713,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__0__Impl"
-    // InternalDataDSL.g:14692:1: rule__XMemberFeatureCall__Group_1_1__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) ;
+    // InternalDataDSL.g:15778:1: rule__XMemberFeatureCall__Group_1_1__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14696:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) )
-            // InternalDataDSL.g:14697:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:15782:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) ) )
+            // InternalDataDSL.g:15783:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
             {
-            // InternalDataDSL.g:14697:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
-            // InternalDataDSL.g:14698:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            // InternalDataDSL.g:15783:1: ( ( rule__XMemberFeatureCall__Group_1_1_0__0 ) )
+            // InternalDataDSL.g:15784:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0()); 
             }
-            // InternalDataDSL.g:14699:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
-            // InternalDataDSL.g:14699:3: rule__XMemberFeatureCall__Group_1_1_0__0
+            // InternalDataDSL.g:15785:2: ( rule__XMemberFeatureCall__Group_1_1_0__0 )
+            // InternalDataDSL.g:15785:3: rule__XMemberFeatureCall__Group_1_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0__0();
@@ -49143,16 +52764,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1"
-    // InternalDataDSL.g:14707:1: rule__XMemberFeatureCall__Group_1_1__1 : rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 ;
+    // InternalDataDSL.g:15793:1: rule__XMemberFeatureCall__Group_1_1__1 : rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14711:1: ( rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 )
-            // InternalDataDSL.g:14712:2: rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2
+            // InternalDataDSL.g:15797:1: ( rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2 )
+            // InternalDataDSL.g:15798:2: rule__XMemberFeatureCall__Group_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1__2
             {
-            pushFollow(FOLLOW_118);
+            pushFollow(FOLLOW_126);
             rule__XMemberFeatureCall__Group_1_1__1__Impl();
 
             state._fsp--;
@@ -49181,31 +52802,31 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__1__Impl"
-    // InternalDataDSL.g:14719:1: rule__XMemberFeatureCall__Group_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) ;
+    // InternalDataDSL.g:15805:1: rule__XMemberFeatureCall__Group_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14723:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) )
-            // InternalDataDSL.g:14724:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            // InternalDataDSL.g:15809:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? ) )
+            // InternalDataDSL.g:15810:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
             {
-            // InternalDataDSL.g:14724:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
-            // InternalDataDSL.g:14725:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            // InternalDataDSL.g:15810:1: ( ( rule__XMemberFeatureCall__Group_1_1_1__0 )? )
+            // InternalDataDSL.g:15811:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1()); 
             }
-            // InternalDataDSL.g:14726:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
-            int alt122=2;
-            int LA122_0 = input.LA(1);
+            // InternalDataDSL.g:15812:2: ( rule__XMemberFeatureCall__Group_1_1_1__0 )?
+            int alt127=2;
+            int LA127_0 = input.LA(1);
 
-            if ( (LA122_0==27) ) {
-                alt122=1;
+            if ( (LA127_0==27) ) {
+                alt127=1;
             }
-            switch (alt122) {
+            switch (alt127) {
                 case 1 :
-                    // InternalDataDSL.g:14726:3: rule__XMemberFeatureCall__Group_1_1_1__0
+                    // InternalDataDSL.g:15812:3: rule__XMemberFeatureCall__Group_1_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_1__0();
@@ -49243,16 +52864,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2"
-    // InternalDataDSL.g:14734:1: rule__XMemberFeatureCall__Group_1_1__2 : rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 ;
+    // InternalDataDSL.g:15820:1: rule__XMemberFeatureCall__Group_1_1__2 : rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 ;
     public final void rule__XMemberFeatureCall__Group_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14738:1: ( rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 )
-            // InternalDataDSL.g:14739:2: rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3
+            // InternalDataDSL.g:15824:1: ( rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3 )
+            // InternalDataDSL.g:15825:2: rule__XMemberFeatureCall__Group_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1__3
             {
-            pushFollow(FOLLOW_119);
+            pushFollow(FOLLOW_127);
             rule__XMemberFeatureCall__Group_1_1__2__Impl();
 
             state._fsp--;
@@ -49281,23 +52902,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__2__Impl"
-    // InternalDataDSL.g:14746:1: rule__XMemberFeatureCall__Group_1_1__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) ;
+    // InternalDataDSL.g:15832:1: rule__XMemberFeatureCall__Group_1_1__2__Impl : ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14750:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) )
-            // InternalDataDSL.g:14751:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            // InternalDataDSL.g:15836:1: ( ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) ) )
+            // InternalDataDSL.g:15837:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
             {
-            // InternalDataDSL.g:14751:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
-            // InternalDataDSL.g:14752:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            // InternalDataDSL.g:15837:1: ( ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 ) )
+            // InternalDataDSL.g:15838:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureAssignment_1_1_2()); 
             }
-            // InternalDataDSL.g:14753:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
-            // InternalDataDSL.g:14753:3: rule__XMemberFeatureCall__FeatureAssignment_1_1_2
+            // InternalDataDSL.g:15839:2: ( rule__XMemberFeatureCall__FeatureAssignment_1_1_2 )
+            // InternalDataDSL.g:15839:3: rule__XMemberFeatureCall__FeatureAssignment_1_1_2
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__FeatureAssignment_1_1_2();
@@ -49332,16 +52953,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3"
-    // InternalDataDSL.g:14761:1: rule__XMemberFeatureCall__Group_1_1__3 : rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 ;
+    // InternalDataDSL.g:15847:1: rule__XMemberFeatureCall__Group_1_1__3 : rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 ;
     public final void rule__XMemberFeatureCall__Group_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14765:1: ( rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 )
-            // InternalDataDSL.g:14766:2: rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4
+            // InternalDataDSL.g:15851:1: ( rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4 )
+            // InternalDataDSL.g:15852:2: rule__XMemberFeatureCall__Group_1_1__3__Impl rule__XMemberFeatureCall__Group_1_1__4
             {
-            pushFollow(FOLLOW_119);
+            pushFollow(FOLLOW_127);
             rule__XMemberFeatureCall__Group_1_1__3__Impl();
 
             state._fsp--;
@@ -49370,27 +52991,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__3__Impl"
-    // InternalDataDSL.g:14773:1: rule__XMemberFeatureCall__Group_1_1__3__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) ;
+    // InternalDataDSL.g:15859:1: rule__XMemberFeatureCall__Group_1_1__3__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14777:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) )
-            // InternalDataDSL.g:14778:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            // InternalDataDSL.g:15863:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? ) )
+            // InternalDataDSL.g:15864:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
             {
-            // InternalDataDSL.g:14778:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
-            // InternalDataDSL.g:14779:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            // InternalDataDSL.g:15864:1: ( ( rule__XMemberFeatureCall__Group_1_1_3__0 )? )
+            // InternalDataDSL.g:15865:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3()); 
             }
-            // InternalDataDSL.g:14780:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
-            int alt123=2;
-            alt123 = dfa123.predict(input);
-            switch (alt123) {
+            // InternalDataDSL.g:15866:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?
+            int alt128=2;
+            alt128 = dfa128.predict(input);
+            switch (alt128) {
                 case 1 :
-                    // InternalDataDSL.g:14780:3: rule__XMemberFeatureCall__Group_1_1_3__0
+                    // InternalDataDSL.g:15866:3: rule__XMemberFeatureCall__Group_1_1_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Group_1_1_3__0();
@@ -49428,14 +53049,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4"
-    // InternalDataDSL.g:14788:1: rule__XMemberFeatureCall__Group_1_1__4 : rule__XMemberFeatureCall__Group_1_1__4__Impl ;
+    // InternalDataDSL.g:15874:1: rule__XMemberFeatureCall__Group_1_1__4 : rule__XMemberFeatureCall__Group_1_1__4__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14792:1: ( rule__XMemberFeatureCall__Group_1_1__4__Impl )
-            // InternalDataDSL.g:14793:2: rule__XMemberFeatureCall__Group_1_1__4__Impl
+            // InternalDataDSL.g:15878:1: ( rule__XMemberFeatureCall__Group_1_1__4__Impl )
+            // InternalDataDSL.g:15879:2: rule__XMemberFeatureCall__Group_1_1__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1__4__Impl();
@@ -49461,27 +53082,27 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1__4__Impl"
-    // InternalDataDSL.g:14799:1: rule__XMemberFeatureCall__Group_1_1__4__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) ;
+    // InternalDataDSL.g:15885:1: rule__XMemberFeatureCall__Group_1_1__4__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14803:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) )
-            // InternalDataDSL.g:14804:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            // InternalDataDSL.g:15889:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? ) )
+            // InternalDataDSL.g:15890:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
             {
-            // InternalDataDSL.g:14804:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
-            // InternalDataDSL.g:14805:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            // InternalDataDSL.g:15890:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )? )
+            // InternalDataDSL.g:15891:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_4()); 
             }
-            // InternalDataDSL.g:14806:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
-            int alt124=2;
-            alt124 = dfa124.predict(input);
-            switch (alt124) {
+            // InternalDataDSL.g:15892:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?
+            int alt129=2;
+            alt129 = dfa129.predict(input);
+            switch (alt129) {
                 case 1 :
-                    // InternalDataDSL.g:14806:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+                    // InternalDataDSL.g:15892:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
@@ -49519,14 +53140,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0"
-    // InternalDataDSL.g:14815:1: rule__XMemberFeatureCall__Group_1_1_0__0 : rule__XMemberFeatureCall__Group_1_1_0__0__Impl ;
+    // InternalDataDSL.g:15901:1: rule__XMemberFeatureCall__Group_1_1_0__0 : rule__XMemberFeatureCall__Group_1_1_0__0__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14819:1: ( rule__XMemberFeatureCall__Group_1_1_0__0__Impl )
-            // InternalDataDSL.g:14820:2: rule__XMemberFeatureCall__Group_1_1_0__0__Impl
+            // InternalDataDSL.g:15905:1: ( rule__XMemberFeatureCall__Group_1_1_0__0__Impl )
+            // InternalDataDSL.g:15906:2: rule__XMemberFeatureCall__Group_1_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0__0__Impl();
@@ -49552,23 +53173,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0__0__Impl"
-    // InternalDataDSL.g:14826:1: rule__XMemberFeatureCall__Group_1_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:15912:1: rule__XMemberFeatureCall__Group_1_1_0__0__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14830:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) )
-            // InternalDataDSL.g:14831:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:15916:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) ) )
+            // InternalDataDSL.g:15917:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:14831:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
-            // InternalDataDSL.g:14832:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:15917:1: ( ( rule__XMemberFeatureCall__Group_1_1_0_0__0 ) )
+            // InternalDataDSL.g:15918:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_0_0()); 
             }
-            // InternalDataDSL.g:14833:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
-            // InternalDataDSL.g:14833:3: rule__XMemberFeatureCall__Group_1_1_0_0__0
+            // InternalDataDSL.g:15919:2: ( rule__XMemberFeatureCall__Group_1_1_0_0__0 )
+            // InternalDataDSL.g:15919:3: rule__XMemberFeatureCall__Group_1_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0_0__0();
@@ -49603,16 +53224,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0"
-    // InternalDataDSL.g:14842:1: rule__XMemberFeatureCall__Group_1_1_0_0__0 : rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 ;
+    // InternalDataDSL.g:15928:1: rule__XMemberFeatureCall__Group_1_1_0_0__0 : rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14846:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 )
-            // InternalDataDSL.g:14847:2: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1
+            // InternalDataDSL.g:15932:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1 )
+            // InternalDataDSL.g:15933:2: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl rule__XMemberFeatureCall__Group_1_1_0_0__1
             {
-            pushFollow(FOLLOW_115);
+            pushFollow(FOLLOW_123);
             rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl();
 
             state._fsp--;
@@ -49641,23 +53262,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl"
-    // InternalDataDSL.g:14854:1: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:15940:1: rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl : ( () ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14858:1: ( ( () ) )
-            // InternalDataDSL.g:14859:1: ( () )
+            // InternalDataDSL.g:15944:1: ( ( () ) )
+            // InternalDataDSL.g:15945:1: ( () )
             {
-            // InternalDataDSL.g:14859:1: ( () )
-            // InternalDataDSL.g:14860:2: ()
+            // InternalDataDSL.g:15945:1: ( () )
+            // InternalDataDSL.g:15946:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getXMemberFeatureCallMemberCallTargetAction_1_1_0_0_0()); 
             }
-            // InternalDataDSL.g:14861:2: ()
-            // InternalDataDSL.g:14861:3: 
+            // InternalDataDSL.g:15947:2: ()
+            // InternalDataDSL.g:15947:3: 
             {
             }
 
@@ -49682,14 +53303,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1"
-    // InternalDataDSL.g:14869:1: rule__XMemberFeatureCall__Group_1_1_0_0__1 : rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl ;
+    // InternalDataDSL.g:15955:1: rule__XMemberFeatureCall__Group_1_1_0_0__1 : rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14873:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl )
-            // InternalDataDSL.g:14874:2: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
+            // InternalDataDSL.g:15959:1: ( rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl )
+            // InternalDataDSL.g:15960:2: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl();
@@ -49715,23 +53336,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl"
-    // InternalDataDSL.g:14880:1: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) ;
+    // InternalDataDSL.g:15966:1: rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14884:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) )
-            // InternalDataDSL.g:14885:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            // InternalDataDSL.g:15970:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) ) )
+            // InternalDataDSL.g:15971:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
             {
-            // InternalDataDSL.g:14885:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
-            // InternalDataDSL.g:14886:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            // InternalDataDSL.g:15971:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 ) )
+            // InternalDataDSL.g:15972:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_0_0_1()); 
             }
-            // InternalDataDSL.g:14887:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
-            // InternalDataDSL.g:14887:3: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
+            // InternalDataDSL.g:15973:2: ( rule__XMemberFeatureCall__Alternatives_1_1_0_0_1 )
+            // InternalDataDSL.g:15973:3: rule__XMemberFeatureCall__Alternatives_1_1_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Alternatives_1_1_0_0_1();
@@ -49766,16 +53387,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0"
-    // InternalDataDSL.g:14896:1: rule__XMemberFeatureCall__Group_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 ;
+    // InternalDataDSL.g:15982:1: rule__XMemberFeatureCall__Group_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14900:1: ( rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 )
-            // InternalDataDSL.g:14901:2: rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1
+            // InternalDataDSL.g:15986:1: ( rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1 )
+            // InternalDataDSL.g:15987:2: rule__XMemberFeatureCall__Group_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_1__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XMemberFeatureCall__Group_1_1_1__0__Impl();
 
             state._fsp--;
@@ -49804,17 +53425,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__0__Impl"
-    // InternalDataDSL.g:14908:1: rule__XMemberFeatureCall__Group_1_1_1__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:15994:1: rule__XMemberFeatureCall__Group_1_1_1__0__Impl : ( '<' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14912:1: ( ( '<' ) )
-            // InternalDataDSL.g:14913:1: ( '<' )
+            // InternalDataDSL.g:15998:1: ( ( '<' ) )
+            // InternalDataDSL.g:15999:1: ( '<' )
             {
-            // InternalDataDSL.g:14913:1: ( '<' )
-            // InternalDataDSL.g:14914:2: '<'
+            // InternalDataDSL.g:15999:1: ( '<' )
+            // InternalDataDSL.g:16000:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0()); 
@@ -49845,16 +53466,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1"
-    // InternalDataDSL.g:14923:1: rule__XMemberFeatureCall__Group_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 ;
+    // InternalDataDSL.g:16009:1: rule__XMemberFeatureCall__Group_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14927:1: ( rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 )
-            // InternalDataDSL.g:14928:2: rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2
+            // InternalDataDSL.g:16013:1: ( rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2 )
+            // InternalDataDSL.g:16014:2: rule__XMemberFeatureCall__Group_1_1_1__1__Impl rule__XMemberFeatureCall__Group_1_1_1__2
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XMemberFeatureCall__Group_1_1_1__1__Impl();
 
             state._fsp--;
@@ -49883,23 +53504,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__1__Impl"
-    // InternalDataDSL.g:14935:1: rule__XMemberFeatureCall__Group_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) ;
+    // InternalDataDSL.g:16021:1: rule__XMemberFeatureCall__Group_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14939:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) )
-            // InternalDataDSL.g:14940:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            // InternalDataDSL.g:16025:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) ) )
+            // InternalDataDSL.g:16026:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
             {
-            // InternalDataDSL.g:14940:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
-            // InternalDataDSL.g:14941:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            // InternalDataDSL.g:16026:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 ) )
+            // InternalDataDSL.g:16027:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_1()); 
             }
-            // InternalDataDSL.g:14942:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
-            // InternalDataDSL.g:14942:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
+            // InternalDataDSL.g:16028:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 )
+            // InternalDataDSL.g:16028:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1();
@@ -49934,16 +53555,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2"
-    // InternalDataDSL.g:14950:1: rule__XMemberFeatureCall__Group_1_1_1__2 : rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 ;
+    // InternalDataDSL.g:16036:1: rule__XMemberFeatureCall__Group_1_1_1__2 : rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14954:1: ( rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 )
-            // InternalDataDSL.g:14955:2: rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3
+            // InternalDataDSL.g:16040:1: ( rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3 )
+            // InternalDataDSL.g:16041:2: rule__XMemberFeatureCall__Group_1_1_1__2__Impl rule__XMemberFeatureCall__Group_1_1_1__3
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XMemberFeatureCall__Group_1_1_1__2__Impl();
 
             state._fsp--;
@@ -49972,37 +53593,37 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__2__Impl"
-    // InternalDataDSL.g:14962:1: rule__XMemberFeatureCall__Group_1_1_1__2__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) ;
+    // InternalDataDSL.g:16048:1: rule__XMemberFeatureCall__Group_1_1_1__2__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14966:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) )
-            // InternalDataDSL.g:14967:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            // InternalDataDSL.g:16052:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* ) )
+            // InternalDataDSL.g:16053:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
             {
-            // InternalDataDSL.g:14967:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
-            // InternalDataDSL.g:14968:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            // InternalDataDSL.g:16053:1: ( ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )* )
+            // InternalDataDSL.g:16054:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_1_2()); 
             }
-            // InternalDataDSL.g:14969:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
-            loop125:
+            // InternalDataDSL.g:16055:2: ( rule__XMemberFeatureCall__Group_1_1_1_2__0 )*
+            loop130:
             do {
-                int alt125=2;
-                int LA125_0 = input.LA(1);
+                int alt130=2;
+                int LA130_0 = input.LA(1);
 
-                if ( (LA125_0==124) ) {
-                    alt125=1;
+                if ( (LA130_0==130) ) {
+                    alt130=1;
                 }
 
 
-                switch (alt125) {
+                switch (alt130) {
             	case 1 :
-            	    // InternalDataDSL.g:14969:3: rule__XMemberFeatureCall__Group_1_1_1_2__0
+            	    // InternalDataDSL.g:16055:3: rule__XMemberFeatureCall__Group_1_1_1_2__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XMemberFeatureCall__Group_1_1_1_2__0();
 
             	    state._fsp--;
@@ -50012,7 +53633,7 @@
             	    break;
 
             	default :
-            	    break loop125;
+            	    break loop130;
                 }
             } while (true);
 
@@ -50041,14 +53662,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3"
-    // InternalDataDSL.g:14977:1: rule__XMemberFeatureCall__Group_1_1_1__3 : rule__XMemberFeatureCall__Group_1_1_1__3__Impl ;
+    // InternalDataDSL.g:16063:1: rule__XMemberFeatureCall__Group_1_1_1__3 : rule__XMemberFeatureCall__Group_1_1_1__3__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14981:1: ( rule__XMemberFeatureCall__Group_1_1_1__3__Impl )
-            // InternalDataDSL.g:14982:2: rule__XMemberFeatureCall__Group_1_1_1__3__Impl
+            // InternalDataDSL.g:16067:1: ( rule__XMemberFeatureCall__Group_1_1_1__3__Impl )
+            // InternalDataDSL.g:16068:2: rule__XMemberFeatureCall__Group_1_1_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_1__3__Impl();
@@ -50074,17 +53695,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1__3__Impl"
-    // InternalDataDSL.g:14988:1: rule__XMemberFeatureCall__Group_1_1_1__3__Impl : ( '>' ) ;
+    // InternalDataDSL.g:16074:1: rule__XMemberFeatureCall__Group_1_1_1__3__Impl : ( '>' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:14992:1: ( ( '>' ) )
-            // InternalDataDSL.g:14993:1: ( '>' )
+            // InternalDataDSL.g:16078:1: ( ( '>' ) )
+            // InternalDataDSL.g:16079:1: ( '>' )
             {
-            // InternalDataDSL.g:14993:1: ( '>' )
-            // InternalDataDSL.g:14994:2: '>'
+            // InternalDataDSL.g:16079:1: ( '>' )
+            // InternalDataDSL.g:16080:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3()); 
@@ -50115,16 +53736,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0"
-    // InternalDataDSL.g:15004:1: rule__XMemberFeatureCall__Group_1_1_1_2__0 : rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 ;
+    // InternalDataDSL.g:16090:1: rule__XMemberFeatureCall__Group_1_1_1_2__0 : rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15008:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 )
-            // InternalDataDSL.g:15009:2: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1
+            // InternalDataDSL.g:16094:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1 )
+            // InternalDataDSL.g:16095:2: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl rule__XMemberFeatureCall__Group_1_1_1_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl();
 
             state._fsp--;
@@ -50153,22 +53774,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl"
-    // InternalDataDSL.g:15016:1: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:16102:1: rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl : ( ',' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15020:1: ( ( ',' ) )
-            // InternalDataDSL.g:15021:1: ( ',' )
+            // InternalDataDSL.g:16106:1: ( ( ',' ) )
+            // InternalDataDSL.g:16107:1: ( ',' )
             {
-            // InternalDataDSL.g:15021:1: ( ',' )
-            // InternalDataDSL.g:15022:2: ','
+            // InternalDataDSL.g:16107:1: ( ',' )
+            // InternalDataDSL.g:16108:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0()); 
             }
@@ -50194,14 +53815,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1"
-    // InternalDataDSL.g:15031:1: rule__XMemberFeatureCall__Group_1_1_1_2__1 : rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl ;
+    // InternalDataDSL.g:16117:1: rule__XMemberFeatureCall__Group_1_1_1_2__1 : rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15035:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl )
-            // InternalDataDSL.g:15036:2: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
+            // InternalDataDSL.g:16121:1: ( rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl )
+            // InternalDataDSL.g:16122:2: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl();
@@ -50227,23 +53848,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl"
-    // InternalDataDSL.g:15042:1: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) ;
+    // InternalDataDSL.g:16128:1: rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl : ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15046:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) )
-            // InternalDataDSL.g:15047:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            // InternalDataDSL.g:16132:1: ( ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) ) )
+            // InternalDataDSL.g:16133:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
             {
-            // InternalDataDSL.g:15047:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
-            // InternalDataDSL.g:15048:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            // InternalDataDSL.g:16133:1: ( ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 ) )
+            // InternalDataDSL.g:16134:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsAssignment_1_1_1_2_1()); 
             }
-            // InternalDataDSL.g:15049:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
-            // InternalDataDSL.g:15049:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
+            // InternalDataDSL.g:16135:2: ( rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 )
+            // InternalDataDSL.g:16135:3: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1();
@@ -50278,16 +53899,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0"
-    // InternalDataDSL.g:15058:1: rule__XMemberFeatureCall__Group_1_1_3__0 : rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 ;
+    // InternalDataDSL.g:16144:1: rule__XMemberFeatureCall__Group_1_1_3__0 : rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15062:1: ( rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 )
-            // InternalDataDSL.g:15063:2: rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1
+            // InternalDataDSL.g:16148:1: ( rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1 )
+            // InternalDataDSL.g:16149:2: rule__XMemberFeatureCall__Group_1_1_3__0__Impl rule__XMemberFeatureCall__Group_1_1_3__1
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XMemberFeatureCall__Group_1_1_3__0__Impl();
 
             state._fsp--;
@@ -50316,23 +53937,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__0__Impl"
-    // InternalDataDSL.g:15070:1: rule__XMemberFeatureCall__Group_1_1_3__0__Impl : ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) ;
+    // InternalDataDSL.g:16156:1: rule__XMemberFeatureCall__Group_1_1_3__0__Impl : ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15074:1: ( ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) )
-            // InternalDataDSL.g:15075:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            // InternalDataDSL.g:16160:1: ( ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) ) )
+            // InternalDataDSL.g:16161:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
             {
-            // InternalDataDSL.g:15075:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
-            // InternalDataDSL.g:15076:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            // InternalDataDSL.g:16161:1: ( ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 ) )
+            // InternalDataDSL.g:16162:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallAssignment_1_1_3_0()); 
             }
-            // InternalDataDSL.g:15077:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
-            // InternalDataDSL.g:15077:3: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
+            // InternalDataDSL.g:16163:2: ( rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 )
+            // InternalDataDSL.g:16163:3: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0();
@@ -50367,16 +53988,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1"
-    // InternalDataDSL.g:15085:1: rule__XMemberFeatureCall__Group_1_1_3__1 : rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 ;
+    // InternalDataDSL.g:16171:1: rule__XMemberFeatureCall__Group_1_1_3__1 : rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15089:1: ( rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 )
-            // InternalDataDSL.g:15090:2: rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2
+            // InternalDataDSL.g:16175:1: ( rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2 )
+            // InternalDataDSL.g:16176:2: rule__XMemberFeatureCall__Group_1_1_3__1__Impl rule__XMemberFeatureCall__Group_1_1_3__2
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XMemberFeatureCall__Group_1_1_3__1__Impl();
 
             state._fsp--;
@@ -50405,31 +54026,31 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__1__Impl"
-    // InternalDataDSL.g:15097:1: rule__XMemberFeatureCall__Group_1_1_3__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) ;
+    // InternalDataDSL.g:16183:1: rule__XMemberFeatureCall__Group_1_1_3__1__Impl : ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15101:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) )
-            // InternalDataDSL.g:15102:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            // InternalDataDSL.g:16187:1: ( ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? ) )
+            // InternalDataDSL.g:16188:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
             {
-            // InternalDataDSL.g:15102:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
-            // InternalDataDSL.g:15103:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            // InternalDataDSL.g:16188:1: ( ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )? )
+            // InternalDataDSL.g:16189:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getAlternatives_1_1_3_1()); 
             }
-            // InternalDataDSL.g:15104:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
-            int alt126=2;
-            int LA126_0 = input.LA(1);
+            // InternalDataDSL.g:16190:2: ( rule__XMemberFeatureCall__Alternatives_1_1_3_1 )?
+            int alt131=2;
+            int LA131_0 = input.LA(1);
 
-            if ( ((LA126_0>=RULE_STRING && LA126_0<=RULE_DECIMAL)||LA126_0==27||LA126_0==31||(LA126_0>=34 && LA126_0<=35)||LA126_0==40||(LA126_0>=45 && LA126_0<=50)||LA126_0==74||LA126_0==101||LA126_0==122||(LA126_0>=126 && LA126_0<=127)||LA126_0==129||LA126_0==131||(LA126_0>=135 && LA126_0<=142)||LA126_0==144||LA126_0==164||LA126_0==166) ) {
-                alt126=1;
+            if ( ((LA131_0>=RULE_STRING && LA131_0<=RULE_DECIMAL)||LA131_0==27||LA131_0==31||(LA131_0>=34 && LA131_0<=35)||LA131_0==40||(LA131_0>=45 && LA131_0<=50)||LA131_0==74||LA131_0==103||LA131_0==128||(LA131_0>=132 && LA131_0<=133)||LA131_0==135||LA131_0==137||(LA131_0>=141 && LA131_0<=148)||LA131_0==150||LA131_0==177||LA131_0==179) ) {
+                alt131=1;
             }
-            switch (alt126) {
+            switch (alt131) {
                 case 1 :
-                    // InternalDataDSL.g:15104:3: rule__XMemberFeatureCall__Alternatives_1_1_3_1
+                    // InternalDataDSL.g:16190:3: rule__XMemberFeatureCall__Alternatives_1_1_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XMemberFeatureCall__Alternatives_1_1_3_1();
@@ -50467,14 +54088,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2"
-    // InternalDataDSL.g:15112:1: rule__XMemberFeatureCall__Group_1_1_3__2 : rule__XMemberFeatureCall__Group_1_1_3__2__Impl ;
+    // InternalDataDSL.g:16198:1: rule__XMemberFeatureCall__Group_1_1_3__2 : rule__XMemberFeatureCall__Group_1_1_3__2__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15116:1: ( rule__XMemberFeatureCall__Group_1_1_3__2__Impl )
-            // InternalDataDSL.g:15117:2: rule__XMemberFeatureCall__Group_1_1_3__2__Impl
+            // InternalDataDSL.g:16202:1: ( rule__XMemberFeatureCall__Group_1_1_3__2__Impl )
+            // InternalDataDSL.g:16203:2: rule__XMemberFeatureCall__Group_1_1_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3__2__Impl();
@@ -50500,22 +54121,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3__2__Impl"
-    // InternalDataDSL.g:15123:1: rule__XMemberFeatureCall__Group_1_1_3__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:16209:1: rule__XMemberFeatureCall__Group_1_1_3__2__Impl : ( ')' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15127:1: ( ( ')' ) )
-            // InternalDataDSL.g:15128:1: ( ')' )
+            // InternalDataDSL.g:16213:1: ( ( ')' ) )
+            // InternalDataDSL.g:16214:1: ( ')' )
             {
-            // InternalDataDSL.g:15128:1: ( ')' )
-            // InternalDataDSL.g:15129:2: ')'
+            // InternalDataDSL.g:16214:1: ( ')' )
+            // InternalDataDSL.g:16215:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2()); 
             }
@@ -50541,16 +54162,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0"
-    // InternalDataDSL.g:15139:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 ;
+    // InternalDataDSL.g:16225:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15143:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 )
-            // InternalDataDSL.g:15144:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1
+            // InternalDataDSL.g:16229:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1 )
+            // InternalDataDSL.g:16230:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl();
 
             state._fsp--;
@@ -50579,23 +54200,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl"
-    // InternalDataDSL.g:15151:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) ;
+    // InternalDataDSL.g:16237:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15155:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) )
-            // InternalDataDSL.g:15156:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            // InternalDataDSL.g:16241:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) ) )
+            // InternalDataDSL.g:16242:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
             {
-            // InternalDataDSL.g:15156:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
-            // InternalDataDSL.g:15157:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            // InternalDataDSL.g:16242:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 ) )
+            // InternalDataDSL.g:16243:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_0()); 
             }
-            // InternalDataDSL.g:15158:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
-            // InternalDataDSL.g:15158:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
+            // InternalDataDSL.g:16244:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 )
+            // InternalDataDSL.g:16244:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0();
@@ -50630,14 +54251,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1"
-    // InternalDataDSL.g:15166:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl ;
+    // InternalDataDSL.g:16252:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15170:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl )
-            // InternalDataDSL.g:15171:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
+            // InternalDataDSL.g:16256:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl )
+            // InternalDataDSL.g:16257:2: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl();
@@ -50663,37 +54284,37 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl"
-    // InternalDataDSL.g:15177:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) ;
+    // InternalDataDSL.g:16263:1: rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl : ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15181:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) )
-            // InternalDataDSL.g:15182:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            // InternalDataDSL.g:16267:1: ( ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* ) )
+            // InternalDataDSL.g:16268:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
             {
-            // InternalDataDSL.g:15182:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
-            // InternalDataDSL.g:15183:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            // InternalDataDSL.g:16268:1: ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )* )
+            // InternalDataDSL.g:16269:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getGroup_1_1_3_1_1_1()); 
             }
-            // InternalDataDSL.g:15184:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
-            loop127:
+            // InternalDataDSL.g:16270:2: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 )*
+            loop132:
             do {
-                int alt127=2;
-                int LA127_0 = input.LA(1);
+                int alt132=2;
+                int LA132_0 = input.LA(1);
 
-                if ( (LA127_0==124) ) {
-                    alt127=1;
+                if ( (LA132_0==130) ) {
+                    alt132=1;
                 }
 
 
-                switch (alt127) {
+                switch (alt132) {
             	case 1 :
-            	    // InternalDataDSL.g:15184:3: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
+            	    // InternalDataDSL.g:16270:3: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0();
 
             	    state._fsp--;
@@ -50703,7 +54324,7 @@
             	    break;
 
             	default :
-            	    break loop127;
+            	    break loop132;
                 }
             } while (true);
 
@@ -50732,16 +54353,16 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0"
-    // InternalDataDSL.g:15193:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 ;
+    // InternalDataDSL.g:16279:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15197:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 )
-            // InternalDataDSL.g:15198:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
+            // InternalDataDSL.g:16283:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 )
+            // InternalDataDSL.g:16284:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl();
 
             state._fsp--;
@@ -50770,22 +54391,22 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl"
-    // InternalDataDSL.g:15205:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:16291:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15209:1: ( ( ',' ) )
-            // InternalDataDSL.g:15210:1: ( ',' )
+            // InternalDataDSL.g:16295:1: ( ( ',' ) )
+            // InternalDataDSL.g:16296:1: ( ',' )
             {
-            // InternalDataDSL.g:15210:1: ( ',' )
-            // InternalDataDSL.g:15211:2: ','
+            // InternalDataDSL.g:16296:1: ( ',' )
+            // InternalDataDSL.g:16297:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0()); 
             }
@@ -50811,14 +54432,14 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1"
-    // InternalDataDSL.g:15220:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl ;
+    // InternalDataDSL.g:16306:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1 : rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15224:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl )
-            // InternalDataDSL.g:15225:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
+            // InternalDataDSL.g:16310:1: ( rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl )
+            // InternalDataDSL.g:16311:2: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl();
@@ -50844,23 +54465,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl"
-    // InternalDataDSL.g:15231:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) ;
+    // InternalDataDSL.g:16317:1: rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl : ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) ;
     public final void rule__XMemberFeatureCall__Group_1_1_3_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15235:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) )
-            // InternalDataDSL.g:15236:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            // InternalDataDSL.g:16321:1: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) ) )
+            // InternalDataDSL.g:16322:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
             {
-            // InternalDataDSL.g:15236:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
-            // InternalDataDSL.g:15237:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            // InternalDataDSL.g:16322:1: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 ) )
+            // InternalDataDSL.g:16323:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_1_1_1()); 
             }
-            // InternalDataDSL.g:15238:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
-            // InternalDataDSL.g:15238:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
+            // InternalDataDSL.g:16324:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 )
+            // InternalDataDSL.g:16324:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1();
@@ -50895,16 +54516,16 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__0"
-    // InternalDataDSL.g:15247:1: rule__XSetLiteral__Group__0 : rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 ;
+    // InternalDataDSL.g:16333:1: rule__XSetLiteral__Group__0 : rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 ;
     public final void rule__XSetLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15251:1: ( rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 )
-            // InternalDataDSL.g:15252:2: rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1
+            // InternalDataDSL.g:16337:1: ( rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1 )
+            // InternalDataDSL.g:16338:2: rule__XSetLiteral__Group__0__Impl rule__XSetLiteral__Group__1
             {
-            pushFollow(FOLLOW_87);
+            pushFollow(FOLLOW_95);
             rule__XSetLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -50933,23 +54554,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__0__Impl"
-    // InternalDataDSL.g:15259:1: rule__XSetLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:16345:1: rule__XSetLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XSetLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15263:1: ( ( () ) )
-            // InternalDataDSL.g:15264:1: ( () )
+            // InternalDataDSL.g:16349:1: ( ( () ) )
+            // InternalDataDSL.g:16350:1: ( () )
             {
-            // InternalDataDSL.g:15264:1: ( () )
-            // InternalDataDSL.g:15265:2: ()
+            // InternalDataDSL.g:16350:1: ( () )
+            // InternalDataDSL.g:16351:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getXSetLiteralAction_0()); 
             }
-            // InternalDataDSL.g:15266:2: ()
-            // InternalDataDSL.g:15266:3: 
+            // InternalDataDSL.g:16352:2: ()
+            // InternalDataDSL.g:16352:3: 
             {
             }
 
@@ -50974,14 +54595,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__1"
-    // InternalDataDSL.g:15274:1: rule__XSetLiteral__Group__1 : rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 ;
+    // InternalDataDSL.g:16360:1: rule__XSetLiteral__Group__1 : rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 ;
     public final void rule__XSetLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15278:1: ( rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 )
-            // InternalDataDSL.g:15279:2: rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2
+            // InternalDataDSL.g:16364:1: ( rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2 )
+            // InternalDataDSL.g:16365:2: rule__XSetLiteral__Group__1__Impl rule__XSetLiteral__Group__2
             {
             pushFollow(FOLLOW_8);
             rule__XSetLiteral__Group__1__Impl();
@@ -51012,22 +54633,22 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__1__Impl"
-    // InternalDataDSL.g:15286:1: rule__XSetLiteral__Group__1__Impl : ( '#' ) ;
+    // InternalDataDSL.g:16372:1: rule__XSetLiteral__Group__1__Impl : ( '#' ) ;
     public final void rule__XSetLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15290:1: ( ( '#' ) )
-            // InternalDataDSL.g:15291:1: ( '#' )
+            // InternalDataDSL.g:16376:1: ( ( '#' ) )
+            // InternalDataDSL.g:16377:1: ( '#' )
             {
-            // InternalDataDSL.g:15291:1: ( '#' )
-            // InternalDataDSL.g:15292:2: '#'
+            // InternalDataDSL.g:16377:1: ( '#' )
+            // InternalDataDSL.g:16378:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); 
             }
-            match(input,126,FOLLOW_2); if (state.failed) return ;
+            match(input,132,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1()); 
             }
@@ -51053,16 +54674,16 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__2"
-    // InternalDataDSL.g:15301:1: rule__XSetLiteral__Group__2 : rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 ;
+    // InternalDataDSL.g:16387:1: rule__XSetLiteral__Group__2 : rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 ;
     public final void rule__XSetLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15305:1: ( rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 )
-            // InternalDataDSL.g:15306:2: rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3
+            // InternalDataDSL.g:16391:1: ( rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3 )
+            // InternalDataDSL.g:16392:2: rule__XSetLiteral__Group__2__Impl rule__XSetLiteral__Group__3
             {
-            pushFollow(FOLLOW_123);
+            pushFollow(FOLLOW_131);
             rule__XSetLiteral__Group__2__Impl();
 
             state._fsp--;
@@ -51091,17 +54712,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__2__Impl"
-    // InternalDataDSL.g:15313:1: rule__XSetLiteral__Group__2__Impl : ( '{' ) ;
+    // InternalDataDSL.g:16399:1: rule__XSetLiteral__Group__2__Impl : ( '{' ) ;
     public final void rule__XSetLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15317:1: ( ( '{' ) )
-            // InternalDataDSL.g:15318:1: ( '{' )
+            // InternalDataDSL.g:16403:1: ( ( '{' ) )
+            // InternalDataDSL.g:16404:1: ( '{' )
             {
-            // InternalDataDSL.g:15318:1: ( '{' )
-            // InternalDataDSL.g:15319:2: '{'
+            // InternalDataDSL.g:16404:1: ( '{' )
+            // InternalDataDSL.g:16405:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2()); 
@@ -51132,16 +54753,16 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__3"
-    // InternalDataDSL.g:15328:1: rule__XSetLiteral__Group__3 : rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 ;
+    // InternalDataDSL.g:16414:1: rule__XSetLiteral__Group__3 : rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 ;
     public final void rule__XSetLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15332:1: ( rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 )
-            // InternalDataDSL.g:15333:2: rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4
+            // InternalDataDSL.g:16418:1: ( rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4 )
+            // InternalDataDSL.g:16419:2: rule__XSetLiteral__Group__3__Impl rule__XSetLiteral__Group__4
             {
-            pushFollow(FOLLOW_123);
+            pushFollow(FOLLOW_131);
             rule__XSetLiteral__Group__3__Impl();
 
             state._fsp--;
@@ -51170,31 +54791,31 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__3__Impl"
-    // InternalDataDSL.g:15340:1: rule__XSetLiteral__Group__3__Impl : ( ( rule__XSetLiteral__Group_3__0 )? ) ;
+    // InternalDataDSL.g:16426:1: rule__XSetLiteral__Group__3__Impl : ( ( rule__XSetLiteral__Group_3__0 )? ) ;
     public final void rule__XSetLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15344:1: ( ( ( rule__XSetLiteral__Group_3__0 )? ) )
-            // InternalDataDSL.g:15345:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            // InternalDataDSL.g:16430:1: ( ( ( rule__XSetLiteral__Group_3__0 )? ) )
+            // InternalDataDSL.g:16431:1: ( ( rule__XSetLiteral__Group_3__0 )? )
             {
-            // InternalDataDSL.g:15345:1: ( ( rule__XSetLiteral__Group_3__0 )? )
-            // InternalDataDSL.g:15346:2: ( rule__XSetLiteral__Group_3__0 )?
+            // InternalDataDSL.g:16431:1: ( ( rule__XSetLiteral__Group_3__0 )? )
+            // InternalDataDSL.g:16432:2: ( rule__XSetLiteral__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:15347:2: ( rule__XSetLiteral__Group_3__0 )?
-            int alt128=2;
-            int LA128_0 = input.LA(1);
+            // InternalDataDSL.g:16433:2: ( rule__XSetLiteral__Group_3__0 )?
+            int alt133=2;
+            int LA133_0 = input.LA(1);
 
-            if ( ((LA128_0>=RULE_STRING && LA128_0<=RULE_DECIMAL)||LA128_0==27||(LA128_0>=34 && LA128_0<=35)||LA128_0==40||(LA128_0>=45 && LA128_0<=50)||LA128_0==74||LA128_0==101||LA128_0==122||(LA128_0>=126 && LA128_0<=127)||LA128_0==129||LA128_0==131||(LA128_0>=135 && LA128_0<=142)||LA128_0==144||LA128_0==166) ) {
-                alt128=1;
+            if ( ((LA133_0>=RULE_STRING && LA133_0<=RULE_DECIMAL)||LA133_0==27||(LA133_0>=34 && LA133_0<=35)||LA133_0==40||(LA133_0>=45 && LA133_0<=50)||LA133_0==74||LA133_0==103||LA133_0==128||(LA133_0>=132 && LA133_0<=133)||LA133_0==135||LA133_0==137||(LA133_0>=141 && LA133_0<=148)||LA133_0==150||LA133_0==179) ) {
+                alt133=1;
             }
-            switch (alt128) {
+            switch (alt133) {
                 case 1 :
-                    // InternalDataDSL.g:15347:3: rule__XSetLiteral__Group_3__0
+                    // InternalDataDSL.g:16433:3: rule__XSetLiteral__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSetLiteral__Group_3__0();
@@ -51232,14 +54853,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__4"
-    // InternalDataDSL.g:15355:1: rule__XSetLiteral__Group__4 : rule__XSetLiteral__Group__4__Impl ;
+    // InternalDataDSL.g:16441:1: rule__XSetLiteral__Group__4 : rule__XSetLiteral__Group__4__Impl ;
     public final void rule__XSetLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15359:1: ( rule__XSetLiteral__Group__4__Impl )
-            // InternalDataDSL.g:15360:2: rule__XSetLiteral__Group__4__Impl
+            // InternalDataDSL.g:16445:1: ( rule__XSetLiteral__Group__4__Impl )
+            // InternalDataDSL.g:16446:2: rule__XSetLiteral__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group__4__Impl();
@@ -51265,17 +54886,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group__4__Impl"
-    // InternalDataDSL.g:15366:1: rule__XSetLiteral__Group__4__Impl : ( '}' ) ;
+    // InternalDataDSL.g:16452:1: rule__XSetLiteral__Group__4__Impl : ( '}' ) ;
     public final void rule__XSetLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15370:1: ( ( '}' ) )
-            // InternalDataDSL.g:15371:1: ( '}' )
+            // InternalDataDSL.g:16456:1: ( ( '}' ) )
+            // InternalDataDSL.g:16457:1: ( '}' )
             {
-            // InternalDataDSL.g:15371:1: ( '}' )
-            // InternalDataDSL.g:15372:2: '}'
+            // InternalDataDSL.g:16457:1: ( '}' )
+            // InternalDataDSL.g:16458:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getRightCurlyBracketKeyword_4()); 
@@ -51306,16 +54927,16 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__0"
-    // InternalDataDSL.g:15382:1: rule__XSetLiteral__Group_3__0 : rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 ;
+    // InternalDataDSL.g:16468:1: rule__XSetLiteral__Group_3__0 : rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 ;
     public final void rule__XSetLiteral__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15386:1: ( rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 )
-            // InternalDataDSL.g:15387:2: rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1
+            // InternalDataDSL.g:16472:1: ( rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1 )
+            // InternalDataDSL.g:16473:2: rule__XSetLiteral__Group_3__0__Impl rule__XSetLiteral__Group_3__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XSetLiteral__Group_3__0__Impl();
 
             state._fsp--;
@@ -51344,23 +54965,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__0__Impl"
-    // InternalDataDSL.g:15394:1: rule__XSetLiteral__Group_3__0__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:16480:1: rule__XSetLiteral__Group_3__0__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) ;
     public final void rule__XSetLiteral__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15398:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) )
-            // InternalDataDSL.g:15399:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            // InternalDataDSL.g:16484:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalDataDSL.g:16485:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:15399:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
-            // InternalDataDSL.g:15400:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            // InternalDataDSL.g:16485:1: ( ( rule__XSetLiteral__ElementsAssignment_3_0 ) )
+            // InternalDataDSL.g:16486:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_0()); 
             }
-            // InternalDataDSL.g:15401:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
-            // InternalDataDSL.g:15401:3: rule__XSetLiteral__ElementsAssignment_3_0
+            // InternalDataDSL.g:16487:2: ( rule__XSetLiteral__ElementsAssignment_3_0 )
+            // InternalDataDSL.g:16487:3: rule__XSetLiteral__ElementsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__ElementsAssignment_3_0();
@@ -51395,14 +55016,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__1"
-    // InternalDataDSL.g:15409:1: rule__XSetLiteral__Group_3__1 : rule__XSetLiteral__Group_3__1__Impl ;
+    // InternalDataDSL.g:16495:1: rule__XSetLiteral__Group_3__1 : rule__XSetLiteral__Group_3__1__Impl ;
     public final void rule__XSetLiteral__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15413:1: ( rule__XSetLiteral__Group_3__1__Impl )
-            // InternalDataDSL.g:15414:2: rule__XSetLiteral__Group_3__1__Impl
+            // InternalDataDSL.g:16499:1: ( rule__XSetLiteral__Group_3__1__Impl )
+            // InternalDataDSL.g:16500:2: rule__XSetLiteral__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group_3__1__Impl();
@@ -51428,37 +55049,37 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3__1__Impl"
-    // InternalDataDSL.g:15420:1: rule__XSetLiteral__Group_3__1__Impl : ( ( rule__XSetLiteral__Group_3_1__0 )* ) ;
+    // InternalDataDSL.g:16506:1: rule__XSetLiteral__Group_3__1__Impl : ( ( rule__XSetLiteral__Group_3_1__0 )* ) ;
     public final void rule__XSetLiteral__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15424:1: ( ( ( rule__XSetLiteral__Group_3_1__0 )* ) )
-            // InternalDataDSL.g:15425:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            // InternalDataDSL.g:16510:1: ( ( ( rule__XSetLiteral__Group_3_1__0 )* ) )
+            // InternalDataDSL.g:16511:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
             {
-            // InternalDataDSL.g:15425:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
-            // InternalDataDSL.g:15426:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            // InternalDataDSL.g:16511:1: ( ( rule__XSetLiteral__Group_3_1__0 )* )
+            // InternalDataDSL.g:16512:2: ( rule__XSetLiteral__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getGroup_3_1()); 
             }
-            // InternalDataDSL.g:15427:2: ( rule__XSetLiteral__Group_3_1__0 )*
-            loop129:
+            // InternalDataDSL.g:16513:2: ( rule__XSetLiteral__Group_3_1__0 )*
+            loop134:
             do {
-                int alt129=2;
-                int LA129_0 = input.LA(1);
+                int alt134=2;
+                int LA134_0 = input.LA(1);
 
-                if ( (LA129_0==124) ) {
-                    alt129=1;
+                if ( (LA134_0==130) ) {
+                    alt134=1;
                 }
 
 
-                switch (alt129) {
+                switch (alt134) {
             	case 1 :
-            	    // InternalDataDSL.g:15427:3: rule__XSetLiteral__Group_3_1__0
+            	    // InternalDataDSL.g:16513:3: rule__XSetLiteral__Group_3_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XSetLiteral__Group_3_1__0();
 
             	    state._fsp--;
@@ -51468,7 +55089,7 @@
             	    break;
 
             	default :
-            	    break loop129;
+            	    break loop134;
                 }
             } while (true);
 
@@ -51497,16 +55118,16 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__0"
-    // InternalDataDSL.g:15436:1: rule__XSetLiteral__Group_3_1__0 : rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 ;
+    // InternalDataDSL.g:16522:1: rule__XSetLiteral__Group_3_1__0 : rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 ;
     public final void rule__XSetLiteral__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15440:1: ( rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 )
-            // InternalDataDSL.g:15441:2: rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1
+            // InternalDataDSL.g:16526:1: ( rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1 )
+            // InternalDataDSL.g:16527:2: rule__XSetLiteral__Group_3_1__0__Impl rule__XSetLiteral__Group_3_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XSetLiteral__Group_3_1__0__Impl();
 
             state._fsp--;
@@ -51535,22 +55156,22 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__0__Impl"
-    // InternalDataDSL.g:15448:1: rule__XSetLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:16534:1: rule__XSetLiteral__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XSetLiteral__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15452:1: ( ( ',' ) )
-            // InternalDataDSL.g:15453:1: ( ',' )
+            // InternalDataDSL.g:16538:1: ( ( ',' ) )
+            // InternalDataDSL.g:16539:1: ( ',' )
             {
-            // InternalDataDSL.g:15453:1: ( ',' )
-            // InternalDataDSL.g:15454:2: ','
+            // InternalDataDSL.g:16539:1: ( ',' )
+            // InternalDataDSL.g:16540:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0()); 
             }
@@ -51576,14 +55197,14 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__1"
-    // InternalDataDSL.g:15463:1: rule__XSetLiteral__Group_3_1__1 : rule__XSetLiteral__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:16549:1: rule__XSetLiteral__Group_3_1__1 : rule__XSetLiteral__Group_3_1__1__Impl ;
     public final void rule__XSetLiteral__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15467:1: ( rule__XSetLiteral__Group_3_1__1__Impl )
-            // InternalDataDSL.g:15468:2: rule__XSetLiteral__Group_3_1__1__Impl
+            // InternalDataDSL.g:16553:1: ( rule__XSetLiteral__Group_3_1__1__Impl )
+            // InternalDataDSL.g:16554:2: rule__XSetLiteral__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__Group_3_1__1__Impl();
@@ -51609,23 +55230,23 @@
 
 
     // $ANTLR start "rule__XSetLiteral__Group_3_1__1__Impl"
-    // InternalDataDSL.g:15474:1: rule__XSetLiteral__Group_3_1__1__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:16560:1: rule__XSetLiteral__Group_3_1__1__Impl : ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) ;
     public final void rule__XSetLiteral__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15478:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:15479:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:16564:1: ( ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:16565:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:15479:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
-            // InternalDataDSL.g:15480:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            // InternalDataDSL.g:16565:1: ( ( rule__XSetLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:16566:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:15481:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
-            // InternalDataDSL.g:15481:3: rule__XSetLiteral__ElementsAssignment_3_1_1
+            // InternalDataDSL.g:16567:2: ( rule__XSetLiteral__ElementsAssignment_3_1_1 )
+            // InternalDataDSL.g:16567:3: rule__XSetLiteral__ElementsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XSetLiteral__ElementsAssignment_3_1_1();
@@ -51660,16 +55281,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__0"
-    // InternalDataDSL.g:15490:1: rule__XListLiteral__Group__0 : rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 ;
+    // InternalDataDSL.g:16576:1: rule__XListLiteral__Group__0 : rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 ;
     public final void rule__XListLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15494:1: ( rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 )
-            // InternalDataDSL.g:15495:2: rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1
+            // InternalDataDSL.g:16580:1: ( rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1 )
+            // InternalDataDSL.g:16581:2: rule__XListLiteral__Group__0__Impl rule__XListLiteral__Group__1
             {
-            pushFollow(FOLLOW_87);
+            pushFollow(FOLLOW_95);
             rule__XListLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -51698,23 +55319,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__0__Impl"
-    // InternalDataDSL.g:15502:1: rule__XListLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:16588:1: rule__XListLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XListLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15506:1: ( ( () ) )
-            // InternalDataDSL.g:15507:1: ( () )
+            // InternalDataDSL.g:16592:1: ( ( () ) )
+            // InternalDataDSL.g:16593:1: ( () )
             {
-            // InternalDataDSL.g:15507:1: ( () )
-            // InternalDataDSL.g:15508:2: ()
+            // InternalDataDSL.g:16593:1: ( () )
+            // InternalDataDSL.g:16594:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getXListLiteralAction_0()); 
             }
-            // InternalDataDSL.g:15509:2: ()
-            // InternalDataDSL.g:15509:3: 
+            // InternalDataDSL.g:16595:2: ()
+            // InternalDataDSL.g:16595:3: 
             {
             }
 
@@ -51739,16 +55360,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__1"
-    // InternalDataDSL.g:15517:1: rule__XListLiteral__Group__1 : rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 ;
+    // InternalDataDSL.g:16603:1: rule__XListLiteral__Group__1 : rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 ;
     public final void rule__XListLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15521:1: ( rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 )
-            // InternalDataDSL.g:15522:2: rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2
+            // InternalDataDSL.g:16607:1: ( rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2 )
+            // InternalDataDSL.g:16608:2: rule__XListLiteral__Group__1__Impl rule__XListLiteral__Group__2
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__XListLiteral__Group__1__Impl();
 
             state._fsp--;
@@ -51777,22 +55398,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__1__Impl"
-    // InternalDataDSL.g:15529:1: rule__XListLiteral__Group__1__Impl : ( '#' ) ;
+    // InternalDataDSL.g:16615:1: rule__XListLiteral__Group__1__Impl : ( '#' ) ;
     public final void rule__XListLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15533:1: ( ( '#' ) )
-            // InternalDataDSL.g:15534:1: ( '#' )
+            // InternalDataDSL.g:16619:1: ( ( '#' ) )
+            // InternalDataDSL.g:16620:1: ( '#' )
             {
-            // InternalDataDSL.g:15534:1: ( '#' )
-            // InternalDataDSL.g:15535:2: '#'
+            // InternalDataDSL.g:16620:1: ( '#' )
+            // InternalDataDSL.g:16621:2: '#'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); 
             }
-            match(input,126,FOLLOW_2); if (state.failed) return ;
+            match(input,132,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1()); 
             }
@@ -51818,16 +55439,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__2"
-    // InternalDataDSL.g:15544:1: rule__XListLiteral__Group__2 : rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 ;
+    // InternalDataDSL.g:16630:1: rule__XListLiteral__Group__2 : rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 ;
     public final void rule__XListLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15548:1: ( rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 )
-            // InternalDataDSL.g:15549:2: rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3
+            // InternalDataDSL.g:16634:1: ( rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3 )
+            // InternalDataDSL.g:16635:2: rule__XListLiteral__Group__2__Impl rule__XListLiteral__Group__3
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XListLiteral__Group__2__Impl();
 
             state._fsp--;
@@ -51856,22 +55477,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__2__Impl"
-    // InternalDataDSL.g:15556:1: rule__XListLiteral__Group__2__Impl : ( '[' ) ;
+    // InternalDataDSL.g:16642:1: rule__XListLiteral__Group__2__Impl : ( '[' ) ;
     public final void rule__XListLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15560:1: ( ( '[' ) )
-            // InternalDataDSL.g:15561:1: ( '[' )
+            // InternalDataDSL.g:16646:1: ( ( '[' ) )
+            // InternalDataDSL.g:16647:1: ( '[' )
             {
-            // InternalDataDSL.g:15561:1: ( '[' )
-            // InternalDataDSL.g:15562:2: '['
+            // InternalDataDSL.g:16647:1: ( '[' )
+            // InternalDataDSL.g:16648:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); 
             }
-            match(input,127,FOLLOW_2); if (state.failed) return ;
+            match(input,133,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2()); 
             }
@@ -51897,16 +55518,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__3"
-    // InternalDataDSL.g:15571:1: rule__XListLiteral__Group__3 : rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 ;
+    // InternalDataDSL.g:16657:1: rule__XListLiteral__Group__3 : rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 ;
     public final void rule__XListLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15575:1: ( rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 )
-            // InternalDataDSL.g:15576:2: rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4
+            // InternalDataDSL.g:16661:1: ( rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4 )
+            // InternalDataDSL.g:16662:2: rule__XListLiteral__Group__3__Impl rule__XListLiteral__Group__4
             {
-            pushFollow(FOLLOW_86);
+            pushFollow(FOLLOW_94);
             rule__XListLiteral__Group__3__Impl();
 
             state._fsp--;
@@ -51935,31 +55556,31 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__3__Impl"
-    // InternalDataDSL.g:15583:1: rule__XListLiteral__Group__3__Impl : ( ( rule__XListLiteral__Group_3__0 )? ) ;
+    // InternalDataDSL.g:16669:1: rule__XListLiteral__Group__3__Impl : ( ( rule__XListLiteral__Group_3__0 )? ) ;
     public final void rule__XListLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15587:1: ( ( ( rule__XListLiteral__Group_3__0 )? ) )
-            // InternalDataDSL.g:15588:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            // InternalDataDSL.g:16673:1: ( ( ( rule__XListLiteral__Group_3__0 )? ) )
+            // InternalDataDSL.g:16674:1: ( ( rule__XListLiteral__Group_3__0 )? )
             {
-            // InternalDataDSL.g:15588:1: ( ( rule__XListLiteral__Group_3__0 )? )
-            // InternalDataDSL.g:15589:2: ( rule__XListLiteral__Group_3__0 )?
+            // InternalDataDSL.g:16674:1: ( ( rule__XListLiteral__Group_3__0 )? )
+            // InternalDataDSL.g:16675:2: ( rule__XListLiteral__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:15590:2: ( rule__XListLiteral__Group_3__0 )?
-            int alt130=2;
-            int LA130_0 = input.LA(1);
+            // InternalDataDSL.g:16676:2: ( rule__XListLiteral__Group_3__0 )?
+            int alt135=2;
+            int LA135_0 = input.LA(1);
 
-            if ( ((LA130_0>=RULE_STRING && LA130_0<=RULE_DECIMAL)||LA130_0==27||(LA130_0>=34 && LA130_0<=35)||LA130_0==40||(LA130_0>=45 && LA130_0<=50)||LA130_0==74||LA130_0==101||LA130_0==122||(LA130_0>=126 && LA130_0<=127)||LA130_0==129||LA130_0==131||(LA130_0>=135 && LA130_0<=142)||LA130_0==144||LA130_0==166) ) {
-                alt130=1;
+            if ( ((LA135_0>=RULE_STRING && LA135_0<=RULE_DECIMAL)||LA135_0==27||(LA135_0>=34 && LA135_0<=35)||LA135_0==40||(LA135_0>=45 && LA135_0<=50)||LA135_0==74||LA135_0==103||LA135_0==128||(LA135_0>=132 && LA135_0<=133)||LA135_0==135||LA135_0==137||(LA135_0>=141 && LA135_0<=148)||LA135_0==150||LA135_0==179) ) {
+                alt135=1;
             }
-            switch (alt130) {
+            switch (alt135) {
                 case 1 :
-                    // InternalDataDSL.g:15590:3: rule__XListLiteral__Group_3__0
+                    // InternalDataDSL.g:16676:3: rule__XListLiteral__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XListLiteral__Group_3__0();
@@ -51997,14 +55618,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__4"
-    // InternalDataDSL.g:15598:1: rule__XListLiteral__Group__4 : rule__XListLiteral__Group__4__Impl ;
+    // InternalDataDSL.g:16684:1: rule__XListLiteral__Group__4 : rule__XListLiteral__Group__4__Impl ;
     public final void rule__XListLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15602:1: ( rule__XListLiteral__Group__4__Impl )
-            // InternalDataDSL.g:15603:2: rule__XListLiteral__Group__4__Impl
+            // InternalDataDSL.g:16688:1: ( rule__XListLiteral__Group__4__Impl )
+            // InternalDataDSL.g:16689:2: rule__XListLiteral__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group__4__Impl();
@@ -52030,22 +55651,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group__4__Impl"
-    // InternalDataDSL.g:15609:1: rule__XListLiteral__Group__4__Impl : ( ']' ) ;
+    // InternalDataDSL.g:16695:1: rule__XListLiteral__Group__4__Impl : ( ']' ) ;
     public final void rule__XListLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15613:1: ( ( ']' ) )
-            // InternalDataDSL.g:15614:1: ( ']' )
+            // InternalDataDSL.g:16699:1: ( ( ']' ) )
+            // InternalDataDSL.g:16700:1: ( ']' )
             {
-            // InternalDataDSL.g:15614:1: ( ']' )
-            // InternalDataDSL.g:15615:2: ']'
+            // InternalDataDSL.g:16700:1: ( ']' )
+            // InternalDataDSL.g:16701:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); 
             }
-            match(input,125,FOLLOW_2); if (state.failed) return ;
+            match(input,131,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4()); 
             }
@@ -52071,16 +55692,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__0"
-    // InternalDataDSL.g:15625:1: rule__XListLiteral__Group_3__0 : rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 ;
+    // InternalDataDSL.g:16711:1: rule__XListLiteral__Group_3__0 : rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 ;
     public final void rule__XListLiteral__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15629:1: ( rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 )
-            // InternalDataDSL.g:15630:2: rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1
+            // InternalDataDSL.g:16715:1: ( rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1 )
+            // InternalDataDSL.g:16716:2: rule__XListLiteral__Group_3__0__Impl rule__XListLiteral__Group_3__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XListLiteral__Group_3__0__Impl();
 
             state._fsp--;
@@ -52109,23 +55730,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__0__Impl"
-    // InternalDataDSL.g:15637:1: rule__XListLiteral__Group_3__0__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:16723:1: rule__XListLiteral__Group_3__0__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) ;
     public final void rule__XListLiteral__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15641:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) )
-            // InternalDataDSL.g:15642:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            // InternalDataDSL.g:16727:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_0 ) ) )
+            // InternalDataDSL.g:16728:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:15642:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
-            // InternalDataDSL.g:15643:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            // InternalDataDSL.g:16728:1: ( ( rule__XListLiteral__ElementsAssignment_3_0 ) )
+            // InternalDataDSL.g:16729:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_0()); 
             }
-            // InternalDataDSL.g:15644:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
-            // InternalDataDSL.g:15644:3: rule__XListLiteral__ElementsAssignment_3_0
+            // InternalDataDSL.g:16730:2: ( rule__XListLiteral__ElementsAssignment_3_0 )
+            // InternalDataDSL.g:16730:3: rule__XListLiteral__ElementsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__ElementsAssignment_3_0();
@@ -52160,14 +55781,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__1"
-    // InternalDataDSL.g:15652:1: rule__XListLiteral__Group_3__1 : rule__XListLiteral__Group_3__1__Impl ;
+    // InternalDataDSL.g:16738:1: rule__XListLiteral__Group_3__1 : rule__XListLiteral__Group_3__1__Impl ;
     public final void rule__XListLiteral__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15656:1: ( rule__XListLiteral__Group_3__1__Impl )
-            // InternalDataDSL.g:15657:2: rule__XListLiteral__Group_3__1__Impl
+            // InternalDataDSL.g:16742:1: ( rule__XListLiteral__Group_3__1__Impl )
+            // InternalDataDSL.g:16743:2: rule__XListLiteral__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group_3__1__Impl();
@@ -52193,37 +55814,37 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3__1__Impl"
-    // InternalDataDSL.g:15663:1: rule__XListLiteral__Group_3__1__Impl : ( ( rule__XListLiteral__Group_3_1__0 )* ) ;
+    // InternalDataDSL.g:16749:1: rule__XListLiteral__Group_3__1__Impl : ( ( rule__XListLiteral__Group_3_1__0 )* ) ;
     public final void rule__XListLiteral__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15667:1: ( ( ( rule__XListLiteral__Group_3_1__0 )* ) )
-            // InternalDataDSL.g:15668:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            // InternalDataDSL.g:16753:1: ( ( ( rule__XListLiteral__Group_3_1__0 )* ) )
+            // InternalDataDSL.g:16754:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
             {
-            // InternalDataDSL.g:15668:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
-            // InternalDataDSL.g:15669:2: ( rule__XListLiteral__Group_3_1__0 )*
+            // InternalDataDSL.g:16754:1: ( ( rule__XListLiteral__Group_3_1__0 )* )
+            // InternalDataDSL.g:16755:2: ( rule__XListLiteral__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getGroup_3_1()); 
             }
-            // InternalDataDSL.g:15670:2: ( rule__XListLiteral__Group_3_1__0 )*
-            loop131:
+            // InternalDataDSL.g:16756:2: ( rule__XListLiteral__Group_3_1__0 )*
+            loop136:
             do {
-                int alt131=2;
-                int LA131_0 = input.LA(1);
+                int alt136=2;
+                int LA136_0 = input.LA(1);
 
-                if ( (LA131_0==124) ) {
-                    alt131=1;
+                if ( (LA136_0==130) ) {
+                    alt136=1;
                 }
 
 
-                switch (alt131) {
+                switch (alt136) {
             	case 1 :
-            	    // InternalDataDSL.g:15670:3: rule__XListLiteral__Group_3_1__0
+            	    // InternalDataDSL.g:16756:3: rule__XListLiteral__Group_3_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XListLiteral__Group_3_1__0();
 
             	    state._fsp--;
@@ -52233,7 +55854,7 @@
             	    break;
 
             	default :
-            	    break loop131;
+            	    break loop136;
                 }
             } while (true);
 
@@ -52262,16 +55883,16 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__0"
-    // InternalDataDSL.g:15679:1: rule__XListLiteral__Group_3_1__0 : rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 ;
+    // InternalDataDSL.g:16765:1: rule__XListLiteral__Group_3_1__0 : rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 ;
     public final void rule__XListLiteral__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15683:1: ( rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 )
-            // InternalDataDSL.g:15684:2: rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1
+            // InternalDataDSL.g:16769:1: ( rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1 )
+            // InternalDataDSL.g:16770:2: rule__XListLiteral__Group_3_1__0__Impl rule__XListLiteral__Group_3_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XListLiteral__Group_3_1__0__Impl();
 
             state._fsp--;
@@ -52300,22 +55921,22 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__0__Impl"
-    // InternalDataDSL.g:15691:1: rule__XListLiteral__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:16777:1: rule__XListLiteral__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XListLiteral__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15695:1: ( ( ',' ) )
-            // InternalDataDSL.g:15696:1: ( ',' )
+            // InternalDataDSL.g:16781:1: ( ( ',' ) )
+            // InternalDataDSL.g:16782:1: ( ',' )
             {
-            // InternalDataDSL.g:15696:1: ( ',' )
-            // InternalDataDSL.g:15697:2: ','
+            // InternalDataDSL.g:16782:1: ( ',' )
+            // InternalDataDSL.g:16783:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0()); 
             }
@@ -52341,14 +55962,14 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__1"
-    // InternalDataDSL.g:15706:1: rule__XListLiteral__Group_3_1__1 : rule__XListLiteral__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:16792:1: rule__XListLiteral__Group_3_1__1 : rule__XListLiteral__Group_3_1__1__Impl ;
     public final void rule__XListLiteral__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15710:1: ( rule__XListLiteral__Group_3_1__1__Impl )
-            // InternalDataDSL.g:15711:2: rule__XListLiteral__Group_3_1__1__Impl
+            // InternalDataDSL.g:16796:1: ( rule__XListLiteral__Group_3_1__1__Impl )
+            // InternalDataDSL.g:16797:2: rule__XListLiteral__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__Group_3_1__1__Impl();
@@ -52374,23 +55995,23 @@
 
 
     // $ANTLR start "rule__XListLiteral__Group_3_1__1__Impl"
-    // InternalDataDSL.g:15717:1: rule__XListLiteral__Group_3_1__1__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:16803:1: rule__XListLiteral__Group_3_1__1__Impl : ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) ;
     public final void rule__XListLiteral__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15721:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:15722:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:16807:1: ( ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:16808:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:15722:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
-            // InternalDataDSL.g:15723:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            // InternalDataDSL.g:16808:1: ( ( rule__XListLiteral__ElementsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:16809:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:15724:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
-            // InternalDataDSL.g:15724:3: rule__XListLiteral__ElementsAssignment_3_1_1
+            // InternalDataDSL.g:16810:2: ( rule__XListLiteral__ElementsAssignment_3_1_1 )
+            // InternalDataDSL.g:16810:3: rule__XListLiteral__ElementsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XListLiteral__ElementsAssignment_3_1_1();
@@ -52425,16 +56046,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group__0"
-    // InternalDataDSL.g:15733:1: rule__XClosure__Group__0 : rule__XClosure__Group__0__Impl rule__XClosure__Group__1 ;
+    // InternalDataDSL.g:16819:1: rule__XClosure__Group__0 : rule__XClosure__Group__0__Impl rule__XClosure__Group__1 ;
     public final void rule__XClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15737:1: ( rule__XClosure__Group__0__Impl rule__XClosure__Group__1 )
-            // InternalDataDSL.g:15738:2: rule__XClosure__Group__0__Impl rule__XClosure__Group__1
+            // InternalDataDSL.g:16823:1: ( rule__XClosure__Group__0__Impl rule__XClosure__Group__1 )
+            // InternalDataDSL.g:16824:2: rule__XClosure__Group__0__Impl rule__XClosure__Group__1
             {
-            pushFollow(FOLLOW_124);
+            pushFollow(FOLLOW_132);
             rule__XClosure__Group__0__Impl();
 
             state._fsp--;
@@ -52463,23 +56084,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group__0__Impl"
-    // InternalDataDSL.g:15745:1: rule__XClosure__Group__0__Impl : ( ( rule__XClosure__Group_0__0 ) ) ;
+    // InternalDataDSL.g:16831:1: rule__XClosure__Group__0__Impl : ( ( rule__XClosure__Group_0__0 ) ) ;
     public final void rule__XClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15749:1: ( ( ( rule__XClosure__Group_0__0 ) ) )
-            // InternalDataDSL.g:15750:1: ( ( rule__XClosure__Group_0__0 ) )
+            // InternalDataDSL.g:16835:1: ( ( ( rule__XClosure__Group_0__0 ) ) )
+            // InternalDataDSL.g:16836:1: ( ( rule__XClosure__Group_0__0 ) )
             {
-            // InternalDataDSL.g:15750:1: ( ( rule__XClosure__Group_0__0 ) )
-            // InternalDataDSL.g:15751:2: ( rule__XClosure__Group_0__0 )
+            // InternalDataDSL.g:16836:1: ( ( rule__XClosure__Group_0__0 ) )
+            // InternalDataDSL.g:16837:2: ( rule__XClosure__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:15752:2: ( rule__XClosure__Group_0__0 )
-            // InternalDataDSL.g:15752:3: rule__XClosure__Group_0__0
+            // InternalDataDSL.g:16838:2: ( rule__XClosure__Group_0__0 )
+            // InternalDataDSL.g:16838:3: rule__XClosure__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0__0();
@@ -52514,16 +56135,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group__1"
-    // InternalDataDSL.g:15760:1: rule__XClosure__Group__1 : rule__XClosure__Group__1__Impl rule__XClosure__Group__2 ;
+    // InternalDataDSL.g:16846:1: rule__XClosure__Group__1 : rule__XClosure__Group__1__Impl rule__XClosure__Group__2 ;
     public final void rule__XClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15764:1: ( rule__XClosure__Group__1__Impl rule__XClosure__Group__2 )
-            // InternalDataDSL.g:15765:2: rule__XClosure__Group__1__Impl rule__XClosure__Group__2
+            // InternalDataDSL.g:16850:1: ( rule__XClosure__Group__1__Impl rule__XClosure__Group__2 )
+            // InternalDataDSL.g:16851:2: rule__XClosure__Group__1__Impl rule__XClosure__Group__2
             {
-            pushFollow(FOLLOW_124);
+            pushFollow(FOLLOW_132);
             rule__XClosure__Group__1__Impl();
 
             state._fsp--;
@@ -52552,27 +56173,27 @@
 
 
     // $ANTLR start "rule__XClosure__Group__1__Impl"
-    // InternalDataDSL.g:15772:1: rule__XClosure__Group__1__Impl : ( ( rule__XClosure__Group_1__0 )? ) ;
+    // InternalDataDSL.g:16858:1: rule__XClosure__Group__1__Impl : ( ( rule__XClosure__Group_1__0 )? ) ;
     public final void rule__XClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15776:1: ( ( ( rule__XClosure__Group_1__0 )? ) )
-            // InternalDataDSL.g:15777:1: ( ( rule__XClosure__Group_1__0 )? )
+            // InternalDataDSL.g:16862:1: ( ( ( rule__XClosure__Group_1__0 )? ) )
+            // InternalDataDSL.g:16863:1: ( ( rule__XClosure__Group_1__0 )? )
             {
-            // InternalDataDSL.g:15777:1: ( ( rule__XClosure__Group_1__0 )? )
-            // InternalDataDSL.g:15778:2: ( rule__XClosure__Group_1__0 )?
+            // InternalDataDSL.g:16863:1: ( ( rule__XClosure__Group_1__0 )? )
+            // InternalDataDSL.g:16864:2: ( rule__XClosure__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:15779:2: ( rule__XClosure__Group_1__0 )?
-            int alt132=2;
-            alt132 = dfa132.predict(input);
-            switch (alt132) {
+            // InternalDataDSL.g:16865:2: ( rule__XClosure__Group_1__0 )?
+            int alt137=2;
+            alt137 = dfa137.predict(input);
+            switch (alt137) {
                 case 1 :
-                    // InternalDataDSL.g:15779:3: rule__XClosure__Group_1__0
+                    // InternalDataDSL.g:16865:3: rule__XClosure__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XClosure__Group_1__0();
@@ -52610,16 +56231,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group__2"
-    // InternalDataDSL.g:15787:1: rule__XClosure__Group__2 : rule__XClosure__Group__2__Impl rule__XClosure__Group__3 ;
+    // InternalDataDSL.g:16873:1: rule__XClosure__Group__2 : rule__XClosure__Group__2__Impl rule__XClosure__Group__3 ;
     public final void rule__XClosure__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15791:1: ( rule__XClosure__Group__2__Impl rule__XClosure__Group__3 )
-            // InternalDataDSL.g:15792:2: rule__XClosure__Group__2__Impl rule__XClosure__Group__3
+            // InternalDataDSL.g:16877:1: ( rule__XClosure__Group__2__Impl rule__XClosure__Group__3 )
+            // InternalDataDSL.g:16878:2: rule__XClosure__Group__2__Impl rule__XClosure__Group__3
             {
-            pushFollow(FOLLOW_125);
+            pushFollow(FOLLOW_133);
             rule__XClosure__Group__2__Impl();
 
             state._fsp--;
@@ -52648,23 +56269,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group__2__Impl"
-    // InternalDataDSL.g:15799:1: rule__XClosure__Group__2__Impl : ( ( rule__XClosure__ExpressionAssignment_2 ) ) ;
+    // InternalDataDSL.g:16885:1: rule__XClosure__Group__2__Impl : ( ( rule__XClosure__ExpressionAssignment_2 ) ) ;
     public final void rule__XClosure__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15803:1: ( ( ( rule__XClosure__ExpressionAssignment_2 ) ) )
-            // InternalDataDSL.g:15804:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:16889:1: ( ( ( rule__XClosure__ExpressionAssignment_2 ) ) )
+            // InternalDataDSL.g:16890:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
             {
-            // InternalDataDSL.g:15804:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
-            // InternalDataDSL.g:15805:2: ( rule__XClosure__ExpressionAssignment_2 )
+            // InternalDataDSL.g:16890:1: ( ( rule__XClosure__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:16891:2: ( rule__XClosure__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExpressionAssignment_2()); 
             }
-            // InternalDataDSL.g:15806:2: ( rule__XClosure__ExpressionAssignment_2 )
-            // InternalDataDSL.g:15806:3: rule__XClosure__ExpressionAssignment_2
+            // InternalDataDSL.g:16892:2: ( rule__XClosure__ExpressionAssignment_2 )
+            // InternalDataDSL.g:16892:3: rule__XClosure__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__ExpressionAssignment_2();
@@ -52699,14 +56320,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group__3"
-    // InternalDataDSL.g:15814:1: rule__XClosure__Group__3 : rule__XClosure__Group__3__Impl ;
+    // InternalDataDSL.g:16900:1: rule__XClosure__Group__3 : rule__XClosure__Group__3__Impl ;
     public final void rule__XClosure__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15818:1: ( rule__XClosure__Group__3__Impl )
-            // InternalDataDSL.g:15819:2: rule__XClosure__Group__3__Impl
+            // InternalDataDSL.g:16904:1: ( rule__XClosure__Group__3__Impl )
+            // InternalDataDSL.g:16905:2: rule__XClosure__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group__3__Impl();
@@ -52732,22 +56353,22 @@
 
 
     // $ANTLR start "rule__XClosure__Group__3__Impl"
-    // InternalDataDSL.g:15825:1: rule__XClosure__Group__3__Impl : ( ']' ) ;
+    // InternalDataDSL.g:16911:1: rule__XClosure__Group__3__Impl : ( ']' ) ;
     public final void rule__XClosure__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15829:1: ( ( ']' ) )
-            // InternalDataDSL.g:15830:1: ( ']' )
+            // InternalDataDSL.g:16915:1: ( ( ']' ) )
+            // InternalDataDSL.g:16916:1: ( ']' )
             {
-            // InternalDataDSL.g:15830:1: ( ']' )
-            // InternalDataDSL.g:15831:2: ']'
+            // InternalDataDSL.g:16916:1: ( ']' )
+            // InternalDataDSL.g:16917:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); 
             }
-            match(input,125,FOLLOW_2); if (state.failed) return ;
+            match(input,131,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3()); 
             }
@@ -52773,14 +56394,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0__0"
-    // InternalDataDSL.g:15841:1: rule__XClosure__Group_0__0 : rule__XClosure__Group_0__0__Impl ;
+    // InternalDataDSL.g:16927:1: rule__XClosure__Group_0__0 : rule__XClosure__Group_0__0__Impl ;
     public final void rule__XClosure__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15845:1: ( rule__XClosure__Group_0__0__Impl )
-            // InternalDataDSL.g:15846:2: rule__XClosure__Group_0__0__Impl
+            // InternalDataDSL.g:16931:1: ( rule__XClosure__Group_0__0__Impl )
+            // InternalDataDSL.g:16932:2: rule__XClosure__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0__0__Impl();
@@ -52806,23 +56427,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0__0__Impl"
-    // InternalDataDSL.g:15852:1: rule__XClosure__Group_0__0__Impl : ( ( rule__XClosure__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:16938:1: rule__XClosure__Group_0__0__Impl : ( ( rule__XClosure__Group_0_0__0 ) ) ;
     public final void rule__XClosure__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15856:1: ( ( ( rule__XClosure__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:15857:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            // InternalDataDSL.g:16942:1: ( ( ( rule__XClosure__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:16943:1: ( ( rule__XClosure__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:15857:1: ( ( rule__XClosure__Group_0_0__0 ) )
-            // InternalDataDSL.g:15858:2: ( rule__XClosure__Group_0_0__0 )
+            // InternalDataDSL.g:16943:1: ( ( rule__XClosure__Group_0_0__0 ) )
+            // InternalDataDSL.g:16944:2: ( rule__XClosure__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:15859:2: ( rule__XClosure__Group_0_0__0 )
-            // InternalDataDSL.g:15859:3: rule__XClosure__Group_0_0__0
+            // InternalDataDSL.g:16945:2: ( rule__XClosure__Group_0_0__0 )
+            // InternalDataDSL.g:16945:3: rule__XClosure__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0_0__0();
@@ -52857,16 +56478,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__0"
-    // InternalDataDSL.g:15868:1: rule__XClosure__Group_0_0__0 : rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 ;
+    // InternalDataDSL.g:16954:1: rule__XClosure__Group_0_0__0 : rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 ;
     public final void rule__XClosure__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15872:1: ( rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 )
-            // InternalDataDSL.g:15873:2: rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1
+            // InternalDataDSL.g:16958:1: ( rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1 )
+            // InternalDataDSL.g:16959:2: rule__XClosure__Group_0_0__0__Impl rule__XClosure__Group_0_0__1
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__XClosure__Group_0_0__0__Impl();
 
             state._fsp--;
@@ -52895,23 +56516,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__0__Impl"
-    // InternalDataDSL.g:15880:1: rule__XClosure__Group_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:16966:1: rule__XClosure__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XClosure__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15884:1: ( ( () ) )
-            // InternalDataDSL.g:15885:1: ( () )
+            // InternalDataDSL.g:16970:1: ( ( () ) )
+            // InternalDataDSL.g:16971:1: ( () )
             {
-            // InternalDataDSL.g:15885:1: ( () )
-            // InternalDataDSL.g:15886:2: ()
+            // InternalDataDSL.g:16971:1: ( () )
+            // InternalDataDSL.g:16972:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getXClosureAction_0_0_0()); 
             }
-            // InternalDataDSL.g:15887:2: ()
-            // InternalDataDSL.g:15887:3: 
+            // InternalDataDSL.g:16973:2: ()
+            // InternalDataDSL.g:16973:3: 
             {
             }
 
@@ -52936,14 +56557,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__1"
-    // InternalDataDSL.g:15895:1: rule__XClosure__Group_0_0__1 : rule__XClosure__Group_0_0__1__Impl ;
+    // InternalDataDSL.g:16981:1: rule__XClosure__Group_0_0__1 : rule__XClosure__Group_0_0__1__Impl ;
     public final void rule__XClosure__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15899:1: ( rule__XClosure__Group_0_0__1__Impl )
-            // InternalDataDSL.g:15900:2: rule__XClosure__Group_0_0__1__Impl
+            // InternalDataDSL.g:16985:1: ( rule__XClosure__Group_0_0__1__Impl )
+            // InternalDataDSL.g:16986:2: rule__XClosure__Group_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_0_0__1__Impl();
@@ -52969,22 +56590,22 @@
 
 
     // $ANTLR start "rule__XClosure__Group_0_0__1__Impl"
-    // InternalDataDSL.g:15906:1: rule__XClosure__Group_0_0__1__Impl : ( '[' ) ;
+    // InternalDataDSL.g:16992:1: rule__XClosure__Group_0_0__1__Impl : ( '[' ) ;
     public final void rule__XClosure__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15910:1: ( ( '[' ) )
-            // InternalDataDSL.g:15911:1: ( '[' )
+            // InternalDataDSL.g:16996:1: ( ( '[' ) )
+            // InternalDataDSL.g:16997:1: ( '[' )
             {
-            // InternalDataDSL.g:15911:1: ( '[' )
-            // InternalDataDSL.g:15912:2: '['
+            // InternalDataDSL.g:16997:1: ( '[' )
+            // InternalDataDSL.g:16998:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); 
             }
-            match(input,127,FOLLOW_2); if (state.failed) return ;
+            match(input,133,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1()); 
             }
@@ -53010,14 +56631,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1__0"
-    // InternalDataDSL.g:15922:1: rule__XClosure__Group_1__0 : rule__XClosure__Group_1__0__Impl ;
+    // InternalDataDSL.g:17008:1: rule__XClosure__Group_1__0 : rule__XClosure__Group_1__0__Impl ;
     public final void rule__XClosure__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15926:1: ( rule__XClosure__Group_1__0__Impl )
-            // InternalDataDSL.g:15927:2: rule__XClosure__Group_1__0__Impl
+            // InternalDataDSL.g:17012:1: ( rule__XClosure__Group_1__0__Impl )
+            // InternalDataDSL.g:17013:2: rule__XClosure__Group_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1__0__Impl();
@@ -53043,23 +56664,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1__0__Impl"
-    // InternalDataDSL.g:15933:1: rule__XClosure__Group_1__0__Impl : ( ( rule__XClosure__Group_1_0__0 ) ) ;
+    // InternalDataDSL.g:17019:1: rule__XClosure__Group_1__0__Impl : ( ( rule__XClosure__Group_1_0__0 ) ) ;
     public final void rule__XClosure__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15937:1: ( ( ( rule__XClosure__Group_1_0__0 ) ) )
-            // InternalDataDSL.g:15938:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            // InternalDataDSL.g:17023:1: ( ( ( rule__XClosure__Group_1_0__0 ) ) )
+            // InternalDataDSL.g:17024:1: ( ( rule__XClosure__Group_1_0__0 ) )
             {
-            // InternalDataDSL.g:15938:1: ( ( rule__XClosure__Group_1_0__0 ) )
-            // InternalDataDSL.g:15939:2: ( rule__XClosure__Group_1_0__0 )
+            // InternalDataDSL.g:17024:1: ( ( rule__XClosure__Group_1_0__0 ) )
+            // InternalDataDSL.g:17025:2: ( rule__XClosure__Group_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0()); 
             }
-            // InternalDataDSL.g:15940:2: ( rule__XClosure__Group_1_0__0 )
-            // InternalDataDSL.g:15940:3: rule__XClosure__Group_1_0__0
+            // InternalDataDSL.g:17026:2: ( rule__XClosure__Group_1_0__0 )
+            // InternalDataDSL.g:17026:3: rule__XClosure__Group_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0__0();
@@ -53094,16 +56715,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__0"
-    // InternalDataDSL.g:15949:1: rule__XClosure__Group_1_0__0 : rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 ;
+    // InternalDataDSL.g:17035:1: rule__XClosure__Group_1_0__0 : rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 ;
     public final void rule__XClosure__Group_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15953:1: ( rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 )
-            // InternalDataDSL.g:15954:2: rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1
+            // InternalDataDSL.g:17039:1: ( rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1 )
+            // InternalDataDSL.g:17040:2: rule__XClosure__Group_1_0__0__Impl rule__XClosure__Group_1_0__1
             {
-            pushFollow(FOLLOW_126);
+            pushFollow(FOLLOW_134);
             rule__XClosure__Group_1_0__0__Impl();
 
             state._fsp--;
@@ -53132,31 +56753,31 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__0__Impl"
-    // InternalDataDSL.g:15961:1: rule__XClosure__Group_1_0__0__Impl : ( ( rule__XClosure__Group_1_0_0__0 )? ) ;
+    // InternalDataDSL.g:17047:1: rule__XClosure__Group_1_0__0__Impl : ( ( rule__XClosure__Group_1_0_0__0 )? ) ;
     public final void rule__XClosure__Group_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15965:1: ( ( ( rule__XClosure__Group_1_0_0__0 )? ) )
-            // InternalDataDSL.g:15966:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            // InternalDataDSL.g:17051:1: ( ( ( rule__XClosure__Group_1_0_0__0 )? ) )
+            // InternalDataDSL.g:17052:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
             {
-            // InternalDataDSL.g:15966:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
-            // InternalDataDSL.g:15967:2: ( rule__XClosure__Group_1_0_0__0 )?
+            // InternalDataDSL.g:17052:1: ( ( rule__XClosure__Group_1_0_0__0 )? )
+            // InternalDataDSL.g:17053:2: ( rule__XClosure__Group_1_0_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0_0()); 
             }
-            // InternalDataDSL.g:15968:2: ( rule__XClosure__Group_1_0_0__0 )?
-            int alt133=2;
-            int LA133_0 = input.LA(1);
+            // InternalDataDSL.g:17054:2: ( rule__XClosure__Group_1_0_0__0 )?
+            int alt138=2;
+            int LA138_0 = input.LA(1);
 
-            if ( (LA133_0==RULE_ID||LA133_0==31||LA133_0==122) ) {
-                alt133=1;
+            if ( (LA138_0==RULE_ID||LA138_0==31||LA138_0==128) ) {
+                alt138=1;
             }
-            switch (alt133) {
+            switch (alt138) {
                 case 1 :
-                    // InternalDataDSL.g:15968:3: rule__XClosure__Group_1_0_0__0
+                    // InternalDataDSL.g:17054:3: rule__XClosure__Group_1_0_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XClosure__Group_1_0_0__0();
@@ -53194,14 +56815,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__1"
-    // InternalDataDSL.g:15976:1: rule__XClosure__Group_1_0__1 : rule__XClosure__Group_1_0__1__Impl ;
+    // InternalDataDSL.g:17062:1: rule__XClosure__Group_1_0__1 : rule__XClosure__Group_1_0__1__Impl ;
     public final void rule__XClosure__Group_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15980:1: ( rule__XClosure__Group_1_0__1__Impl )
-            // InternalDataDSL.g:15981:2: rule__XClosure__Group_1_0__1__Impl
+            // InternalDataDSL.g:17066:1: ( rule__XClosure__Group_1_0__1__Impl )
+            // InternalDataDSL.g:17067:2: rule__XClosure__Group_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0__1__Impl();
@@ -53227,23 +56848,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0__1__Impl"
-    // InternalDataDSL.g:15987:1: rule__XClosure__Group_1_0__1__Impl : ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) ;
+    // InternalDataDSL.g:17073:1: rule__XClosure__Group_1_0__1__Impl : ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) ;
     public final void rule__XClosure__Group_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:15991:1: ( ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) )
-            // InternalDataDSL.g:15992:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            // InternalDataDSL.g:17077:1: ( ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) ) )
+            // InternalDataDSL.g:17078:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
             {
-            // InternalDataDSL.g:15992:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
-            // InternalDataDSL.g:15993:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            // InternalDataDSL.g:17078:1: ( ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 ) )
+            // InternalDataDSL.g:17079:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxAssignment_1_0_1()); 
             }
-            // InternalDataDSL.g:15994:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
-            // InternalDataDSL.g:15994:3: rule__XClosure__ExplicitSyntaxAssignment_1_0_1
+            // InternalDataDSL.g:17080:2: ( rule__XClosure__ExplicitSyntaxAssignment_1_0_1 )
+            // InternalDataDSL.g:17080:3: rule__XClosure__ExplicitSyntaxAssignment_1_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__ExplicitSyntaxAssignment_1_0_1();
@@ -53278,16 +56899,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__0"
-    // InternalDataDSL.g:16003:1: rule__XClosure__Group_1_0_0__0 : rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 ;
+    // InternalDataDSL.g:17089:1: rule__XClosure__Group_1_0_0__0 : rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 ;
     public final void rule__XClosure__Group_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16007:1: ( rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 )
-            // InternalDataDSL.g:16008:2: rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1
+            // InternalDataDSL.g:17093:1: ( rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1 )
+            // InternalDataDSL.g:17094:2: rule__XClosure__Group_1_0_0__0__Impl rule__XClosure__Group_1_0_0__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XClosure__Group_1_0_0__0__Impl();
 
             state._fsp--;
@@ -53316,23 +56937,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__0__Impl"
-    // InternalDataDSL.g:16015:1: rule__XClosure__Group_1_0_0__0__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) ;
+    // InternalDataDSL.g:17101:1: rule__XClosure__Group_1_0_0__0__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) ;
     public final void rule__XClosure__Group_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16019:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) )
-            // InternalDataDSL.g:16020:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            // InternalDataDSL.g:17105:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) ) )
+            // InternalDataDSL.g:17106:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
             {
-            // InternalDataDSL.g:16020:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
-            // InternalDataDSL.g:16021:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            // InternalDataDSL.g:17106:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 ) )
+            // InternalDataDSL.g:17107:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_0()); 
             }
-            // InternalDataDSL.g:16022:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
-            // InternalDataDSL.g:16022:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
+            // InternalDataDSL.g:17108:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 )
+            // InternalDataDSL.g:17108:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0();
@@ -53367,14 +56988,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__1"
-    // InternalDataDSL.g:16030:1: rule__XClosure__Group_1_0_0__1 : rule__XClosure__Group_1_0_0__1__Impl ;
+    // InternalDataDSL.g:17116:1: rule__XClosure__Group_1_0_0__1 : rule__XClosure__Group_1_0_0__1__Impl ;
     public final void rule__XClosure__Group_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16034:1: ( rule__XClosure__Group_1_0_0__1__Impl )
-            // InternalDataDSL.g:16035:2: rule__XClosure__Group_1_0_0__1__Impl
+            // InternalDataDSL.g:17120:1: ( rule__XClosure__Group_1_0_0__1__Impl )
+            // InternalDataDSL.g:17121:2: rule__XClosure__Group_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0_0__1__Impl();
@@ -53400,37 +57021,37 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0__1__Impl"
-    // InternalDataDSL.g:16041:1: rule__XClosure__Group_1_0_0__1__Impl : ( ( rule__XClosure__Group_1_0_0_1__0 )* ) ;
+    // InternalDataDSL.g:17127:1: rule__XClosure__Group_1_0_0__1__Impl : ( ( rule__XClosure__Group_1_0_0_1__0 )* ) ;
     public final void rule__XClosure__Group_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16045:1: ( ( ( rule__XClosure__Group_1_0_0_1__0 )* ) )
-            // InternalDataDSL.g:16046:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            // InternalDataDSL.g:17131:1: ( ( ( rule__XClosure__Group_1_0_0_1__0 )* ) )
+            // InternalDataDSL.g:17132:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
             {
-            // InternalDataDSL.g:16046:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
-            // InternalDataDSL.g:16047:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            // InternalDataDSL.g:17132:1: ( ( rule__XClosure__Group_1_0_0_1__0 )* )
+            // InternalDataDSL.g:17133:2: ( rule__XClosure__Group_1_0_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getGroup_1_0_0_1()); 
             }
-            // InternalDataDSL.g:16048:2: ( rule__XClosure__Group_1_0_0_1__0 )*
-            loop134:
+            // InternalDataDSL.g:17134:2: ( rule__XClosure__Group_1_0_0_1__0 )*
+            loop139:
             do {
-                int alt134=2;
-                int LA134_0 = input.LA(1);
+                int alt139=2;
+                int LA139_0 = input.LA(1);
 
-                if ( (LA134_0==124) ) {
-                    alt134=1;
+                if ( (LA139_0==130) ) {
+                    alt139=1;
                 }
 
 
-                switch (alt134) {
+                switch (alt139) {
             	case 1 :
-            	    // InternalDataDSL.g:16048:3: rule__XClosure__Group_1_0_0_1__0
+            	    // InternalDataDSL.g:17134:3: rule__XClosure__Group_1_0_0_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XClosure__Group_1_0_0_1__0();
 
             	    state._fsp--;
@@ -53440,7 +57061,7 @@
             	    break;
 
             	default :
-            	    break loop134;
+            	    break loop139;
                 }
             } while (true);
 
@@ -53469,16 +57090,16 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__0"
-    // InternalDataDSL.g:16057:1: rule__XClosure__Group_1_0_0_1__0 : rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 ;
+    // InternalDataDSL.g:17143:1: rule__XClosure__Group_1_0_0_1__0 : rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 ;
     public final void rule__XClosure__Group_1_0_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16061:1: ( rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 )
-            // InternalDataDSL.g:16062:2: rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1
+            // InternalDataDSL.g:17147:1: ( rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1 )
+            // InternalDataDSL.g:17148:2: rule__XClosure__Group_1_0_0_1__0__Impl rule__XClosure__Group_1_0_0_1__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XClosure__Group_1_0_0_1__0__Impl();
 
             state._fsp--;
@@ -53507,22 +57128,22 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__0__Impl"
-    // InternalDataDSL.g:16069:1: rule__XClosure__Group_1_0_0_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:17155:1: rule__XClosure__Group_1_0_0_1__0__Impl : ( ',' ) ;
     public final void rule__XClosure__Group_1_0_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16073:1: ( ( ',' ) )
-            // InternalDataDSL.g:16074:1: ( ',' )
+            // InternalDataDSL.g:17159:1: ( ( ',' ) )
+            // InternalDataDSL.g:17160:1: ( ',' )
             {
-            // InternalDataDSL.g:16074:1: ( ',' )
-            // InternalDataDSL.g:16075:2: ','
+            // InternalDataDSL.g:17160:1: ( ',' )
+            // InternalDataDSL.g:17161:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0()); 
             }
@@ -53548,14 +57169,14 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__1"
-    // InternalDataDSL.g:16084:1: rule__XClosure__Group_1_0_0_1__1 : rule__XClosure__Group_1_0_0_1__1__Impl ;
+    // InternalDataDSL.g:17170:1: rule__XClosure__Group_1_0_0_1__1 : rule__XClosure__Group_1_0_0_1__1__Impl ;
     public final void rule__XClosure__Group_1_0_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16088:1: ( rule__XClosure__Group_1_0_0_1__1__Impl )
-            // InternalDataDSL.g:16089:2: rule__XClosure__Group_1_0_0_1__1__Impl
+            // InternalDataDSL.g:17174:1: ( rule__XClosure__Group_1_0_0_1__1__Impl )
+            // InternalDataDSL.g:17175:2: rule__XClosure__Group_1_0_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__Group_1_0_0_1__1__Impl();
@@ -53581,23 +57202,23 @@
 
 
     // $ANTLR start "rule__XClosure__Group_1_0_0_1__1__Impl"
-    // InternalDataDSL.g:16095:1: rule__XClosure__Group_1_0_0_1__1__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) ;
+    // InternalDataDSL.g:17181:1: rule__XClosure__Group_1_0_0_1__1__Impl : ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) ;
     public final void rule__XClosure__Group_1_0_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16099:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) )
-            // InternalDataDSL.g:16100:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            // InternalDataDSL.g:17185:1: ( ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) ) )
+            // InternalDataDSL.g:17186:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
             {
-            // InternalDataDSL.g:16100:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
-            // InternalDataDSL.g:16101:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            // InternalDataDSL.g:17186:1: ( ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 ) )
+            // InternalDataDSL.g:17187:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersAssignment_1_0_0_1_1()); 
             }
-            // InternalDataDSL.g:16102:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
-            // InternalDataDSL.g:16102:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
+            // InternalDataDSL.g:17188:2: ( rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 )
+            // InternalDataDSL.g:17188:3: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1();
@@ -53632,16 +57253,16 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__0"
-    // InternalDataDSL.g:16111:1: rule__XExpressionInClosure__Group__0 : rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 ;
+    // InternalDataDSL.g:17197:1: rule__XExpressionInClosure__Group__0 : rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 ;
     public final void rule__XExpressionInClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16115:1: ( rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 )
-            // InternalDataDSL.g:16116:2: rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1
+            // InternalDataDSL.g:17201:1: ( rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1 )
+            // InternalDataDSL.g:17202:2: rule__XExpressionInClosure__Group__0__Impl rule__XExpressionInClosure__Group__1
             {
-            pushFollow(FOLLOW_124);
+            pushFollow(FOLLOW_132);
             rule__XExpressionInClosure__Group__0__Impl();
 
             state._fsp--;
@@ -53670,23 +57291,23 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__0__Impl"
-    // InternalDataDSL.g:16123:1: rule__XExpressionInClosure__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:17209:1: rule__XExpressionInClosure__Group__0__Impl : ( () ) ;
     public final void rule__XExpressionInClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16127:1: ( ( () ) )
-            // InternalDataDSL.g:16128:1: ( () )
+            // InternalDataDSL.g:17213:1: ( ( () ) )
+            // InternalDataDSL.g:17214:1: ( () )
             {
-            // InternalDataDSL.g:16128:1: ( () )
-            // InternalDataDSL.g:16129:2: ()
+            // InternalDataDSL.g:17214:1: ( () )
+            // InternalDataDSL.g:17215:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getXBlockExpressionAction_0()); 
             }
-            // InternalDataDSL.g:16130:2: ()
-            // InternalDataDSL.g:16130:3: 
+            // InternalDataDSL.g:17216:2: ()
+            // InternalDataDSL.g:17216:3: 
             {
             }
 
@@ -53711,14 +57332,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__1"
-    // InternalDataDSL.g:16138:1: rule__XExpressionInClosure__Group__1 : rule__XExpressionInClosure__Group__1__Impl ;
+    // InternalDataDSL.g:17224:1: rule__XExpressionInClosure__Group__1 : rule__XExpressionInClosure__Group__1__Impl ;
     public final void rule__XExpressionInClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16142:1: ( rule__XExpressionInClosure__Group__1__Impl )
-            // InternalDataDSL.g:16143:2: rule__XExpressionInClosure__Group__1__Impl
+            // InternalDataDSL.g:17228:1: ( rule__XExpressionInClosure__Group__1__Impl )
+            // InternalDataDSL.g:17229:2: rule__XExpressionInClosure__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group__1__Impl();
@@ -53744,37 +57365,37 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group__1__Impl"
-    // InternalDataDSL.g:16149:1: rule__XExpressionInClosure__Group__1__Impl : ( ( rule__XExpressionInClosure__Group_1__0 )* ) ;
+    // InternalDataDSL.g:17235:1: rule__XExpressionInClosure__Group__1__Impl : ( ( rule__XExpressionInClosure__Group_1__0 )* ) ;
     public final void rule__XExpressionInClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16153:1: ( ( ( rule__XExpressionInClosure__Group_1__0 )* ) )
-            // InternalDataDSL.g:16154:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            // InternalDataDSL.g:17239:1: ( ( ( rule__XExpressionInClosure__Group_1__0 )* ) )
+            // InternalDataDSL.g:17240:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
             {
-            // InternalDataDSL.g:16154:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
-            // InternalDataDSL.g:16155:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            // InternalDataDSL.g:17240:1: ( ( rule__XExpressionInClosure__Group_1__0 )* )
+            // InternalDataDSL.g:17241:2: ( rule__XExpressionInClosure__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:16156:2: ( rule__XExpressionInClosure__Group_1__0 )*
-            loop135:
+            // InternalDataDSL.g:17242:2: ( rule__XExpressionInClosure__Group_1__0 )*
+            loop140:
             do {
-                int alt135=2;
-                int LA135_0 = input.LA(1);
+                int alt140=2;
+                int LA140_0 = input.LA(1);
 
-                if ( ((LA135_0>=RULE_STRING && LA135_0<=RULE_DECIMAL)||LA135_0==27||(LA135_0>=34 && LA135_0<=35)||LA135_0==40||(LA135_0>=44 && LA135_0<=50)||LA135_0==74||LA135_0==101||LA135_0==122||(LA135_0>=126 && LA135_0<=127)||LA135_0==129||LA135_0==131||(LA135_0>=135 && LA135_0<=142)||LA135_0==144||(LA135_0>=165 && LA135_0<=166)) ) {
-                    alt135=1;
+                if ( ((LA140_0>=RULE_STRING && LA140_0<=RULE_DECIMAL)||LA140_0==27||(LA140_0>=34 && LA140_0<=35)||LA140_0==40||(LA140_0>=44 && LA140_0<=50)||LA140_0==74||LA140_0==103||LA140_0==128||(LA140_0>=132 && LA140_0<=133)||LA140_0==135||LA140_0==137||(LA140_0>=141 && LA140_0<=148)||LA140_0==150||(LA140_0>=178 && LA140_0<=179)) ) {
+                    alt140=1;
                 }
 
 
-                switch (alt135) {
+                switch (alt140) {
             	case 1 :
-            	    // InternalDataDSL.g:16156:3: rule__XExpressionInClosure__Group_1__0
+            	    // InternalDataDSL.g:17242:3: rule__XExpressionInClosure__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_127);
+            	    pushFollow(FOLLOW_135);
             	    rule__XExpressionInClosure__Group_1__0();
 
             	    state._fsp--;
@@ -53784,7 +57405,7 @@
             	    break;
 
             	default :
-            	    break loop135;
+            	    break loop140;
                 }
             } while (true);
 
@@ -53813,16 +57434,16 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__0"
-    // InternalDataDSL.g:16165:1: rule__XExpressionInClosure__Group_1__0 : rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 ;
+    // InternalDataDSL.g:17251:1: rule__XExpressionInClosure__Group_1__0 : rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 ;
     public final void rule__XExpressionInClosure__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16169:1: ( rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 )
-            // InternalDataDSL.g:16170:2: rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1
+            // InternalDataDSL.g:17255:1: ( rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1 )
+            // InternalDataDSL.g:17256:2: rule__XExpressionInClosure__Group_1__0__Impl rule__XExpressionInClosure__Group_1__1
             {
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_84);
             rule__XExpressionInClosure__Group_1__0__Impl();
 
             state._fsp--;
@@ -53851,23 +57472,23 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__0__Impl"
-    // InternalDataDSL.g:16177:1: rule__XExpressionInClosure__Group_1__0__Impl : ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) ;
+    // InternalDataDSL.g:17263:1: rule__XExpressionInClosure__Group_1__0__Impl : ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) ;
     public final void rule__XExpressionInClosure__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16181:1: ( ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) )
-            // InternalDataDSL.g:16182:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            // InternalDataDSL.g:17267:1: ( ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) ) )
+            // InternalDataDSL.g:17268:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
             {
-            // InternalDataDSL.g:16182:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
-            // InternalDataDSL.g:16183:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            // InternalDataDSL.g:17268:1: ( ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 ) )
+            // InternalDataDSL.g:17269:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getExpressionsAssignment_1_0()); 
             }
-            // InternalDataDSL.g:16184:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
-            // InternalDataDSL.g:16184:3: rule__XExpressionInClosure__ExpressionsAssignment_1_0
+            // InternalDataDSL.g:17270:2: ( rule__XExpressionInClosure__ExpressionsAssignment_1_0 )
+            // InternalDataDSL.g:17270:3: rule__XExpressionInClosure__ExpressionsAssignment_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__ExpressionsAssignment_1_0();
@@ -53902,14 +57523,14 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__1"
-    // InternalDataDSL.g:16192:1: rule__XExpressionInClosure__Group_1__1 : rule__XExpressionInClosure__Group_1__1__Impl ;
+    // InternalDataDSL.g:17278:1: rule__XExpressionInClosure__Group_1__1 : rule__XExpressionInClosure__Group_1__1__Impl ;
     public final void rule__XExpressionInClosure__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16196:1: ( rule__XExpressionInClosure__Group_1__1__Impl )
-            // InternalDataDSL.g:16197:2: rule__XExpressionInClosure__Group_1__1__Impl
+            // InternalDataDSL.g:17282:1: ( rule__XExpressionInClosure__Group_1__1__Impl )
+            // InternalDataDSL.g:17283:2: rule__XExpressionInClosure__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XExpressionInClosure__Group_1__1__Impl();
@@ -53935,33 +57556,33 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__Group_1__1__Impl"
-    // InternalDataDSL.g:16203:1: rule__XExpressionInClosure__Group_1__1__Impl : ( ( ';' )? ) ;
+    // InternalDataDSL.g:17289:1: rule__XExpressionInClosure__Group_1__1__Impl : ( ( ';' )? ) ;
     public final void rule__XExpressionInClosure__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16207:1: ( ( ( ';' )? ) )
-            // InternalDataDSL.g:16208:1: ( ( ';' )? )
+            // InternalDataDSL.g:17293:1: ( ( ( ';' )? ) )
+            // InternalDataDSL.g:17294:1: ( ( ';' )? )
             {
-            // InternalDataDSL.g:16208:1: ( ( ';' )? )
-            // InternalDataDSL.g:16209:2: ( ';' )?
+            // InternalDataDSL.g:17294:1: ( ( ';' )? )
+            // InternalDataDSL.g:17295:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1()); 
             }
-            // InternalDataDSL.g:16210:2: ( ';' )?
-            int alt136=2;
-            int LA136_0 = input.LA(1);
+            // InternalDataDSL.g:17296:2: ( ';' )?
+            int alt141=2;
+            int LA141_0 = input.LA(1);
 
-            if ( (LA136_0==120) ) {
-                alt136=1;
+            if ( (LA141_0==126) ) {
+                alt141=1;
             }
-            switch (alt136) {
+            switch (alt141) {
                 case 1 :
-                    // InternalDataDSL.g:16210:3: ';'
+                    // InternalDataDSL.g:17296:3: ';'
                     {
-                    match(input,120,FOLLOW_2); if (state.failed) return ;
+                    match(input,126,FOLLOW_2); if (state.failed) return ;
 
                     }
                     break;
@@ -53993,16 +57614,16 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__0"
-    // InternalDataDSL.g:16219:1: rule__XShortClosure__Group__0 : rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 ;
+    // InternalDataDSL.g:17305:1: rule__XShortClosure__Group__0 : rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 ;
     public final void rule__XShortClosure__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16223:1: ( rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 )
-            // InternalDataDSL.g:16224:2: rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1
+            // InternalDataDSL.g:17309:1: ( rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1 )
+            // InternalDataDSL.g:17310:2: rule__XShortClosure__Group__0__Impl rule__XShortClosure__Group__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XShortClosure__Group__0__Impl();
 
             state._fsp--;
@@ -54031,23 +57652,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__0__Impl"
-    // InternalDataDSL.g:16231:1: rule__XShortClosure__Group__0__Impl : ( ( rule__XShortClosure__Group_0__0 ) ) ;
+    // InternalDataDSL.g:17317:1: rule__XShortClosure__Group__0__Impl : ( ( rule__XShortClosure__Group_0__0 ) ) ;
     public final void rule__XShortClosure__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16235:1: ( ( ( rule__XShortClosure__Group_0__0 ) ) )
-            // InternalDataDSL.g:16236:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            // InternalDataDSL.g:17321:1: ( ( ( rule__XShortClosure__Group_0__0 ) ) )
+            // InternalDataDSL.g:17322:1: ( ( rule__XShortClosure__Group_0__0 ) )
             {
-            // InternalDataDSL.g:16236:1: ( ( rule__XShortClosure__Group_0__0 ) )
-            // InternalDataDSL.g:16237:2: ( rule__XShortClosure__Group_0__0 )
+            // InternalDataDSL.g:17322:1: ( ( rule__XShortClosure__Group_0__0 ) )
+            // InternalDataDSL.g:17323:2: ( rule__XShortClosure__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:16238:2: ( rule__XShortClosure__Group_0__0 )
-            // InternalDataDSL.g:16238:3: rule__XShortClosure__Group_0__0
+            // InternalDataDSL.g:17324:2: ( rule__XShortClosure__Group_0__0 )
+            // InternalDataDSL.g:17324:3: rule__XShortClosure__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0__0();
@@ -54082,14 +57703,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__1"
-    // InternalDataDSL.g:16246:1: rule__XShortClosure__Group__1 : rule__XShortClosure__Group__1__Impl ;
+    // InternalDataDSL.g:17332:1: rule__XShortClosure__Group__1 : rule__XShortClosure__Group__1__Impl ;
     public final void rule__XShortClosure__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16250:1: ( rule__XShortClosure__Group__1__Impl )
-            // InternalDataDSL.g:16251:2: rule__XShortClosure__Group__1__Impl
+            // InternalDataDSL.g:17336:1: ( rule__XShortClosure__Group__1__Impl )
+            // InternalDataDSL.g:17337:2: rule__XShortClosure__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group__1__Impl();
@@ -54115,23 +57736,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group__1__Impl"
-    // InternalDataDSL.g:16257:1: rule__XShortClosure__Group__1__Impl : ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) ;
+    // InternalDataDSL.g:17343:1: rule__XShortClosure__Group__1__Impl : ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) ;
     public final void rule__XShortClosure__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16261:1: ( ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) )
-            // InternalDataDSL.g:16262:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            // InternalDataDSL.g:17347:1: ( ( ( rule__XShortClosure__ExpressionAssignment_1 ) ) )
+            // InternalDataDSL.g:17348:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
             {
-            // InternalDataDSL.g:16262:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
-            // InternalDataDSL.g:16263:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            // InternalDataDSL.g:17348:1: ( ( rule__XShortClosure__ExpressionAssignment_1 ) )
+            // InternalDataDSL.g:17349:2: ( rule__XShortClosure__ExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExpressionAssignment_1()); 
             }
-            // InternalDataDSL.g:16264:2: ( rule__XShortClosure__ExpressionAssignment_1 )
-            // InternalDataDSL.g:16264:3: rule__XShortClosure__ExpressionAssignment_1
+            // InternalDataDSL.g:17350:2: ( rule__XShortClosure__ExpressionAssignment_1 )
+            // InternalDataDSL.g:17350:3: rule__XShortClosure__ExpressionAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__ExpressionAssignment_1();
@@ -54166,14 +57787,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0__0"
-    // InternalDataDSL.g:16273:1: rule__XShortClosure__Group_0__0 : rule__XShortClosure__Group_0__0__Impl ;
+    // InternalDataDSL.g:17359:1: rule__XShortClosure__Group_0__0 : rule__XShortClosure__Group_0__0__Impl ;
     public final void rule__XShortClosure__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16277:1: ( rule__XShortClosure__Group_0__0__Impl )
-            // InternalDataDSL.g:16278:2: rule__XShortClosure__Group_0__0__Impl
+            // InternalDataDSL.g:17363:1: ( rule__XShortClosure__Group_0__0__Impl )
+            // InternalDataDSL.g:17364:2: rule__XShortClosure__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0__0__Impl();
@@ -54199,23 +57820,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0__0__Impl"
-    // InternalDataDSL.g:16284:1: rule__XShortClosure__Group_0__0__Impl : ( ( rule__XShortClosure__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:17370:1: rule__XShortClosure__Group_0__0__Impl : ( ( rule__XShortClosure__Group_0_0__0 ) ) ;
     public final void rule__XShortClosure__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16288:1: ( ( ( rule__XShortClosure__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:16289:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            // InternalDataDSL.g:17374:1: ( ( ( rule__XShortClosure__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:17375:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:16289:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
-            // InternalDataDSL.g:16290:2: ( rule__XShortClosure__Group_0_0__0 )
+            // InternalDataDSL.g:17375:1: ( ( rule__XShortClosure__Group_0_0__0 ) )
+            // InternalDataDSL.g:17376:2: ( rule__XShortClosure__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:16291:2: ( rule__XShortClosure__Group_0_0__0 )
-            // InternalDataDSL.g:16291:3: rule__XShortClosure__Group_0_0__0
+            // InternalDataDSL.g:17377:2: ( rule__XShortClosure__Group_0_0__0 )
+            // InternalDataDSL.g:17377:3: rule__XShortClosure__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0__0();
@@ -54250,16 +57871,16 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__0"
-    // InternalDataDSL.g:16300:1: rule__XShortClosure__Group_0_0__0 : rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 ;
+    // InternalDataDSL.g:17386:1: rule__XShortClosure__Group_0_0__0 : rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 ;
     public final void rule__XShortClosure__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16304:1: ( rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 )
-            // InternalDataDSL.g:16305:2: rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1
+            // InternalDataDSL.g:17390:1: ( rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1 )
+            // InternalDataDSL.g:17391:2: rule__XShortClosure__Group_0_0__0__Impl rule__XShortClosure__Group_0_0__1
             {
-            pushFollow(FOLLOW_126);
+            pushFollow(FOLLOW_134);
             rule__XShortClosure__Group_0_0__0__Impl();
 
             state._fsp--;
@@ -54288,23 +57909,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__0__Impl"
-    // InternalDataDSL.g:16312:1: rule__XShortClosure__Group_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:17398:1: rule__XShortClosure__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XShortClosure__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16316:1: ( ( () ) )
-            // InternalDataDSL.g:16317:1: ( () )
+            // InternalDataDSL.g:17402:1: ( ( () ) )
+            // InternalDataDSL.g:17403:1: ( () )
             {
-            // InternalDataDSL.g:16317:1: ( () )
-            // InternalDataDSL.g:16318:2: ()
+            // InternalDataDSL.g:17403:1: ( () )
+            // InternalDataDSL.g:17404:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getXClosureAction_0_0_0()); 
             }
-            // InternalDataDSL.g:16319:2: ()
-            // InternalDataDSL.g:16319:3: 
+            // InternalDataDSL.g:17405:2: ()
+            // InternalDataDSL.g:17405:3: 
             {
             }
 
@@ -54329,16 +57950,16 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__1"
-    // InternalDataDSL.g:16327:1: rule__XShortClosure__Group_0_0__1 : rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 ;
+    // InternalDataDSL.g:17413:1: rule__XShortClosure__Group_0_0__1 : rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 ;
     public final void rule__XShortClosure__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16331:1: ( rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 )
-            // InternalDataDSL.g:16332:2: rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2
+            // InternalDataDSL.g:17417:1: ( rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2 )
+            // InternalDataDSL.g:17418:2: rule__XShortClosure__Group_0_0__1__Impl rule__XShortClosure__Group_0_0__2
             {
-            pushFollow(FOLLOW_126);
+            pushFollow(FOLLOW_134);
             rule__XShortClosure__Group_0_0__1__Impl();
 
             state._fsp--;
@@ -54367,31 +57988,31 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__1__Impl"
-    // InternalDataDSL.g:16339:1: rule__XShortClosure__Group_0_0__1__Impl : ( ( rule__XShortClosure__Group_0_0_1__0 )? ) ;
+    // InternalDataDSL.g:17425:1: rule__XShortClosure__Group_0_0__1__Impl : ( ( rule__XShortClosure__Group_0_0_1__0 )? ) ;
     public final void rule__XShortClosure__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16343:1: ( ( ( rule__XShortClosure__Group_0_0_1__0 )? ) )
-            // InternalDataDSL.g:16344:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            // InternalDataDSL.g:17429:1: ( ( ( rule__XShortClosure__Group_0_0_1__0 )? ) )
+            // InternalDataDSL.g:17430:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
             {
-            // InternalDataDSL.g:16344:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
-            // InternalDataDSL.g:16345:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            // InternalDataDSL.g:17430:1: ( ( rule__XShortClosure__Group_0_0_1__0 )? )
+            // InternalDataDSL.g:17431:2: ( rule__XShortClosure__Group_0_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1()); 
             }
-            // InternalDataDSL.g:16346:2: ( rule__XShortClosure__Group_0_0_1__0 )?
-            int alt137=2;
-            int LA137_0 = input.LA(1);
+            // InternalDataDSL.g:17432:2: ( rule__XShortClosure__Group_0_0_1__0 )?
+            int alt142=2;
+            int LA142_0 = input.LA(1);
 
-            if ( (LA137_0==RULE_ID||LA137_0==31||LA137_0==122) ) {
-                alt137=1;
+            if ( (LA142_0==RULE_ID||LA142_0==31||LA142_0==128) ) {
+                alt142=1;
             }
-            switch (alt137) {
+            switch (alt142) {
                 case 1 :
-                    // InternalDataDSL.g:16346:3: rule__XShortClosure__Group_0_0_1__0
+                    // InternalDataDSL.g:17432:3: rule__XShortClosure__Group_0_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XShortClosure__Group_0_0_1__0();
@@ -54429,14 +58050,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__2"
-    // InternalDataDSL.g:16354:1: rule__XShortClosure__Group_0_0__2 : rule__XShortClosure__Group_0_0__2__Impl ;
+    // InternalDataDSL.g:17440:1: rule__XShortClosure__Group_0_0__2 : rule__XShortClosure__Group_0_0__2__Impl ;
     public final void rule__XShortClosure__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16358:1: ( rule__XShortClosure__Group_0_0__2__Impl )
-            // InternalDataDSL.g:16359:2: rule__XShortClosure__Group_0_0__2__Impl
+            // InternalDataDSL.g:17444:1: ( rule__XShortClosure__Group_0_0__2__Impl )
+            // InternalDataDSL.g:17445:2: rule__XShortClosure__Group_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0__2__Impl();
@@ -54462,23 +58083,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0__2__Impl"
-    // InternalDataDSL.g:16365:1: rule__XShortClosure__Group_0_0__2__Impl : ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) ;
+    // InternalDataDSL.g:17451:1: rule__XShortClosure__Group_0_0__2__Impl : ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) ;
     public final void rule__XShortClosure__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16369:1: ( ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) )
-            // InternalDataDSL.g:16370:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            // InternalDataDSL.g:17455:1: ( ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) ) )
+            // InternalDataDSL.g:17456:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
             {
-            // InternalDataDSL.g:16370:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
-            // InternalDataDSL.g:16371:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            // InternalDataDSL.g:17456:1: ( ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 ) )
+            // InternalDataDSL.g:17457:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxAssignment_0_0_2()); 
             }
-            // InternalDataDSL.g:16372:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
-            // InternalDataDSL.g:16372:3: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
+            // InternalDataDSL.g:17458:2: ( rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 )
+            // InternalDataDSL.g:17458:3: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2();
@@ -54513,16 +58134,16 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__0"
-    // InternalDataDSL.g:16381:1: rule__XShortClosure__Group_0_0_1__0 : rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 ;
+    // InternalDataDSL.g:17467:1: rule__XShortClosure__Group_0_0_1__0 : rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 ;
     public final void rule__XShortClosure__Group_0_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16385:1: ( rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 )
-            // InternalDataDSL.g:16386:2: rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1
+            // InternalDataDSL.g:17471:1: ( rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1 )
+            // InternalDataDSL.g:17472:2: rule__XShortClosure__Group_0_0_1__0__Impl rule__XShortClosure__Group_0_0_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XShortClosure__Group_0_0_1__0__Impl();
 
             state._fsp--;
@@ -54551,23 +58172,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__0__Impl"
-    // InternalDataDSL.g:16393:1: rule__XShortClosure__Group_0_0_1__0__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) ;
+    // InternalDataDSL.g:17479:1: rule__XShortClosure__Group_0_0_1__0__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) ;
     public final void rule__XShortClosure__Group_0_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16397:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) )
-            // InternalDataDSL.g:16398:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            // InternalDataDSL.g:17483:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) ) )
+            // InternalDataDSL.g:17484:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
             {
-            // InternalDataDSL.g:16398:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
-            // InternalDataDSL.g:16399:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            // InternalDataDSL.g:17484:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 ) )
+            // InternalDataDSL.g:17485:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_0()); 
             }
-            // InternalDataDSL.g:16400:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
-            // InternalDataDSL.g:16400:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
+            // InternalDataDSL.g:17486:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 )
+            // InternalDataDSL.g:17486:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0();
@@ -54602,14 +58223,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__1"
-    // InternalDataDSL.g:16408:1: rule__XShortClosure__Group_0_0_1__1 : rule__XShortClosure__Group_0_0_1__1__Impl ;
+    // InternalDataDSL.g:17494:1: rule__XShortClosure__Group_0_0_1__1 : rule__XShortClosure__Group_0_0_1__1__Impl ;
     public final void rule__XShortClosure__Group_0_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16412:1: ( rule__XShortClosure__Group_0_0_1__1__Impl )
-            // InternalDataDSL.g:16413:2: rule__XShortClosure__Group_0_0_1__1__Impl
+            // InternalDataDSL.g:17498:1: ( rule__XShortClosure__Group_0_0_1__1__Impl )
+            // InternalDataDSL.g:17499:2: rule__XShortClosure__Group_0_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0_1__1__Impl();
@@ -54635,37 +58256,37 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1__1__Impl"
-    // InternalDataDSL.g:16419:1: rule__XShortClosure__Group_0_0_1__1__Impl : ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) ;
+    // InternalDataDSL.g:17505:1: rule__XShortClosure__Group_0_0_1__1__Impl : ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) ;
     public final void rule__XShortClosure__Group_0_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16423:1: ( ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) )
-            // InternalDataDSL.g:16424:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            // InternalDataDSL.g:17509:1: ( ( ( rule__XShortClosure__Group_0_0_1_1__0 )* ) )
+            // InternalDataDSL.g:17510:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
             {
-            // InternalDataDSL.g:16424:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
-            // InternalDataDSL.g:16425:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            // InternalDataDSL.g:17510:1: ( ( rule__XShortClosure__Group_0_0_1_1__0 )* )
+            // InternalDataDSL.g:17511:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getGroup_0_0_1_1()); 
             }
-            // InternalDataDSL.g:16426:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
-            loop138:
+            // InternalDataDSL.g:17512:2: ( rule__XShortClosure__Group_0_0_1_1__0 )*
+            loop143:
             do {
-                int alt138=2;
-                int LA138_0 = input.LA(1);
+                int alt143=2;
+                int LA143_0 = input.LA(1);
 
-                if ( (LA138_0==124) ) {
-                    alt138=1;
+                if ( (LA143_0==130) ) {
+                    alt143=1;
                 }
 
 
-                switch (alt138) {
+                switch (alt143) {
             	case 1 :
-            	    // InternalDataDSL.g:16426:3: rule__XShortClosure__Group_0_0_1_1__0
+            	    // InternalDataDSL.g:17512:3: rule__XShortClosure__Group_0_0_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XShortClosure__Group_0_0_1_1__0();
 
             	    state._fsp--;
@@ -54675,7 +58296,7 @@
             	    break;
 
             	default :
-            	    break loop138;
+            	    break loop143;
                 }
             } while (true);
 
@@ -54704,16 +58325,16 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0"
-    // InternalDataDSL.g:16435:1: rule__XShortClosure__Group_0_0_1_1__0 : rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 ;
+    // InternalDataDSL.g:17521:1: rule__XShortClosure__Group_0_0_1_1__0 : rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 ;
     public final void rule__XShortClosure__Group_0_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16439:1: ( rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 )
-            // InternalDataDSL.g:16440:2: rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1
+            // InternalDataDSL.g:17525:1: ( rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1 )
+            // InternalDataDSL.g:17526:2: rule__XShortClosure__Group_0_0_1_1__0__Impl rule__XShortClosure__Group_0_0_1_1__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XShortClosure__Group_0_0_1_1__0__Impl();
 
             state._fsp--;
@@ -54742,22 +58363,22 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__0__Impl"
-    // InternalDataDSL.g:16447:1: rule__XShortClosure__Group_0_0_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:17533:1: rule__XShortClosure__Group_0_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XShortClosure__Group_0_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16451:1: ( ( ',' ) )
-            // InternalDataDSL.g:16452:1: ( ',' )
+            // InternalDataDSL.g:17537:1: ( ( ',' ) )
+            // InternalDataDSL.g:17538:1: ( ',' )
             {
-            // InternalDataDSL.g:16452:1: ( ',' )
-            // InternalDataDSL.g:16453:2: ','
+            // InternalDataDSL.g:17538:1: ( ',' )
+            // InternalDataDSL.g:17539:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0()); 
             }
@@ -54783,14 +58404,14 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1"
-    // InternalDataDSL.g:16462:1: rule__XShortClosure__Group_0_0_1_1__1 : rule__XShortClosure__Group_0_0_1_1__1__Impl ;
+    // InternalDataDSL.g:17548:1: rule__XShortClosure__Group_0_0_1_1__1 : rule__XShortClosure__Group_0_0_1_1__1__Impl ;
     public final void rule__XShortClosure__Group_0_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16466:1: ( rule__XShortClosure__Group_0_0_1_1__1__Impl )
-            // InternalDataDSL.g:16467:2: rule__XShortClosure__Group_0_0_1_1__1__Impl
+            // InternalDataDSL.g:17552:1: ( rule__XShortClosure__Group_0_0_1_1__1__Impl )
+            // InternalDataDSL.g:17553:2: rule__XShortClosure__Group_0_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__Group_0_0_1_1__1__Impl();
@@ -54816,23 +58437,23 @@
 
 
     // $ANTLR start "rule__XShortClosure__Group_0_0_1_1__1__Impl"
-    // InternalDataDSL.g:16473:1: rule__XShortClosure__Group_0_0_1_1__1__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) ;
+    // InternalDataDSL.g:17559:1: rule__XShortClosure__Group_0_0_1_1__1__Impl : ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) ;
     public final void rule__XShortClosure__Group_0_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16477:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) )
-            // InternalDataDSL.g:16478:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            // InternalDataDSL.g:17563:1: ( ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) ) )
+            // InternalDataDSL.g:17564:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
             {
-            // InternalDataDSL.g:16478:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
-            // InternalDataDSL.g:16479:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            // InternalDataDSL.g:17564:1: ( ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 ) )
+            // InternalDataDSL.g:17565:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersAssignment_0_0_1_1_1()); 
             }
-            // InternalDataDSL.g:16480:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
-            // InternalDataDSL.g:16480:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
+            // InternalDataDSL.g:17566:2: ( rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 )
+            // InternalDataDSL.g:17566:3: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1();
@@ -54867,16 +58488,16 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__0"
-    // InternalDataDSL.g:16489:1: rule__XParenthesizedExpression__Group__0 : rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 ;
+    // InternalDataDSL.g:17575:1: rule__XParenthesizedExpression__Group__0 : rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 ;
     public final void rule__XParenthesizedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16493:1: ( rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 )
-            // InternalDataDSL.g:16494:2: rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1
+            // InternalDataDSL.g:17579:1: ( rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1 )
+            // InternalDataDSL.g:17580:2: rule__XParenthesizedExpression__Group__0__Impl rule__XParenthesizedExpression__Group__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XParenthesizedExpression__Group__0__Impl();
 
             state._fsp--;
@@ -54905,22 +58526,22 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__0__Impl"
-    // InternalDataDSL.g:16501:1: rule__XParenthesizedExpression__Group__0__Impl : ( '(' ) ;
+    // InternalDataDSL.g:17587:1: rule__XParenthesizedExpression__Group__0__Impl : ( '(' ) ;
     public final void rule__XParenthesizedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16505:1: ( ( '(' ) )
-            // InternalDataDSL.g:16506:1: ( '(' )
+            // InternalDataDSL.g:17591:1: ( ( '(' ) )
+            // InternalDataDSL.g:17592:1: ( '(' )
             {
-            // InternalDataDSL.g:16506:1: ( '(' )
-            // InternalDataDSL.g:16507:2: '('
+            // InternalDataDSL.g:17592:1: ( '(' )
+            // InternalDataDSL.g:17593:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0()); 
             }
@@ -54946,16 +58567,16 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__1"
-    // InternalDataDSL.g:16516:1: rule__XParenthesizedExpression__Group__1 : rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 ;
+    // InternalDataDSL.g:17602:1: rule__XParenthesizedExpression__Group__1 : rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 ;
     public final void rule__XParenthesizedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16520:1: ( rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 )
-            // InternalDataDSL.g:16521:2: rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2
+            // InternalDataDSL.g:17606:1: ( rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2 )
+            // InternalDataDSL.g:17607:2: rule__XParenthesizedExpression__Group__1__Impl rule__XParenthesizedExpression__Group__2
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XParenthesizedExpression__Group__1__Impl();
 
             state._fsp--;
@@ -54984,17 +58605,17 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__1__Impl"
-    // InternalDataDSL.g:16528:1: rule__XParenthesizedExpression__Group__1__Impl : ( ruleXExpression ) ;
+    // InternalDataDSL.g:17614:1: rule__XParenthesizedExpression__Group__1__Impl : ( ruleXExpression ) ;
     public final void rule__XParenthesizedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16532:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:16533:1: ( ruleXExpression )
+            // InternalDataDSL.g:17618:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:17619:1: ( ruleXExpression )
             {
-            // InternalDataDSL.g:16533:1: ( ruleXExpression )
-            // InternalDataDSL.g:16534:2: ruleXExpression
+            // InternalDataDSL.g:17619:1: ( ruleXExpression )
+            // InternalDataDSL.g:17620:2: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1()); 
@@ -55029,14 +58650,14 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__2"
-    // InternalDataDSL.g:16543:1: rule__XParenthesizedExpression__Group__2 : rule__XParenthesizedExpression__Group__2__Impl ;
+    // InternalDataDSL.g:17629:1: rule__XParenthesizedExpression__Group__2 : rule__XParenthesizedExpression__Group__2__Impl ;
     public final void rule__XParenthesizedExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16547:1: ( rule__XParenthesizedExpression__Group__2__Impl )
-            // InternalDataDSL.g:16548:2: rule__XParenthesizedExpression__Group__2__Impl
+            // InternalDataDSL.g:17633:1: ( rule__XParenthesizedExpression__Group__2__Impl )
+            // InternalDataDSL.g:17634:2: rule__XParenthesizedExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XParenthesizedExpression__Group__2__Impl();
@@ -55062,22 +58683,22 @@
 
 
     // $ANTLR start "rule__XParenthesizedExpression__Group__2__Impl"
-    // InternalDataDSL.g:16554:1: rule__XParenthesizedExpression__Group__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:17640:1: rule__XParenthesizedExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XParenthesizedExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16558:1: ( ( ')' ) )
-            // InternalDataDSL.g:16559:1: ( ')' )
+            // InternalDataDSL.g:17644:1: ( ( ')' ) )
+            // InternalDataDSL.g:17645:1: ( ')' )
             {
-            // InternalDataDSL.g:16559:1: ( ')' )
-            // InternalDataDSL.g:16560:2: ')'
+            // InternalDataDSL.g:17645:1: ( ')' )
+            // InternalDataDSL.g:17646:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2()); 
             }
@@ -55103,16 +58724,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__0"
-    // InternalDataDSL.g:16570:1: rule__XIfExpression__Group__0 : rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 ;
+    // InternalDataDSL.g:17656:1: rule__XIfExpression__Group__0 : rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 ;
     public final void rule__XIfExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16574:1: ( rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 )
-            // InternalDataDSL.g:16575:2: rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1
+            // InternalDataDSL.g:17660:1: ( rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1 )
+            // InternalDataDSL.g:17661:2: rule__XIfExpression__Group__0__Impl rule__XIfExpression__Group__1
             {
-            pushFollow(FOLLOW_129);
+            pushFollow(FOLLOW_137);
             rule__XIfExpression__Group__0__Impl();
 
             state._fsp--;
@@ -55141,23 +58762,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__0__Impl"
-    // InternalDataDSL.g:16582:1: rule__XIfExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:17668:1: rule__XIfExpression__Group__0__Impl : ( () ) ;
     public final void rule__XIfExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16586:1: ( ( () ) )
-            // InternalDataDSL.g:16587:1: ( () )
+            // InternalDataDSL.g:17672:1: ( ( () ) )
+            // InternalDataDSL.g:17673:1: ( () )
             {
-            // InternalDataDSL.g:16587:1: ( () )
-            // InternalDataDSL.g:16588:2: ()
+            // InternalDataDSL.g:17673:1: ( () )
+            // InternalDataDSL.g:17674:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getXIfExpressionAction_0()); 
             }
-            // InternalDataDSL.g:16589:2: ()
-            // InternalDataDSL.g:16589:3: 
+            // InternalDataDSL.g:17675:2: ()
+            // InternalDataDSL.g:17675:3: 
             {
             }
 
@@ -55182,16 +58803,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__1"
-    // InternalDataDSL.g:16597:1: rule__XIfExpression__Group__1 : rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 ;
+    // InternalDataDSL.g:17683:1: rule__XIfExpression__Group__1 : rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 ;
     public final void rule__XIfExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16601:1: ( rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 )
-            // InternalDataDSL.g:16602:2: rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2
+            // InternalDataDSL.g:17687:1: ( rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2 )
+            // InternalDataDSL.g:17688:2: rule__XIfExpression__Group__1__Impl rule__XIfExpression__Group__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XIfExpression__Group__1__Impl();
 
             state._fsp--;
@@ -55220,22 +58841,22 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__1__Impl"
-    // InternalDataDSL.g:16609:1: rule__XIfExpression__Group__1__Impl : ( 'if' ) ;
+    // InternalDataDSL.g:17695:1: rule__XIfExpression__Group__1__Impl : ( 'if' ) ;
     public final void rule__XIfExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16613:1: ( ( 'if' ) )
-            // InternalDataDSL.g:16614:1: ( 'if' )
+            // InternalDataDSL.g:17699:1: ( ( 'if' ) )
+            // InternalDataDSL.g:17700:1: ( 'if' )
             {
-            // InternalDataDSL.g:16614:1: ( 'if' )
-            // InternalDataDSL.g:16615:2: 'if'
+            // InternalDataDSL.g:17700:1: ( 'if' )
+            // InternalDataDSL.g:17701:2: 'if'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); 
             }
-            match(input,129,FOLLOW_2); if (state.failed) return ;
+            match(input,135,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXIfExpressionAccess().getIfKeyword_1()); 
             }
@@ -55261,16 +58882,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__2"
-    // InternalDataDSL.g:16624:1: rule__XIfExpression__Group__2 : rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 ;
+    // InternalDataDSL.g:17710:1: rule__XIfExpression__Group__2 : rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 ;
     public final void rule__XIfExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16628:1: ( rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 )
-            // InternalDataDSL.g:16629:2: rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3
+            // InternalDataDSL.g:17714:1: ( rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3 )
+            // InternalDataDSL.g:17715:2: rule__XIfExpression__Group__2__Impl rule__XIfExpression__Group__3
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XIfExpression__Group__2__Impl();
 
             state._fsp--;
@@ -55299,22 +58920,22 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__2__Impl"
-    // InternalDataDSL.g:16636:1: rule__XIfExpression__Group__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:17722:1: rule__XIfExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XIfExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16640:1: ( ( '(' ) )
-            // InternalDataDSL.g:16641:1: ( '(' )
+            // InternalDataDSL.g:17726:1: ( ( '(' ) )
+            // InternalDataDSL.g:17727:1: ( '(' )
             {
-            // InternalDataDSL.g:16641:1: ( '(' )
-            // InternalDataDSL.g:16642:2: '('
+            // InternalDataDSL.g:17727:1: ( '(' )
+            // InternalDataDSL.g:17728:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
@@ -55340,16 +58961,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__3"
-    // InternalDataDSL.g:16651:1: rule__XIfExpression__Group__3 : rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 ;
+    // InternalDataDSL.g:17737:1: rule__XIfExpression__Group__3 : rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 ;
     public final void rule__XIfExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16655:1: ( rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 )
-            // InternalDataDSL.g:16656:2: rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4
+            // InternalDataDSL.g:17741:1: ( rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4 )
+            // InternalDataDSL.g:17742:2: rule__XIfExpression__Group__3__Impl rule__XIfExpression__Group__4
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XIfExpression__Group__3__Impl();
 
             state._fsp--;
@@ -55378,23 +58999,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__3__Impl"
-    // InternalDataDSL.g:16663:1: rule__XIfExpression__Group__3__Impl : ( ( rule__XIfExpression__IfAssignment_3 ) ) ;
+    // InternalDataDSL.g:17749:1: rule__XIfExpression__Group__3__Impl : ( ( rule__XIfExpression__IfAssignment_3 ) ) ;
     public final void rule__XIfExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16667:1: ( ( ( rule__XIfExpression__IfAssignment_3 ) ) )
-            // InternalDataDSL.g:16668:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            // InternalDataDSL.g:17753:1: ( ( ( rule__XIfExpression__IfAssignment_3 ) ) )
+            // InternalDataDSL.g:17754:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
             {
-            // InternalDataDSL.g:16668:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
-            // InternalDataDSL.g:16669:2: ( rule__XIfExpression__IfAssignment_3 )
+            // InternalDataDSL.g:17754:1: ( ( rule__XIfExpression__IfAssignment_3 ) )
+            // InternalDataDSL.g:17755:2: ( rule__XIfExpression__IfAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfAssignment_3()); 
             }
-            // InternalDataDSL.g:16670:2: ( rule__XIfExpression__IfAssignment_3 )
-            // InternalDataDSL.g:16670:3: rule__XIfExpression__IfAssignment_3
+            // InternalDataDSL.g:17756:2: ( rule__XIfExpression__IfAssignment_3 )
+            // InternalDataDSL.g:17756:3: rule__XIfExpression__IfAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__IfAssignment_3();
@@ -55429,16 +59050,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__4"
-    // InternalDataDSL.g:16678:1: rule__XIfExpression__Group__4 : rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 ;
+    // InternalDataDSL.g:17764:1: rule__XIfExpression__Group__4 : rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 ;
     public final void rule__XIfExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16682:1: ( rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 )
-            // InternalDataDSL.g:16683:2: rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5
+            // InternalDataDSL.g:17768:1: ( rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5 )
+            // InternalDataDSL.g:17769:2: rule__XIfExpression__Group__4__Impl rule__XIfExpression__Group__5
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XIfExpression__Group__4__Impl();
 
             state._fsp--;
@@ -55467,22 +59088,22 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__4__Impl"
-    // InternalDataDSL.g:16690:1: rule__XIfExpression__Group__4__Impl : ( ')' ) ;
+    // InternalDataDSL.g:17776:1: rule__XIfExpression__Group__4__Impl : ( ')' ) ;
     public final void rule__XIfExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16694:1: ( ( ')' ) )
-            // InternalDataDSL.g:16695:1: ( ')' )
+            // InternalDataDSL.g:17780:1: ( ( ')' ) )
+            // InternalDataDSL.g:17781:1: ( ')' )
             {
-            // InternalDataDSL.g:16695:1: ( ')' )
-            // InternalDataDSL.g:16696:2: ')'
+            // InternalDataDSL.g:17781:1: ( ')' )
+            // InternalDataDSL.g:17782:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4()); 
             }
@@ -55508,16 +59129,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__5"
-    // InternalDataDSL.g:16705:1: rule__XIfExpression__Group__5 : rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 ;
+    // InternalDataDSL.g:17791:1: rule__XIfExpression__Group__5 : rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 ;
     public final void rule__XIfExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16709:1: ( rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 )
-            // InternalDataDSL.g:16710:2: rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6
+            // InternalDataDSL.g:17795:1: ( rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6 )
+            // InternalDataDSL.g:17796:2: rule__XIfExpression__Group__5__Impl rule__XIfExpression__Group__6
             {
-            pushFollow(FOLLOW_130);
+            pushFollow(FOLLOW_138);
             rule__XIfExpression__Group__5__Impl();
 
             state._fsp--;
@@ -55546,23 +59167,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__5__Impl"
-    // InternalDataDSL.g:16717:1: rule__XIfExpression__Group__5__Impl : ( ( rule__XIfExpression__ThenAssignment_5 ) ) ;
+    // InternalDataDSL.g:17803:1: rule__XIfExpression__Group__5__Impl : ( ( rule__XIfExpression__ThenAssignment_5 ) ) ;
     public final void rule__XIfExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16721:1: ( ( ( rule__XIfExpression__ThenAssignment_5 ) ) )
-            // InternalDataDSL.g:16722:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            // InternalDataDSL.g:17807:1: ( ( ( rule__XIfExpression__ThenAssignment_5 ) ) )
+            // InternalDataDSL.g:17808:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
             {
-            // InternalDataDSL.g:16722:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
-            // InternalDataDSL.g:16723:2: ( rule__XIfExpression__ThenAssignment_5 )
+            // InternalDataDSL.g:17808:1: ( ( rule__XIfExpression__ThenAssignment_5 ) )
+            // InternalDataDSL.g:17809:2: ( rule__XIfExpression__ThenAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getThenAssignment_5()); 
             }
-            // InternalDataDSL.g:16724:2: ( rule__XIfExpression__ThenAssignment_5 )
-            // InternalDataDSL.g:16724:3: rule__XIfExpression__ThenAssignment_5
+            // InternalDataDSL.g:17810:2: ( rule__XIfExpression__ThenAssignment_5 )
+            // InternalDataDSL.g:17810:3: rule__XIfExpression__ThenAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__ThenAssignment_5();
@@ -55597,14 +59218,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__6"
-    // InternalDataDSL.g:16732:1: rule__XIfExpression__Group__6 : rule__XIfExpression__Group__6__Impl ;
+    // InternalDataDSL.g:17818:1: rule__XIfExpression__Group__6 : rule__XIfExpression__Group__6__Impl ;
     public final void rule__XIfExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16736:1: ( rule__XIfExpression__Group__6__Impl )
-            // InternalDataDSL.g:16737:2: rule__XIfExpression__Group__6__Impl
+            // InternalDataDSL.g:17822:1: ( rule__XIfExpression__Group__6__Impl )
+            // InternalDataDSL.g:17823:2: rule__XIfExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group__6__Impl();
@@ -55630,35 +59251,35 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group__6__Impl"
-    // InternalDataDSL.g:16743:1: rule__XIfExpression__Group__6__Impl : ( ( rule__XIfExpression__Group_6__0 )? ) ;
+    // InternalDataDSL.g:17829:1: rule__XIfExpression__Group__6__Impl : ( ( rule__XIfExpression__Group_6__0 )? ) ;
     public final void rule__XIfExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16747:1: ( ( ( rule__XIfExpression__Group_6__0 )? ) )
-            // InternalDataDSL.g:16748:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            // InternalDataDSL.g:17833:1: ( ( ( rule__XIfExpression__Group_6__0 )? ) )
+            // InternalDataDSL.g:17834:1: ( ( rule__XIfExpression__Group_6__0 )? )
             {
-            // InternalDataDSL.g:16748:1: ( ( rule__XIfExpression__Group_6__0 )? )
-            // InternalDataDSL.g:16749:2: ( rule__XIfExpression__Group_6__0 )?
+            // InternalDataDSL.g:17834:1: ( ( rule__XIfExpression__Group_6__0 )? )
+            // InternalDataDSL.g:17835:2: ( rule__XIfExpression__Group_6__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getGroup_6()); 
             }
-            // InternalDataDSL.g:16750:2: ( rule__XIfExpression__Group_6__0 )?
-            int alt139=2;
-            int LA139_0 = input.LA(1);
+            // InternalDataDSL.g:17836:2: ( rule__XIfExpression__Group_6__0 )?
+            int alt144=2;
+            int LA144_0 = input.LA(1);
 
-            if ( (LA139_0==130) ) {
-                int LA139_1 = input.LA(2);
+            if ( (LA144_0==136) ) {
+                int LA144_1 = input.LA(2);
 
-                if ( (synpred199_InternalDataDSL()) ) {
-                    alt139=1;
+                if ( (synpred210_InternalDataDSL()) ) {
+                    alt144=1;
                 }
             }
-            switch (alt139) {
+            switch (alt144) {
                 case 1 :
-                    // InternalDataDSL.g:16750:3: rule__XIfExpression__Group_6__0
+                    // InternalDataDSL.g:17836:3: rule__XIfExpression__Group_6__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XIfExpression__Group_6__0();
@@ -55696,16 +59317,16 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__0"
-    // InternalDataDSL.g:16759:1: rule__XIfExpression__Group_6__0 : rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 ;
+    // InternalDataDSL.g:17845:1: rule__XIfExpression__Group_6__0 : rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 ;
     public final void rule__XIfExpression__Group_6__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16763:1: ( rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 )
-            // InternalDataDSL.g:16764:2: rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1
+            // InternalDataDSL.g:17849:1: ( rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1 )
+            // InternalDataDSL.g:17850:2: rule__XIfExpression__Group_6__0__Impl rule__XIfExpression__Group_6__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XIfExpression__Group_6__0__Impl();
 
             state._fsp--;
@@ -55734,25 +59355,25 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__0__Impl"
-    // InternalDataDSL.g:16771:1: rule__XIfExpression__Group_6__0__Impl : ( ( 'else' ) ) ;
+    // InternalDataDSL.g:17857:1: rule__XIfExpression__Group_6__0__Impl : ( ( 'else' ) ) ;
     public final void rule__XIfExpression__Group_6__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16775:1: ( ( ( 'else' ) ) )
-            // InternalDataDSL.g:16776:1: ( ( 'else' ) )
+            // InternalDataDSL.g:17861:1: ( ( ( 'else' ) ) )
+            // InternalDataDSL.g:17862:1: ( ( 'else' ) )
             {
-            // InternalDataDSL.g:16776:1: ( ( 'else' ) )
-            // InternalDataDSL.g:16777:2: ( 'else' )
+            // InternalDataDSL.g:17862:1: ( ( 'else' ) )
+            // InternalDataDSL.g:17863:2: ( 'else' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0()); 
             }
-            // InternalDataDSL.g:16778:2: ( 'else' )
-            // InternalDataDSL.g:16778:3: 'else'
+            // InternalDataDSL.g:17864:2: ( 'else' )
+            // InternalDataDSL.g:17864:3: 'else'
             {
-            match(input,130,FOLLOW_2); if (state.failed) return ;
+            match(input,136,FOLLOW_2); if (state.failed) return ;
 
             }
 
@@ -55781,14 +59402,14 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__1"
-    // InternalDataDSL.g:16786:1: rule__XIfExpression__Group_6__1 : rule__XIfExpression__Group_6__1__Impl ;
+    // InternalDataDSL.g:17872:1: rule__XIfExpression__Group_6__1 : rule__XIfExpression__Group_6__1__Impl ;
     public final void rule__XIfExpression__Group_6__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16790:1: ( rule__XIfExpression__Group_6__1__Impl )
-            // InternalDataDSL.g:16791:2: rule__XIfExpression__Group_6__1__Impl
+            // InternalDataDSL.g:17876:1: ( rule__XIfExpression__Group_6__1__Impl )
+            // InternalDataDSL.g:17877:2: rule__XIfExpression__Group_6__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__Group_6__1__Impl();
@@ -55814,23 +59435,23 @@
 
 
     // $ANTLR start "rule__XIfExpression__Group_6__1__Impl"
-    // InternalDataDSL.g:16797:1: rule__XIfExpression__Group_6__1__Impl : ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) ;
+    // InternalDataDSL.g:17883:1: rule__XIfExpression__Group_6__1__Impl : ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) ;
     public final void rule__XIfExpression__Group_6__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16801:1: ( ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) )
-            // InternalDataDSL.g:16802:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            // InternalDataDSL.g:17887:1: ( ( ( rule__XIfExpression__ElseAssignment_6_1 ) ) )
+            // InternalDataDSL.g:17888:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
             {
-            // InternalDataDSL.g:16802:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
-            // InternalDataDSL.g:16803:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            // InternalDataDSL.g:17888:1: ( ( rule__XIfExpression__ElseAssignment_6_1 ) )
+            // InternalDataDSL.g:17889:2: ( rule__XIfExpression__ElseAssignment_6_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseAssignment_6_1()); 
             }
-            // InternalDataDSL.g:16804:2: ( rule__XIfExpression__ElseAssignment_6_1 )
-            // InternalDataDSL.g:16804:3: rule__XIfExpression__ElseAssignment_6_1
+            // InternalDataDSL.g:17890:2: ( rule__XIfExpression__ElseAssignment_6_1 )
+            // InternalDataDSL.g:17890:3: rule__XIfExpression__ElseAssignment_6_1
             {
             pushFollow(FOLLOW_2);
             rule__XIfExpression__ElseAssignment_6_1();
@@ -55865,16 +59486,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__0"
-    // InternalDataDSL.g:16813:1: rule__XSwitchExpression__Group__0 : rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 ;
+    // InternalDataDSL.g:17899:1: rule__XSwitchExpression__Group__0 : rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 ;
     public final void rule__XSwitchExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16817:1: ( rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 )
-            // InternalDataDSL.g:16818:2: rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1
+            // InternalDataDSL.g:17903:1: ( rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1 )
+            // InternalDataDSL.g:17904:2: rule__XSwitchExpression__Group__0__Impl rule__XSwitchExpression__Group__1
             {
-            pushFollow(FOLLOW_131);
+            pushFollow(FOLLOW_139);
             rule__XSwitchExpression__Group__0__Impl();
 
             state._fsp--;
@@ -55903,23 +59524,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__0__Impl"
-    // InternalDataDSL.g:16825:1: rule__XSwitchExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:17911:1: rule__XSwitchExpression__Group__0__Impl : ( () ) ;
     public final void rule__XSwitchExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16829:1: ( ( () ) )
-            // InternalDataDSL.g:16830:1: ( () )
+            // InternalDataDSL.g:17915:1: ( ( () ) )
+            // InternalDataDSL.g:17916:1: ( () )
             {
-            // InternalDataDSL.g:16830:1: ( () )
-            // InternalDataDSL.g:16831:2: ()
+            // InternalDataDSL.g:17916:1: ( () )
+            // InternalDataDSL.g:17917:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getXSwitchExpressionAction_0()); 
             }
-            // InternalDataDSL.g:16832:2: ()
-            // InternalDataDSL.g:16832:3: 
+            // InternalDataDSL.g:17918:2: ()
+            // InternalDataDSL.g:17918:3: 
             {
             }
 
@@ -55944,16 +59565,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__1"
-    // InternalDataDSL.g:16840:1: rule__XSwitchExpression__Group__1 : rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 ;
+    // InternalDataDSL.g:17926:1: rule__XSwitchExpression__Group__1 : rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 ;
     public final void rule__XSwitchExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16844:1: ( rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 )
-            // InternalDataDSL.g:16845:2: rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2
+            // InternalDataDSL.g:17930:1: ( rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2 )
+            // InternalDataDSL.g:17931:2: rule__XSwitchExpression__Group__1__Impl rule__XSwitchExpression__Group__2
             {
-            pushFollow(FOLLOW_132);
+            pushFollow(FOLLOW_140);
             rule__XSwitchExpression__Group__1__Impl();
 
             state._fsp--;
@@ -55982,22 +59603,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__1__Impl"
-    // InternalDataDSL.g:16852:1: rule__XSwitchExpression__Group__1__Impl : ( 'switch' ) ;
+    // InternalDataDSL.g:17938:1: rule__XSwitchExpression__Group__1__Impl : ( 'switch' ) ;
     public final void rule__XSwitchExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16856:1: ( ( 'switch' ) )
-            // InternalDataDSL.g:16857:1: ( 'switch' )
+            // InternalDataDSL.g:17942:1: ( ( 'switch' ) )
+            // InternalDataDSL.g:17943:1: ( 'switch' )
             {
-            // InternalDataDSL.g:16857:1: ( 'switch' )
-            // InternalDataDSL.g:16858:2: 'switch'
+            // InternalDataDSL.g:17943:1: ( 'switch' )
+            // InternalDataDSL.g:17944:2: 'switch'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); 
             }
-            match(input,131,FOLLOW_2); if (state.failed) return ;
+            match(input,137,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1()); 
             }
@@ -56023,14 +59644,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__2"
-    // InternalDataDSL.g:16867:1: rule__XSwitchExpression__Group__2 : rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 ;
+    // InternalDataDSL.g:17953:1: rule__XSwitchExpression__Group__2 : rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 ;
     public final void rule__XSwitchExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16871:1: ( rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 )
-            // InternalDataDSL.g:16872:2: rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3
+            // InternalDataDSL.g:17957:1: ( rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3 )
+            // InternalDataDSL.g:17958:2: rule__XSwitchExpression__Group__2__Impl rule__XSwitchExpression__Group__3
             {
             pushFollow(FOLLOW_8);
             rule__XSwitchExpression__Group__2__Impl();
@@ -56061,23 +59682,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__2__Impl"
-    // InternalDataDSL.g:16879:1: rule__XSwitchExpression__Group__2__Impl : ( ( rule__XSwitchExpression__Alternatives_2 ) ) ;
+    // InternalDataDSL.g:17965:1: rule__XSwitchExpression__Group__2__Impl : ( ( rule__XSwitchExpression__Alternatives_2 ) ) ;
     public final void rule__XSwitchExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16883:1: ( ( ( rule__XSwitchExpression__Alternatives_2 ) ) )
-            // InternalDataDSL.g:16884:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            // InternalDataDSL.g:17969:1: ( ( ( rule__XSwitchExpression__Alternatives_2 ) ) )
+            // InternalDataDSL.g:17970:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
             {
-            // InternalDataDSL.g:16884:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
-            // InternalDataDSL.g:16885:2: ( rule__XSwitchExpression__Alternatives_2 )
+            // InternalDataDSL.g:17970:1: ( ( rule__XSwitchExpression__Alternatives_2 ) )
+            // InternalDataDSL.g:17971:2: ( rule__XSwitchExpression__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getAlternatives_2()); 
             }
-            // InternalDataDSL.g:16886:2: ( rule__XSwitchExpression__Alternatives_2 )
-            // InternalDataDSL.g:16886:3: rule__XSwitchExpression__Alternatives_2
+            // InternalDataDSL.g:17972:2: ( rule__XSwitchExpression__Alternatives_2 )
+            // InternalDataDSL.g:17972:3: rule__XSwitchExpression__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Alternatives_2();
@@ -56112,16 +59733,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__3"
-    // InternalDataDSL.g:16894:1: rule__XSwitchExpression__Group__3 : rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 ;
+    // InternalDataDSL.g:17980:1: rule__XSwitchExpression__Group__3 : rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 ;
     public final void rule__XSwitchExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16898:1: ( rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 )
-            // InternalDataDSL.g:16899:2: rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4
+            // InternalDataDSL.g:17984:1: ( rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4 )
+            // InternalDataDSL.g:17985:2: rule__XSwitchExpression__Group__3__Impl rule__XSwitchExpression__Group__4
             {
-            pushFollow(FOLLOW_133);
+            pushFollow(FOLLOW_141);
             rule__XSwitchExpression__Group__3__Impl();
 
             state._fsp--;
@@ -56150,17 +59771,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__3__Impl"
-    // InternalDataDSL.g:16906:1: rule__XSwitchExpression__Group__3__Impl : ( '{' ) ;
+    // InternalDataDSL.g:17992:1: rule__XSwitchExpression__Group__3__Impl : ( '{' ) ;
     public final void rule__XSwitchExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16910:1: ( ( '{' ) )
-            // InternalDataDSL.g:16911:1: ( '{' )
+            // InternalDataDSL.g:17996:1: ( ( '{' ) )
+            // InternalDataDSL.g:17997:1: ( '{' )
             {
-            // InternalDataDSL.g:16911:1: ( '{' )
-            // InternalDataDSL.g:16912:2: '{'
+            // InternalDataDSL.g:17997:1: ( '{' )
+            // InternalDataDSL.g:17998:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3()); 
@@ -56191,16 +59812,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__4"
-    // InternalDataDSL.g:16921:1: rule__XSwitchExpression__Group__4 : rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 ;
+    // InternalDataDSL.g:18007:1: rule__XSwitchExpression__Group__4 : rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 ;
     public final void rule__XSwitchExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16925:1: ( rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 )
-            // InternalDataDSL.g:16926:2: rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5
+            // InternalDataDSL.g:18011:1: ( rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5 )
+            // InternalDataDSL.g:18012:2: rule__XSwitchExpression__Group__4__Impl rule__XSwitchExpression__Group__5
             {
-            pushFollow(FOLLOW_133);
+            pushFollow(FOLLOW_141);
             rule__XSwitchExpression__Group__4__Impl();
 
             state._fsp--;
@@ -56229,37 +59850,37 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__4__Impl"
-    // InternalDataDSL.g:16933:1: rule__XSwitchExpression__Group__4__Impl : ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) ;
+    // InternalDataDSL.g:18019:1: rule__XSwitchExpression__Group__4__Impl : ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) ;
     public final void rule__XSwitchExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16937:1: ( ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) )
-            // InternalDataDSL.g:16938:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            // InternalDataDSL.g:18023:1: ( ( ( rule__XSwitchExpression__CasesAssignment_4 )* ) )
+            // InternalDataDSL.g:18024:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
             {
-            // InternalDataDSL.g:16938:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
-            // InternalDataDSL.g:16939:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            // InternalDataDSL.g:18024:1: ( ( rule__XSwitchExpression__CasesAssignment_4 )* )
+            // InternalDataDSL.g:18025:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getCasesAssignment_4()); 
             }
-            // InternalDataDSL.g:16940:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
-            loop140:
+            // InternalDataDSL.g:18026:2: ( rule__XSwitchExpression__CasesAssignment_4 )*
+            loop145:
             do {
-                int alt140=2;
-                int LA140_0 = input.LA(1);
+                int alt145=2;
+                int LA145_0 = input.LA(1);
 
-                if ( (LA140_0==RULE_ID||LA140_0==31||LA140_0==122||LA140_0==124||LA140_0==132||LA140_0==134) ) {
-                    alt140=1;
+                if ( (LA145_0==RULE_ID||LA145_0==31||LA145_0==128||LA145_0==130||LA145_0==138||LA145_0==140) ) {
+                    alt145=1;
                 }
 
 
-                switch (alt140) {
+                switch (alt145) {
             	case 1 :
-            	    // InternalDataDSL.g:16940:3: rule__XSwitchExpression__CasesAssignment_4
+            	    // InternalDataDSL.g:18026:3: rule__XSwitchExpression__CasesAssignment_4
             	    {
-            	    pushFollow(FOLLOW_134);
+            	    pushFollow(FOLLOW_142);
             	    rule__XSwitchExpression__CasesAssignment_4();
 
             	    state._fsp--;
@@ -56269,7 +59890,7 @@
             	    break;
 
             	default :
-            	    break loop140;
+            	    break loop145;
                 }
             } while (true);
 
@@ -56298,16 +59919,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__5"
-    // InternalDataDSL.g:16948:1: rule__XSwitchExpression__Group__5 : rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 ;
+    // InternalDataDSL.g:18034:1: rule__XSwitchExpression__Group__5 : rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 ;
     public final void rule__XSwitchExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16952:1: ( rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 )
-            // InternalDataDSL.g:16953:2: rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6
+            // InternalDataDSL.g:18038:1: ( rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6 )
+            // InternalDataDSL.g:18039:2: rule__XSwitchExpression__Group__5__Impl rule__XSwitchExpression__Group__6
             {
-            pushFollow(FOLLOW_133);
+            pushFollow(FOLLOW_141);
             rule__XSwitchExpression__Group__5__Impl();
 
             state._fsp--;
@@ -56336,31 +59957,31 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__5__Impl"
-    // InternalDataDSL.g:16960:1: rule__XSwitchExpression__Group__5__Impl : ( ( rule__XSwitchExpression__Group_5__0 )? ) ;
+    // InternalDataDSL.g:18046:1: rule__XSwitchExpression__Group__5__Impl : ( ( rule__XSwitchExpression__Group_5__0 )? ) ;
     public final void rule__XSwitchExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16964:1: ( ( ( rule__XSwitchExpression__Group_5__0 )? ) )
-            // InternalDataDSL.g:16965:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            // InternalDataDSL.g:18050:1: ( ( ( rule__XSwitchExpression__Group_5__0 )? ) )
+            // InternalDataDSL.g:18051:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
             {
-            // InternalDataDSL.g:16965:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
-            // InternalDataDSL.g:16966:2: ( rule__XSwitchExpression__Group_5__0 )?
+            // InternalDataDSL.g:18051:1: ( ( rule__XSwitchExpression__Group_5__0 )? )
+            // InternalDataDSL.g:18052:2: ( rule__XSwitchExpression__Group_5__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_5()); 
             }
-            // InternalDataDSL.g:16967:2: ( rule__XSwitchExpression__Group_5__0 )?
-            int alt141=2;
-            int LA141_0 = input.LA(1);
+            // InternalDataDSL.g:18053:2: ( rule__XSwitchExpression__Group_5__0 )?
+            int alt146=2;
+            int LA146_0 = input.LA(1);
 
-            if ( (LA141_0==133) ) {
-                alt141=1;
+            if ( (LA146_0==139) ) {
+                alt146=1;
             }
-            switch (alt141) {
+            switch (alt146) {
                 case 1 :
-                    // InternalDataDSL.g:16967:3: rule__XSwitchExpression__Group_5__0
+                    // InternalDataDSL.g:18053:3: rule__XSwitchExpression__Group_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_5__0();
@@ -56398,14 +60019,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__6"
-    // InternalDataDSL.g:16975:1: rule__XSwitchExpression__Group__6 : rule__XSwitchExpression__Group__6__Impl ;
+    // InternalDataDSL.g:18061:1: rule__XSwitchExpression__Group__6 : rule__XSwitchExpression__Group__6__Impl ;
     public final void rule__XSwitchExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16979:1: ( rule__XSwitchExpression__Group__6__Impl )
-            // InternalDataDSL.g:16980:2: rule__XSwitchExpression__Group__6__Impl
+            // InternalDataDSL.g:18065:1: ( rule__XSwitchExpression__Group__6__Impl )
+            // InternalDataDSL.g:18066:2: rule__XSwitchExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group__6__Impl();
@@ -56431,17 +60052,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group__6__Impl"
-    // InternalDataDSL.g:16986:1: rule__XSwitchExpression__Group__6__Impl : ( '}' ) ;
+    // InternalDataDSL.g:18072:1: rule__XSwitchExpression__Group__6__Impl : ( '}' ) ;
     public final void rule__XSwitchExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:16990:1: ( ( '}' ) )
-            // InternalDataDSL.g:16991:1: ( '}' )
+            // InternalDataDSL.g:18076:1: ( ( '}' ) )
+            // InternalDataDSL.g:18077:1: ( '}' )
             {
-            // InternalDataDSL.g:16991:1: ( '}' )
-            // InternalDataDSL.g:16992:2: '}'
+            // InternalDataDSL.g:18077:1: ( '}' )
+            // InternalDataDSL.g:18078:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getRightCurlyBracketKeyword_6()); 
@@ -56472,16 +60093,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__0"
-    // InternalDataDSL.g:17002:1: rule__XSwitchExpression__Group_2_0__0 : rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 ;
+    // InternalDataDSL.g:18088:1: rule__XSwitchExpression__Group_2_0__0 : rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 ;
     public final void rule__XSwitchExpression__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17006:1: ( rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 )
-            // InternalDataDSL.g:17007:2: rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1
+            // InternalDataDSL.g:18092:1: ( rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1 )
+            // InternalDataDSL.g:18093:2: rule__XSwitchExpression__Group_2_0__0__Impl rule__XSwitchExpression__Group_2_0__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XSwitchExpression__Group_2_0__0__Impl();
 
             state._fsp--;
@@ -56510,23 +60131,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__0__Impl"
-    // InternalDataDSL.g:17014:1: rule__XSwitchExpression__Group_2_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) ;
+    // InternalDataDSL.g:18100:1: rule__XSwitchExpression__Group_2_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17018:1: ( ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) )
-            // InternalDataDSL.g:17019:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            // InternalDataDSL.g:18104:1: ( ( ( rule__XSwitchExpression__Group_2_0_0__0 ) ) )
+            // InternalDataDSL.g:18105:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
             {
-            // InternalDataDSL.g:17019:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
-            // InternalDataDSL.g:17020:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            // InternalDataDSL.g:18105:1: ( ( rule__XSwitchExpression__Group_2_0_0__0 ) )
+            // InternalDataDSL.g:18106:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0()); 
             }
-            // InternalDataDSL.g:17021:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
-            // InternalDataDSL.g:17021:3: rule__XSwitchExpression__Group_2_0_0__0
+            // InternalDataDSL.g:18107:2: ( rule__XSwitchExpression__Group_2_0_0__0 )
+            // InternalDataDSL.g:18107:3: rule__XSwitchExpression__Group_2_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0__0();
@@ -56561,16 +60182,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__1"
-    // InternalDataDSL.g:17029:1: rule__XSwitchExpression__Group_2_0__1 : rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 ;
+    // InternalDataDSL.g:18115:1: rule__XSwitchExpression__Group_2_0__1 : rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 ;
     public final void rule__XSwitchExpression__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17033:1: ( rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 )
-            // InternalDataDSL.g:17034:2: rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2
+            // InternalDataDSL.g:18119:1: ( rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2 )
+            // InternalDataDSL.g:18120:2: rule__XSwitchExpression__Group_2_0__1__Impl rule__XSwitchExpression__Group_2_0__2
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XSwitchExpression__Group_2_0__1__Impl();
 
             state._fsp--;
@@ -56599,23 +60220,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__1__Impl"
-    // InternalDataDSL.g:17041:1: rule__XSwitchExpression__Group_2_0__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) ;
+    // InternalDataDSL.g:18127:1: rule__XSwitchExpression__Group_2_0__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17045:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) )
-            // InternalDataDSL.g:17046:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            // InternalDataDSL.g:18131:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) ) )
+            // InternalDataDSL.g:18132:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
             {
-            // InternalDataDSL.g:17046:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
-            // InternalDataDSL.g:17047:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            // InternalDataDSL.g:18132:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_0_1 ) )
+            // InternalDataDSL.g:18133:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_0_1()); 
             }
-            // InternalDataDSL.g:17048:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
-            // InternalDataDSL.g:17048:3: rule__XSwitchExpression__SwitchAssignment_2_0_1
+            // InternalDataDSL.g:18134:2: ( rule__XSwitchExpression__SwitchAssignment_2_0_1 )
+            // InternalDataDSL.g:18134:3: rule__XSwitchExpression__SwitchAssignment_2_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__SwitchAssignment_2_0_1();
@@ -56650,14 +60271,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__2"
-    // InternalDataDSL.g:17056:1: rule__XSwitchExpression__Group_2_0__2 : rule__XSwitchExpression__Group_2_0__2__Impl ;
+    // InternalDataDSL.g:18142:1: rule__XSwitchExpression__Group_2_0__2 : rule__XSwitchExpression__Group_2_0__2__Impl ;
     public final void rule__XSwitchExpression__Group_2_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17060:1: ( rule__XSwitchExpression__Group_2_0__2__Impl )
-            // InternalDataDSL.g:17061:2: rule__XSwitchExpression__Group_2_0__2__Impl
+            // InternalDataDSL.g:18146:1: ( rule__XSwitchExpression__Group_2_0__2__Impl )
+            // InternalDataDSL.g:18147:2: rule__XSwitchExpression__Group_2_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0__2__Impl();
@@ -56683,22 +60304,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0__2__Impl"
-    // InternalDataDSL.g:17067:1: rule__XSwitchExpression__Group_2_0__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:18153:1: rule__XSwitchExpression__Group_2_0__2__Impl : ( ')' ) ;
     public final void rule__XSwitchExpression__Group_2_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17071:1: ( ( ')' ) )
-            // InternalDataDSL.g:17072:1: ( ')' )
+            // InternalDataDSL.g:18157:1: ( ( ')' ) )
+            // InternalDataDSL.g:18158:1: ( ')' )
             {
-            // InternalDataDSL.g:17072:1: ( ')' )
-            // InternalDataDSL.g:17073:2: ')'
+            // InternalDataDSL.g:18158:1: ( ')' )
+            // InternalDataDSL.g:18159:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2()); 
             }
@@ -56724,14 +60345,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0"
-    // InternalDataDSL.g:17083:1: rule__XSwitchExpression__Group_2_0_0__0 : rule__XSwitchExpression__Group_2_0_0__0__Impl ;
+    // InternalDataDSL.g:18169:1: rule__XSwitchExpression__Group_2_0_0__0 : rule__XSwitchExpression__Group_2_0_0__0__Impl ;
     public final void rule__XSwitchExpression__Group_2_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17087:1: ( rule__XSwitchExpression__Group_2_0_0__0__Impl )
-            // InternalDataDSL.g:17088:2: rule__XSwitchExpression__Group_2_0_0__0__Impl
+            // InternalDataDSL.g:18173:1: ( rule__XSwitchExpression__Group_2_0_0__0__Impl )
+            // InternalDataDSL.g:18174:2: rule__XSwitchExpression__Group_2_0_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0__0__Impl();
@@ -56757,23 +60378,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0__0__Impl"
-    // InternalDataDSL.g:17094:1: rule__XSwitchExpression__Group_2_0_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) ;
+    // InternalDataDSL.g:18180:1: rule__XSwitchExpression__Group_2_0_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17098:1: ( ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) )
-            // InternalDataDSL.g:17099:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            // InternalDataDSL.g:18184:1: ( ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) ) )
+            // InternalDataDSL.g:18185:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
             {
-            // InternalDataDSL.g:17099:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
-            // InternalDataDSL.g:17100:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            // InternalDataDSL.g:18185:1: ( ( rule__XSwitchExpression__Group_2_0_0_0__0 ) )
+            // InternalDataDSL.g:18186:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0_0_0()); 
             }
-            // InternalDataDSL.g:17101:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
-            // InternalDataDSL.g:17101:3: rule__XSwitchExpression__Group_2_0_0_0__0
+            // InternalDataDSL.g:18187:2: ( rule__XSwitchExpression__Group_2_0_0_0__0 )
+            // InternalDataDSL.g:18187:3: rule__XSwitchExpression__Group_2_0_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0_0__0();
@@ -56808,16 +60429,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0"
-    // InternalDataDSL.g:17110:1: rule__XSwitchExpression__Group_2_0_0_0__0 : rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 ;
+    // InternalDataDSL.g:18196:1: rule__XSwitchExpression__Group_2_0_0_0__0 : rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17114:1: ( rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 )
-            // InternalDataDSL.g:17115:2: rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1
+            // InternalDataDSL.g:18200:1: ( rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1 )
+            // InternalDataDSL.g:18201:2: rule__XSwitchExpression__Group_2_0_0_0__0__Impl rule__XSwitchExpression__Group_2_0_0_0__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XSwitchExpression__Group_2_0_0_0__0__Impl();
 
             state._fsp--;
@@ -56846,22 +60467,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__0__Impl"
-    // InternalDataDSL.g:17122:1: rule__XSwitchExpression__Group_2_0_0_0__0__Impl : ( '(' ) ;
+    // InternalDataDSL.g:18208:1: rule__XSwitchExpression__Group_2_0_0_0__0__Impl : ( '(' ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17126:1: ( ( '(' ) )
-            // InternalDataDSL.g:17127:1: ( '(' )
+            // InternalDataDSL.g:18212:1: ( ( '(' ) )
+            // InternalDataDSL.g:18213:1: ( '(' )
             {
-            // InternalDataDSL.g:17127:1: ( '(' )
-            // InternalDataDSL.g:17128:2: '('
+            // InternalDataDSL.g:18213:1: ( '(' )
+            // InternalDataDSL.g:18214:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0()); 
             }
@@ -56887,16 +60508,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1"
-    // InternalDataDSL.g:17137:1: rule__XSwitchExpression__Group_2_0_0_0__1 : rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 ;
+    // InternalDataDSL.g:18223:1: rule__XSwitchExpression__Group_2_0_0_0__1 : rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17141:1: ( rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 )
-            // InternalDataDSL.g:17142:2: rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2
+            // InternalDataDSL.g:18227:1: ( rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2 )
+            // InternalDataDSL.g:18228:2: rule__XSwitchExpression__Group_2_0_0_0__1__Impl rule__XSwitchExpression__Group_2_0_0_0__2
             {
-            pushFollow(FOLLOW_135);
+            pushFollow(FOLLOW_143);
             rule__XSwitchExpression__Group_2_0_0_0__1__Impl();
 
             state._fsp--;
@@ -56925,23 +60546,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__1__Impl"
-    // InternalDataDSL.g:17149:1: rule__XSwitchExpression__Group_2_0_0_0__1__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) ;
+    // InternalDataDSL.g:18235:1: rule__XSwitchExpression__Group_2_0_0_0__1__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17153:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) )
-            // InternalDataDSL.g:17154:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            // InternalDataDSL.g:18239:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) ) )
+            // InternalDataDSL.g:18240:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
             {
-            // InternalDataDSL.g:17154:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
-            // InternalDataDSL.g:17155:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            // InternalDataDSL.g:18240:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 ) )
+            // InternalDataDSL.g:18241:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_0_0_0_1()); 
             }
-            // InternalDataDSL.g:17156:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
-            // InternalDataDSL.g:17156:3: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
+            // InternalDataDSL.g:18242:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 )
+            // InternalDataDSL.g:18242:3: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1();
@@ -56976,14 +60597,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2"
-    // InternalDataDSL.g:17164:1: rule__XSwitchExpression__Group_2_0_0_0__2 : rule__XSwitchExpression__Group_2_0_0_0__2__Impl ;
+    // InternalDataDSL.g:18250:1: rule__XSwitchExpression__Group_2_0_0_0__2 : rule__XSwitchExpression__Group_2_0_0_0__2__Impl ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17168:1: ( rule__XSwitchExpression__Group_2_0_0_0__2__Impl )
-            // InternalDataDSL.g:17169:2: rule__XSwitchExpression__Group_2_0_0_0__2__Impl
+            // InternalDataDSL.g:18254:1: ( rule__XSwitchExpression__Group_2_0_0_0__2__Impl )
+            // InternalDataDSL.g:18255:2: rule__XSwitchExpression__Group_2_0_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_0_0_0__2__Impl();
@@ -57009,22 +60630,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_0_0_0__2__Impl"
-    // InternalDataDSL.g:17175:1: rule__XSwitchExpression__Group_2_0_0_0__2__Impl : ( ':' ) ;
+    // InternalDataDSL.g:18261:1: rule__XSwitchExpression__Group_2_0_0_0__2__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_2_0_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17179:1: ( ( ':' ) )
-            // InternalDataDSL.g:17180:1: ( ':' )
+            // InternalDataDSL.g:18265:1: ( ( ':' ) )
+            // InternalDataDSL.g:18266:1: ( ':' )
             {
-            // InternalDataDSL.g:17180:1: ( ':' )
-            // InternalDataDSL.g:17181:2: ':'
+            // InternalDataDSL.g:18266:1: ( ':' )
+            // InternalDataDSL.g:18267:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); 
             }
-            match(input,132,FOLLOW_2); if (state.failed) return ;
+            match(input,138,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2()); 
             }
@@ -57050,16 +60671,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__0"
-    // InternalDataDSL.g:17191:1: rule__XSwitchExpression__Group_2_1__0 : rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 ;
+    // InternalDataDSL.g:18277:1: rule__XSwitchExpression__Group_2_1__0 : rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 ;
     public final void rule__XSwitchExpression__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17195:1: ( rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 )
-            // InternalDataDSL.g:17196:2: rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1
+            // InternalDataDSL.g:18281:1: ( rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1 )
+            // InternalDataDSL.g:18282:2: rule__XSwitchExpression__Group_2_1__0__Impl rule__XSwitchExpression__Group_2_1__1
             {
-            pushFollow(FOLLOW_132);
+            pushFollow(FOLLOW_140);
             rule__XSwitchExpression__Group_2_1__0__Impl();
 
             state._fsp--;
@@ -57088,27 +60709,27 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__0__Impl"
-    // InternalDataDSL.g:17203:1: rule__XSwitchExpression__Group_2_1__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) ;
+    // InternalDataDSL.g:18289:1: rule__XSwitchExpression__Group_2_1__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) ;
     public final void rule__XSwitchExpression__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17207:1: ( ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) )
-            // InternalDataDSL.g:17208:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            // InternalDataDSL.g:18293:1: ( ( ( rule__XSwitchExpression__Group_2_1_0__0 )? ) )
+            // InternalDataDSL.g:18294:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
             {
-            // InternalDataDSL.g:17208:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
-            // InternalDataDSL.g:17209:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            // InternalDataDSL.g:18294:1: ( ( rule__XSwitchExpression__Group_2_1_0__0 )? )
+            // InternalDataDSL.g:18295:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0()); 
             }
-            // InternalDataDSL.g:17210:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
-            int alt142=2;
-            alt142 = dfa142.predict(input);
-            switch (alt142) {
+            // InternalDataDSL.g:18296:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?
+            int alt147=2;
+            alt147 = dfa147.predict(input);
+            switch (alt147) {
                 case 1 :
-                    // InternalDataDSL.g:17210:3: rule__XSwitchExpression__Group_2_1_0__0
+                    // InternalDataDSL.g:18296:3: rule__XSwitchExpression__Group_2_1_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XSwitchExpression__Group_2_1_0__0();
@@ -57146,14 +60767,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__1"
-    // InternalDataDSL.g:17218:1: rule__XSwitchExpression__Group_2_1__1 : rule__XSwitchExpression__Group_2_1__1__Impl ;
+    // InternalDataDSL.g:18304:1: rule__XSwitchExpression__Group_2_1__1 : rule__XSwitchExpression__Group_2_1__1__Impl ;
     public final void rule__XSwitchExpression__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17222:1: ( rule__XSwitchExpression__Group_2_1__1__Impl )
-            // InternalDataDSL.g:17223:2: rule__XSwitchExpression__Group_2_1__1__Impl
+            // InternalDataDSL.g:18308:1: ( rule__XSwitchExpression__Group_2_1__1__Impl )
+            // InternalDataDSL.g:18309:2: rule__XSwitchExpression__Group_2_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1__1__Impl();
@@ -57179,23 +60800,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1__1__Impl"
-    // InternalDataDSL.g:17229:1: rule__XSwitchExpression__Group_2_1__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) ;
+    // InternalDataDSL.g:18315:1: rule__XSwitchExpression__Group_2_1__1__Impl : ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17233:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) )
-            // InternalDataDSL.g:17234:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            // InternalDataDSL.g:18319:1: ( ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) ) )
+            // InternalDataDSL.g:18320:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
             {
-            // InternalDataDSL.g:17234:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
-            // InternalDataDSL.g:17235:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            // InternalDataDSL.g:18320:1: ( ( rule__XSwitchExpression__SwitchAssignment_2_1_1 ) )
+            // InternalDataDSL.g:18321:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchAssignment_2_1_1()); 
             }
-            // InternalDataDSL.g:17236:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
-            // InternalDataDSL.g:17236:3: rule__XSwitchExpression__SwitchAssignment_2_1_1
+            // InternalDataDSL.g:18322:2: ( rule__XSwitchExpression__SwitchAssignment_2_1_1 )
+            // InternalDataDSL.g:18322:3: rule__XSwitchExpression__SwitchAssignment_2_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__SwitchAssignment_2_1_1();
@@ -57230,14 +60851,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0"
-    // InternalDataDSL.g:17245:1: rule__XSwitchExpression__Group_2_1_0__0 : rule__XSwitchExpression__Group_2_1_0__0__Impl ;
+    // InternalDataDSL.g:18331:1: rule__XSwitchExpression__Group_2_1_0__0 : rule__XSwitchExpression__Group_2_1_0__0__Impl ;
     public final void rule__XSwitchExpression__Group_2_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17249:1: ( rule__XSwitchExpression__Group_2_1_0__0__Impl )
-            // InternalDataDSL.g:17250:2: rule__XSwitchExpression__Group_2_1_0__0__Impl
+            // InternalDataDSL.g:18335:1: ( rule__XSwitchExpression__Group_2_1_0__0__Impl )
+            // InternalDataDSL.g:18336:2: rule__XSwitchExpression__Group_2_1_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0__0__Impl();
@@ -57263,23 +60884,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0__0__Impl"
-    // InternalDataDSL.g:17256:1: rule__XSwitchExpression__Group_2_1_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) ;
+    // InternalDataDSL.g:18342:1: rule__XSwitchExpression__Group_2_1_0__0__Impl : ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17260:1: ( ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) )
-            // InternalDataDSL.g:17261:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            // InternalDataDSL.g:18346:1: ( ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) ) )
+            // InternalDataDSL.g:18347:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
             {
-            // InternalDataDSL.g:17261:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
-            // InternalDataDSL.g:17262:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            // InternalDataDSL.g:18347:1: ( ( rule__XSwitchExpression__Group_2_1_0_0__0 ) )
+            // InternalDataDSL.g:18348:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_1_0_0()); 
             }
-            // InternalDataDSL.g:17263:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
-            // InternalDataDSL.g:17263:3: rule__XSwitchExpression__Group_2_1_0_0__0
+            // InternalDataDSL.g:18349:2: ( rule__XSwitchExpression__Group_2_1_0_0__0 )
+            // InternalDataDSL.g:18349:3: rule__XSwitchExpression__Group_2_1_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0_0__0();
@@ -57314,16 +60935,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0"
-    // InternalDataDSL.g:17272:1: rule__XSwitchExpression__Group_2_1_0_0__0 : rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 ;
+    // InternalDataDSL.g:18358:1: rule__XSwitchExpression__Group_2_1_0_0__0 : rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17276:1: ( rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 )
-            // InternalDataDSL.g:17277:2: rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1
+            // InternalDataDSL.g:18362:1: ( rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1 )
+            // InternalDataDSL.g:18363:2: rule__XSwitchExpression__Group_2_1_0_0__0__Impl rule__XSwitchExpression__Group_2_1_0_0__1
             {
-            pushFollow(FOLLOW_135);
+            pushFollow(FOLLOW_143);
             rule__XSwitchExpression__Group_2_1_0_0__0__Impl();
 
             state._fsp--;
@@ -57352,23 +60973,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__0__Impl"
-    // InternalDataDSL.g:17284:1: rule__XSwitchExpression__Group_2_1_0_0__0__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) ;
+    // InternalDataDSL.g:18370:1: rule__XSwitchExpression__Group_2_1_0_0__0__Impl : ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17288:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) )
-            // InternalDataDSL.g:17289:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            // InternalDataDSL.g:18374:1: ( ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) ) )
+            // InternalDataDSL.g:18375:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
             {
-            // InternalDataDSL.g:17289:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
-            // InternalDataDSL.g:17290:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            // InternalDataDSL.g:18375:1: ( ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 ) )
+            // InternalDataDSL.g:18376:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamAssignment_2_1_0_0_0()); 
             }
-            // InternalDataDSL.g:17291:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
-            // InternalDataDSL.g:17291:3: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
+            // InternalDataDSL.g:18377:2: ( rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 )
+            // InternalDataDSL.g:18377:3: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0();
@@ -57403,14 +61024,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1"
-    // InternalDataDSL.g:17299:1: rule__XSwitchExpression__Group_2_1_0_0__1 : rule__XSwitchExpression__Group_2_1_0_0__1__Impl ;
+    // InternalDataDSL.g:18385:1: rule__XSwitchExpression__Group_2_1_0_0__1 : rule__XSwitchExpression__Group_2_1_0_0__1__Impl ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17303:1: ( rule__XSwitchExpression__Group_2_1_0_0__1__Impl )
-            // InternalDataDSL.g:17304:2: rule__XSwitchExpression__Group_2_1_0_0__1__Impl
+            // InternalDataDSL.g:18389:1: ( rule__XSwitchExpression__Group_2_1_0_0__1__Impl )
+            // InternalDataDSL.g:18390:2: rule__XSwitchExpression__Group_2_1_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_2_1_0_0__1__Impl();
@@ -57436,22 +61057,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_2_1_0_0__1__Impl"
-    // InternalDataDSL.g:17310:1: rule__XSwitchExpression__Group_2_1_0_0__1__Impl : ( ':' ) ;
+    // InternalDataDSL.g:18396:1: rule__XSwitchExpression__Group_2_1_0_0__1__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_2_1_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17314:1: ( ( ':' ) )
-            // InternalDataDSL.g:17315:1: ( ':' )
+            // InternalDataDSL.g:18400:1: ( ( ':' ) )
+            // InternalDataDSL.g:18401:1: ( ':' )
             {
-            // InternalDataDSL.g:17315:1: ( ':' )
-            // InternalDataDSL.g:17316:2: ':'
+            // InternalDataDSL.g:18401:1: ( ':' )
+            // InternalDataDSL.g:18402:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); 
             }
-            match(input,132,FOLLOW_2); if (state.failed) return ;
+            match(input,138,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1()); 
             }
@@ -57477,16 +61098,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__0"
-    // InternalDataDSL.g:17326:1: rule__XSwitchExpression__Group_5__0 : rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 ;
+    // InternalDataDSL.g:18412:1: rule__XSwitchExpression__Group_5__0 : rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 ;
     public final void rule__XSwitchExpression__Group_5__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17330:1: ( rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 )
-            // InternalDataDSL.g:17331:2: rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1
+            // InternalDataDSL.g:18416:1: ( rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1 )
+            // InternalDataDSL.g:18417:2: rule__XSwitchExpression__Group_5__0__Impl rule__XSwitchExpression__Group_5__1
             {
-            pushFollow(FOLLOW_135);
+            pushFollow(FOLLOW_143);
             rule__XSwitchExpression__Group_5__0__Impl();
 
             state._fsp--;
@@ -57515,22 +61136,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__0__Impl"
-    // InternalDataDSL.g:17338:1: rule__XSwitchExpression__Group_5__0__Impl : ( 'default' ) ;
+    // InternalDataDSL.g:18424:1: rule__XSwitchExpression__Group_5__0__Impl : ( 'default' ) ;
     public final void rule__XSwitchExpression__Group_5__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17342:1: ( ( 'default' ) )
-            // InternalDataDSL.g:17343:1: ( 'default' )
+            // InternalDataDSL.g:18428:1: ( ( 'default' ) )
+            // InternalDataDSL.g:18429:1: ( 'default' )
             {
-            // InternalDataDSL.g:17343:1: ( 'default' )
-            // InternalDataDSL.g:17344:2: 'default'
+            // InternalDataDSL.g:18429:1: ( 'default' )
+            // InternalDataDSL.g:18430:2: 'default'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); 
             }
-            match(input,133,FOLLOW_2); if (state.failed) return ;
+            match(input,139,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0()); 
             }
@@ -57556,16 +61177,16 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__1"
-    // InternalDataDSL.g:17353:1: rule__XSwitchExpression__Group_5__1 : rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 ;
+    // InternalDataDSL.g:18439:1: rule__XSwitchExpression__Group_5__1 : rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 ;
     public final void rule__XSwitchExpression__Group_5__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17357:1: ( rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 )
-            // InternalDataDSL.g:17358:2: rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2
+            // InternalDataDSL.g:18443:1: ( rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2 )
+            // InternalDataDSL.g:18444:2: rule__XSwitchExpression__Group_5__1__Impl rule__XSwitchExpression__Group_5__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XSwitchExpression__Group_5__1__Impl();
 
             state._fsp--;
@@ -57594,22 +61215,22 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__1__Impl"
-    // InternalDataDSL.g:17365:1: rule__XSwitchExpression__Group_5__1__Impl : ( ':' ) ;
+    // InternalDataDSL.g:18451:1: rule__XSwitchExpression__Group_5__1__Impl : ( ':' ) ;
     public final void rule__XSwitchExpression__Group_5__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17369:1: ( ( ':' ) )
-            // InternalDataDSL.g:17370:1: ( ':' )
+            // InternalDataDSL.g:18455:1: ( ( ':' ) )
+            // InternalDataDSL.g:18456:1: ( ':' )
             {
-            // InternalDataDSL.g:17370:1: ( ':' )
-            // InternalDataDSL.g:17371:2: ':'
+            // InternalDataDSL.g:18456:1: ( ':' )
+            // InternalDataDSL.g:18457:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); 
             }
-            match(input,132,FOLLOW_2); if (state.failed) return ;
+            match(input,138,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1()); 
             }
@@ -57635,14 +61256,14 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__2"
-    // InternalDataDSL.g:17380:1: rule__XSwitchExpression__Group_5__2 : rule__XSwitchExpression__Group_5__2__Impl ;
+    // InternalDataDSL.g:18466:1: rule__XSwitchExpression__Group_5__2 : rule__XSwitchExpression__Group_5__2__Impl ;
     public final void rule__XSwitchExpression__Group_5__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17384:1: ( rule__XSwitchExpression__Group_5__2__Impl )
-            // InternalDataDSL.g:17385:2: rule__XSwitchExpression__Group_5__2__Impl
+            // InternalDataDSL.g:18470:1: ( rule__XSwitchExpression__Group_5__2__Impl )
+            // InternalDataDSL.g:18471:2: rule__XSwitchExpression__Group_5__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__Group_5__2__Impl();
@@ -57668,23 +61289,23 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__Group_5__2__Impl"
-    // InternalDataDSL.g:17391:1: rule__XSwitchExpression__Group_5__2__Impl : ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) ;
+    // InternalDataDSL.g:18477:1: rule__XSwitchExpression__Group_5__2__Impl : ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) ;
     public final void rule__XSwitchExpression__Group_5__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17395:1: ( ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) )
-            // InternalDataDSL.g:17396:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            // InternalDataDSL.g:18481:1: ( ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) ) )
+            // InternalDataDSL.g:18482:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
             {
-            // InternalDataDSL.g:17396:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
-            // InternalDataDSL.g:17397:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            // InternalDataDSL.g:18482:1: ( ( rule__XSwitchExpression__DefaultAssignment_5_2 ) )
+            // InternalDataDSL.g:18483:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultAssignment_5_2()); 
             }
-            // InternalDataDSL.g:17398:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
-            // InternalDataDSL.g:17398:3: rule__XSwitchExpression__DefaultAssignment_5_2
+            // InternalDataDSL.g:18484:2: ( rule__XSwitchExpression__DefaultAssignment_5_2 )
+            // InternalDataDSL.g:18484:3: rule__XSwitchExpression__DefaultAssignment_5_2
             {
             pushFollow(FOLLOW_2);
             rule__XSwitchExpression__DefaultAssignment_5_2();
@@ -57719,16 +61340,16 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__0"
-    // InternalDataDSL.g:17407:1: rule__XCasePart__Group__0 : rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 ;
+    // InternalDataDSL.g:18493:1: rule__XCasePart__Group__0 : rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 ;
     public final void rule__XCasePart__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17411:1: ( rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 )
-            // InternalDataDSL.g:17412:2: rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1
+            // InternalDataDSL.g:18497:1: ( rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1 )
+            // InternalDataDSL.g:18498:2: rule__XCasePart__Group__0__Impl rule__XCasePart__Group__1
             {
-            pushFollow(FOLLOW_136);
+            pushFollow(FOLLOW_144);
             rule__XCasePart__Group__0__Impl();
 
             state._fsp--;
@@ -57757,23 +61378,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__0__Impl"
-    // InternalDataDSL.g:17419:1: rule__XCasePart__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:18505:1: rule__XCasePart__Group__0__Impl : ( () ) ;
     public final void rule__XCasePart__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17423:1: ( ( () ) )
-            // InternalDataDSL.g:17424:1: ( () )
+            // InternalDataDSL.g:18509:1: ( ( () ) )
+            // InternalDataDSL.g:18510:1: ( () )
             {
-            // InternalDataDSL.g:17424:1: ( () )
-            // InternalDataDSL.g:17425:2: ()
+            // InternalDataDSL.g:18510:1: ( () )
+            // InternalDataDSL.g:18511:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getXCasePartAction_0()); 
             }
-            // InternalDataDSL.g:17426:2: ()
-            // InternalDataDSL.g:17426:3: 
+            // InternalDataDSL.g:18512:2: ()
+            // InternalDataDSL.g:18512:3: 
             {
             }
 
@@ -57798,16 +61419,16 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__1"
-    // InternalDataDSL.g:17434:1: rule__XCasePart__Group__1 : rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 ;
+    // InternalDataDSL.g:18520:1: rule__XCasePart__Group__1 : rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 ;
     public final void rule__XCasePart__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17438:1: ( rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 )
-            // InternalDataDSL.g:17439:2: rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2
+            // InternalDataDSL.g:18524:1: ( rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2 )
+            // InternalDataDSL.g:18525:2: rule__XCasePart__Group__1__Impl rule__XCasePart__Group__2
             {
-            pushFollow(FOLLOW_136);
+            pushFollow(FOLLOW_144);
             rule__XCasePart__Group__1__Impl();
 
             state._fsp--;
@@ -57836,31 +61457,31 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__1__Impl"
-    // InternalDataDSL.g:17446:1: rule__XCasePart__Group__1__Impl : ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) ;
+    // InternalDataDSL.g:18532:1: rule__XCasePart__Group__1__Impl : ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) ;
     public final void rule__XCasePart__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17450:1: ( ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) )
-            // InternalDataDSL.g:17451:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            // InternalDataDSL.g:18536:1: ( ( ( rule__XCasePart__TypeGuardAssignment_1 )? ) )
+            // InternalDataDSL.g:18537:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
             {
-            // InternalDataDSL.g:17451:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
-            // InternalDataDSL.g:17452:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            // InternalDataDSL.g:18537:1: ( ( rule__XCasePart__TypeGuardAssignment_1 )? )
+            // InternalDataDSL.g:18538:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getTypeGuardAssignment_1()); 
             }
-            // InternalDataDSL.g:17453:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
-            int alt143=2;
-            int LA143_0 = input.LA(1);
+            // InternalDataDSL.g:18539:2: ( rule__XCasePart__TypeGuardAssignment_1 )?
+            int alt148=2;
+            int LA148_0 = input.LA(1);
 
-            if ( (LA143_0==RULE_ID||LA143_0==31||LA143_0==122) ) {
-                alt143=1;
+            if ( (LA148_0==RULE_ID||LA148_0==31||LA148_0==128) ) {
+                alt148=1;
             }
-            switch (alt143) {
+            switch (alt148) {
                 case 1 :
-                    // InternalDataDSL.g:17453:3: rule__XCasePart__TypeGuardAssignment_1
+                    // InternalDataDSL.g:18539:3: rule__XCasePart__TypeGuardAssignment_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__TypeGuardAssignment_1();
@@ -57898,16 +61519,16 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__2"
-    // InternalDataDSL.g:17461:1: rule__XCasePart__Group__2 : rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 ;
+    // InternalDataDSL.g:18547:1: rule__XCasePart__Group__2 : rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 ;
     public final void rule__XCasePart__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17465:1: ( rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 )
-            // InternalDataDSL.g:17466:2: rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3
+            // InternalDataDSL.g:18551:1: ( rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3 )
+            // InternalDataDSL.g:18552:2: rule__XCasePart__Group__2__Impl rule__XCasePart__Group__3
             {
-            pushFollow(FOLLOW_136);
+            pushFollow(FOLLOW_144);
             rule__XCasePart__Group__2__Impl();
 
             state._fsp--;
@@ -57936,31 +61557,31 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__2__Impl"
-    // InternalDataDSL.g:17473:1: rule__XCasePart__Group__2__Impl : ( ( rule__XCasePart__Group_2__0 )? ) ;
+    // InternalDataDSL.g:18559:1: rule__XCasePart__Group__2__Impl : ( ( rule__XCasePart__Group_2__0 )? ) ;
     public final void rule__XCasePart__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17477:1: ( ( ( rule__XCasePart__Group_2__0 )? ) )
-            // InternalDataDSL.g:17478:1: ( ( rule__XCasePart__Group_2__0 )? )
+            // InternalDataDSL.g:18563:1: ( ( ( rule__XCasePart__Group_2__0 )? ) )
+            // InternalDataDSL.g:18564:1: ( ( rule__XCasePart__Group_2__0 )? )
             {
-            // InternalDataDSL.g:17478:1: ( ( rule__XCasePart__Group_2__0 )? )
-            // InternalDataDSL.g:17479:2: ( rule__XCasePart__Group_2__0 )?
+            // InternalDataDSL.g:18564:1: ( ( rule__XCasePart__Group_2__0 )? )
+            // InternalDataDSL.g:18565:2: ( rule__XCasePart__Group_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getGroup_2()); 
             }
-            // InternalDataDSL.g:17480:2: ( rule__XCasePart__Group_2__0 )?
-            int alt144=2;
-            int LA144_0 = input.LA(1);
+            // InternalDataDSL.g:18566:2: ( rule__XCasePart__Group_2__0 )?
+            int alt149=2;
+            int LA149_0 = input.LA(1);
 
-            if ( (LA144_0==134) ) {
-                alt144=1;
+            if ( (LA149_0==140) ) {
+                alt149=1;
             }
-            switch (alt144) {
+            switch (alt149) {
                 case 1 :
-                    // InternalDataDSL.g:17480:3: rule__XCasePart__Group_2__0
+                    // InternalDataDSL.g:18566:3: rule__XCasePart__Group_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XCasePart__Group_2__0();
@@ -57998,14 +61619,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__3"
-    // InternalDataDSL.g:17488:1: rule__XCasePart__Group__3 : rule__XCasePart__Group__3__Impl ;
+    // InternalDataDSL.g:18574:1: rule__XCasePart__Group__3 : rule__XCasePart__Group__3__Impl ;
     public final void rule__XCasePart__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17492:1: ( rule__XCasePart__Group__3__Impl )
-            // InternalDataDSL.g:17493:2: rule__XCasePart__Group__3__Impl
+            // InternalDataDSL.g:18578:1: ( rule__XCasePart__Group__3__Impl )
+            // InternalDataDSL.g:18579:2: rule__XCasePart__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group__3__Impl();
@@ -58031,23 +61652,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group__3__Impl"
-    // InternalDataDSL.g:17499:1: rule__XCasePart__Group__3__Impl : ( ( rule__XCasePart__Alternatives_3 ) ) ;
+    // InternalDataDSL.g:18585:1: rule__XCasePart__Group__3__Impl : ( ( rule__XCasePart__Alternatives_3 ) ) ;
     public final void rule__XCasePart__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17503:1: ( ( ( rule__XCasePart__Alternatives_3 ) ) )
-            // InternalDataDSL.g:17504:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            // InternalDataDSL.g:18589:1: ( ( ( rule__XCasePart__Alternatives_3 ) ) )
+            // InternalDataDSL.g:18590:1: ( ( rule__XCasePart__Alternatives_3 ) )
             {
-            // InternalDataDSL.g:17504:1: ( ( rule__XCasePart__Alternatives_3 ) )
-            // InternalDataDSL.g:17505:2: ( rule__XCasePart__Alternatives_3 )
+            // InternalDataDSL.g:18590:1: ( ( rule__XCasePart__Alternatives_3 ) )
+            // InternalDataDSL.g:18591:2: ( rule__XCasePart__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getAlternatives_3()); 
             }
-            // InternalDataDSL.g:17506:2: ( rule__XCasePart__Alternatives_3 )
-            // InternalDataDSL.g:17506:3: rule__XCasePart__Alternatives_3
+            // InternalDataDSL.g:18592:2: ( rule__XCasePart__Alternatives_3 )
+            // InternalDataDSL.g:18592:3: rule__XCasePart__Alternatives_3
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Alternatives_3();
@@ -58082,16 +61703,16 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__0"
-    // InternalDataDSL.g:17515:1: rule__XCasePart__Group_2__0 : rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 ;
+    // InternalDataDSL.g:18601:1: rule__XCasePart__Group_2__0 : rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 ;
     public final void rule__XCasePart__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17519:1: ( rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 )
-            // InternalDataDSL.g:17520:2: rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1
+            // InternalDataDSL.g:18605:1: ( rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1 )
+            // InternalDataDSL.g:18606:2: rule__XCasePart__Group_2__0__Impl rule__XCasePart__Group_2__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XCasePart__Group_2__0__Impl();
 
             state._fsp--;
@@ -58120,22 +61741,22 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__0__Impl"
-    // InternalDataDSL.g:17527:1: rule__XCasePart__Group_2__0__Impl : ( 'case' ) ;
+    // InternalDataDSL.g:18613:1: rule__XCasePart__Group_2__0__Impl : ( 'case' ) ;
     public final void rule__XCasePart__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17531:1: ( ( 'case' ) )
-            // InternalDataDSL.g:17532:1: ( 'case' )
+            // InternalDataDSL.g:18617:1: ( ( 'case' ) )
+            // InternalDataDSL.g:18618:1: ( 'case' )
             {
-            // InternalDataDSL.g:17532:1: ( 'case' )
-            // InternalDataDSL.g:17533:2: 'case'
+            // InternalDataDSL.g:18618:1: ( 'case' )
+            // InternalDataDSL.g:18619:2: 'case'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); 
             }
-            match(input,134,FOLLOW_2); if (state.failed) return ;
+            match(input,140,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCasePartAccess().getCaseKeyword_2_0()); 
             }
@@ -58161,14 +61782,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__1"
-    // InternalDataDSL.g:17542:1: rule__XCasePart__Group_2__1 : rule__XCasePart__Group_2__1__Impl ;
+    // InternalDataDSL.g:18628:1: rule__XCasePart__Group_2__1 : rule__XCasePart__Group_2__1__Impl ;
     public final void rule__XCasePart__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17546:1: ( rule__XCasePart__Group_2__1__Impl )
-            // InternalDataDSL.g:17547:2: rule__XCasePart__Group_2__1__Impl
+            // InternalDataDSL.g:18632:1: ( rule__XCasePart__Group_2__1__Impl )
+            // InternalDataDSL.g:18633:2: rule__XCasePart__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group_2__1__Impl();
@@ -58194,23 +61815,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_2__1__Impl"
-    // InternalDataDSL.g:17553:1: rule__XCasePart__Group_2__1__Impl : ( ( rule__XCasePart__CaseAssignment_2_1 ) ) ;
+    // InternalDataDSL.g:18639:1: rule__XCasePart__Group_2__1__Impl : ( ( rule__XCasePart__CaseAssignment_2_1 ) ) ;
     public final void rule__XCasePart__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17557:1: ( ( ( rule__XCasePart__CaseAssignment_2_1 ) ) )
-            // InternalDataDSL.g:17558:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            // InternalDataDSL.g:18643:1: ( ( ( rule__XCasePart__CaseAssignment_2_1 ) ) )
+            // InternalDataDSL.g:18644:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
             {
-            // InternalDataDSL.g:17558:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
-            // InternalDataDSL.g:17559:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            // InternalDataDSL.g:18644:1: ( ( rule__XCasePart__CaseAssignment_2_1 ) )
+            // InternalDataDSL.g:18645:2: ( rule__XCasePart__CaseAssignment_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseAssignment_2_1()); 
             }
-            // InternalDataDSL.g:17560:2: ( rule__XCasePart__CaseAssignment_2_1 )
-            // InternalDataDSL.g:17560:3: rule__XCasePart__CaseAssignment_2_1
+            // InternalDataDSL.g:18646:2: ( rule__XCasePart__CaseAssignment_2_1 )
+            // InternalDataDSL.g:18646:3: rule__XCasePart__CaseAssignment_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__CaseAssignment_2_1();
@@ -58245,16 +61866,16 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__0"
-    // InternalDataDSL.g:17569:1: rule__XCasePart__Group_3_0__0 : rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 ;
+    // InternalDataDSL.g:18655:1: rule__XCasePart__Group_3_0__0 : rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 ;
     public final void rule__XCasePart__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17573:1: ( rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 )
-            // InternalDataDSL.g:17574:2: rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1
+            // InternalDataDSL.g:18659:1: ( rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1 )
+            // InternalDataDSL.g:18660:2: rule__XCasePart__Group_3_0__0__Impl rule__XCasePart__Group_3_0__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XCasePart__Group_3_0__0__Impl();
 
             state._fsp--;
@@ -58283,22 +61904,22 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__0__Impl"
-    // InternalDataDSL.g:17581:1: rule__XCasePart__Group_3_0__0__Impl : ( ':' ) ;
+    // InternalDataDSL.g:18667:1: rule__XCasePart__Group_3_0__0__Impl : ( ':' ) ;
     public final void rule__XCasePart__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17585:1: ( ( ':' ) )
-            // InternalDataDSL.g:17586:1: ( ':' )
+            // InternalDataDSL.g:18671:1: ( ( ':' ) )
+            // InternalDataDSL.g:18672:1: ( ':' )
             {
-            // InternalDataDSL.g:17586:1: ( ':' )
-            // InternalDataDSL.g:17587:2: ':'
+            // InternalDataDSL.g:18672:1: ( ':' )
+            // InternalDataDSL.g:18673:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); 
             }
-            match(input,132,FOLLOW_2); if (state.failed) return ;
+            match(input,138,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0()); 
             }
@@ -58324,14 +61945,14 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__1"
-    // InternalDataDSL.g:17596:1: rule__XCasePart__Group_3_0__1 : rule__XCasePart__Group_3_0__1__Impl ;
+    // InternalDataDSL.g:18682:1: rule__XCasePart__Group_3_0__1 : rule__XCasePart__Group_3_0__1__Impl ;
     public final void rule__XCasePart__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17600:1: ( rule__XCasePart__Group_3_0__1__Impl )
-            // InternalDataDSL.g:17601:2: rule__XCasePart__Group_3_0__1__Impl
+            // InternalDataDSL.g:18686:1: ( rule__XCasePart__Group_3_0__1__Impl )
+            // InternalDataDSL.g:18687:2: rule__XCasePart__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__Group_3_0__1__Impl();
@@ -58357,23 +61978,23 @@
 
 
     // $ANTLR start "rule__XCasePart__Group_3_0__1__Impl"
-    // InternalDataDSL.g:17607:1: rule__XCasePart__Group_3_0__1__Impl : ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) ;
+    // InternalDataDSL.g:18693:1: rule__XCasePart__Group_3_0__1__Impl : ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) ;
     public final void rule__XCasePart__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17611:1: ( ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) )
-            // InternalDataDSL.g:17612:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            // InternalDataDSL.g:18697:1: ( ( ( rule__XCasePart__ThenAssignment_3_0_1 ) ) )
+            // InternalDataDSL.g:18698:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
             {
-            // InternalDataDSL.g:17612:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
-            // InternalDataDSL.g:17613:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            // InternalDataDSL.g:18698:1: ( ( rule__XCasePart__ThenAssignment_3_0_1 ) )
+            // InternalDataDSL.g:18699:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getThenAssignment_3_0_1()); 
             }
-            // InternalDataDSL.g:17614:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
-            // InternalDataDSL.g:17614:3: rule__XCasePart__ThenAssignment_3_0_1
+            // InternalDataDSL.g:18700:2: ( rule__XCasePart__ThenAssignment_3_0_1 )
+            // InternalDataDSL.g:18700:3: rule__XCasePart__ThenAssignment_3_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XCasePart__ThenAssignment_3_0_1();
@@ -58408,16 +62029,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__0"
-    // InternalDataDSL.g:17623:1: rule__XForLoopExpression__Group__0 : rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 ;
+    // InternalDataDSL.g:18709:1: rule__XForLoopExpression__Group__0 : rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 ;
     public final void rule__XForLoopExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17627:1: ( rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 )
-            // InternalDataDSL.g:17628:2: rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1
+            // InternalDataDSL.g:18713:1: ( rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1 )
+            // InternalDataDSL.g:18714:2: rule__XForLoopExpression__Group__0__Impl rule__XForLoopExpression__Group__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XForLoopExpression__Group__0__Impl();
 
             state._fsp--;
@@ -58446,23 +62067,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__0__Impl"
-    // InternalDataDSL.g:17635:1: rule__XForLoopExpression__Group__0__Impl : ( ( rule__XForLoopExpression__Group_0__0 ) ) ;
+    // InternalDataDSL.g:18721:1: rule__XForLoopExpression__Group__0__Impl : ( ( rule__XForLoopExpression__Group_0__0 ) ) ;
     public final void rule__XForLoopExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17639:1: ( ( ( rule__XForLoopExpression__Group_0__0 ) ) )
-            // InternalDataDSL.g:17640:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            // InternalDataDSL.g:18725:1: ( ( ( rule__XForLoopExpression__Group_0__0 ) ) )
+            // InternalDataDSL.g:18726:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
             {
-            // InternalDataDSL.g:17640:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
-            // InternalDataDSL.g:17641:2: ( rule__XForLoopExpression__Group_0__0 )
+            // InternalDataDSL.g:18726:1: ( ( rule__XForLoopExpression__Group_0__0 ) )
+            // InternalDataDSL.g:18727:2: ( rule__XForLoopExpression__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:17642:2: ( rule__XForLoopExpression__Group_0__0 )
-            // InternalDataDSL.g:17642:3: rule__XForLoopExpression__Group_0__0
+            // InternalDataDSL.g:18728:2: ( rule__XForLoopExpression__Group_0__0 )
+            // InternalDataDSL.g:18728:3: rule__XForLoopExpression__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0__0();
@@ -58497,16 +62118,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__1"
-    // InternalDataDSL.g:17650:1: rule__XForLoopExpression__Group__1 : rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 ;
+    // InternalDataDSL.g:18736:1: rule__XForLoopExpression__Group__1 : rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 ;
     public final void rule__XForLoopExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17654:1: ( rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 )
-            // InternalDataDSL.g:17655:2: rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2
+            // InternalDataDSL.g:18740:1: ( rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2 )
+            // InternalDataDSL.g:18741:2: rule__XForLoopExpression__Group__1__Impl rule__XForLoopExpression__Group__2
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XForLoopExpression__Group__1__Impl();
 
             state._fsp--;
@@ -58535,23 +62156,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__1__Impl"
-    // InternalDataDSL.g:17662:1: rule__XForLoopExpression__Group__1__Impl : ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) ;
+    // InternalDataDSL.g:18748:1: rule__XForLoopExpression__Group__1__Impl : ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) ;
     public final void rule__XForLoopExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17666:1: ( ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) )
-            // InternalDataDSL.g:17667:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            // InternalDataDSL.g:18752:1: ( ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) ) )
+            // InternalDataDSL.g:18753:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
             {
-            // InternalDataDSL.g:17667:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
-            // InternalDataDSL.g:17668:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            // InternalDataDSL.g:18753:1: ( ( rule__XForLoopExpression__ForExpressionAssignment_1 ) )
+            // InternalDataDSL.g:18754:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForExpressionAssignment_1()); 
             }
-            // InternalDataDSL.g:17669:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
-            // InternalDataDSL.g:17669:3: rule__XForLoopExpression__ForExpressionAssignment_1
+            // InternalDataDSL.g:18755:2: ( rule__XForLoopExpression__ForExpressionAssignment_1 )
+            // InternalDataDSL.g:18755:3: rule__XForLoopExpression__ForExpressionAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__ForExpressionAssignment_1();
@@ -58586,16 +62207,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__2"
-    // InternalDataDSL.g:17677:1: rule__XForLoopExpression__Group__2 : rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 ;
+    // InternalDataDSL.g:18763:1: rule__XForLoopExpression__Group__2 : rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 ;
     public final void rule__XForLoopExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17681:1: ( rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 )
-            // InternalDataDSL.g:17682:2: rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3
+            // InternalDataDSL.g:18767:1: ( rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3 )
+            // InternalDataDSL.g:18768:2: rule__XForLoopExpression__Group__2__Impl rule__XForLoopExpression__Group__3
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XForLoopExpression__Group__2__Impl();
 
             state._fsp--;
@@ -58624,22 +62245,22 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__2__Impl"
-    // InternalDataDSL.g:17689:1: rule__XForLoopExpression__Group__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:18775:1: rule__XForLoopExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XForLoopExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17693:1: ( ( ')' ) )
-            // InternalDataDSL.g:17694:1: ( ')' )
+            // InternalDataDSL.g:18779:1: ( ( ')' ) )
+            // InternalDataDSL.g:18780:1: ( ')' )
             {
-            // InternalDataDSL.g:17694:1: ( ')' )
-            // InternalDataDSL.g:17695:2: ')'
+            // InternalDataDSL.g:18780:1: ( ')' )
+            // InternalDataDSL.g:18781:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2()); 
             }
@@ -58665,14 +62286,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__3"
-    // InternalDataDSL.g:17704:1: rule__XForLoopExpression__Group__3 : rule__XForLoopExpression__Group__3__Impl ;
+    // InternalDataDSL.g:18790:1: rule__XForLoopExpression__Group__3 : rule__XForLoopExpression__Group__3__Impl ;
     public final void rule__XForLoopExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17708:1: ( rule__XForLoopExpression__Group__3__Impl )
-            // InternalDataDSL.g:17709:2: rule__XForLoopExpression__Group__3__Impl
+            // InternalDataDSL.g:18794:1: ( rule__XForLoopExpression__Group__3__Impl )
+            // InternalDataDSL.g:18795:2: rule__XForLoopExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group__3__Impl();
@@ -58698,23 +62319,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group__3__Impl"
-    // InternalDataDSL.g:17715:1: rule__XForLoopExpression__Group__3__Impl : ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) ;
+    // InternalDataDSL.g:18801:1: rule__XForLoopExpression__Group__3__Impl : ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) ;
     public final void rule__XForLoopExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17719:1: ( ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) )
-            // InternalDataDSL.g:17720:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            // InternalDataDSL.g:18805:1: ( ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) ) )
+            // InternalDataDSL.g:18806:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
             {
-            // InternalDataDSL.g:17720:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
-            // InternalDataDSL.g:17721:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            // InternalDataDSL.g:18806:1: ( ( rule__XForLoopExpression__EachExpressionAssignment_3 ) )
+            // InternalDataDSL.g:18807:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionAssignment_3()); 
             }
-            // InternalDataDSL.g:17722:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
-            // InternalDataDSL.g:17722:3: rule__XForLoopExpression__EachExpressionAssignment_3
+            // InternalDataDSL.g:18808:2: ( rule__XForLoopExpression__EachExpressionAssignment_3 )
+            // InternalDataDSL.g:18808:3: rule__XForLoopExpression__EachExpressionAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__EachExpressionAssignment_3();
@@ -58749,14 +62370,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0__0"
-    // InternalDataDSL.g:17731:1: rule__XForLoopExpression__Group_0__0 : rule__XForLoopExpression__Group_0__0__Impl ;
+    // InternalDataDSL.g:18817:1: rule__XForLoopExpression__Group_0__0 : rule__XForLoopExpression__Group_0__0__Impl ;
     public final void rule__XForLoopExpression__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17735:1: ( rule__XForLoopExpression__Group_0__0__Impl )
-            // InternalDataDSL.g:17736:2: rule__XForLoopExpression__Group_0__0__Impl
+            // InternalDataDSL.g:18821:1: ( rule__XForLoopExpression__Group_0__0__Impl )
+            // InternalDataDSL.g:18822:2: rule__XForLoopExpression__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0__0__Impl();
@@ -58782,23 +62403,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0__0__Impl"
-    // InternalDataDSL.g:17742:1: rule__XForLoopExpression__Group_0__0__Impl : ( ( rule__XForLoopExpression__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:18828:1: rule__XForLoopExpression__Group_0__0__Impl : ( ( rule__XForLoopExpression__Group_0_0__0 ) ) ;
     public final void rule__XForLoopExpression__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17746:1: ( ( ( rule__XForLoopExpression__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:17747:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            // InternalDataDSL.g:18832:1: ( ( ( rule__XForLoopExpression__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:18833:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:17747:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
-            // InternalDataDSL.g:17748:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            // InternalDataDSL.g:18833:1: ( ( rule__XForLoopExpression__Group_0_0__0 ) )
+            // InternalDataDSL.g:18834:2: ( rule__XForLoopExpression__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:17749:2: ( rule__XForLoopExpression__Group_0_0__0 )
-            // InternalDataDSL.g:17749:3: rule__XForLoopExpression__Group_0_0__0
+            // InternalDataDSL.g:18835:2: ( rule__XForLoopExpression__Group_0_0__0 )
+            // InternalDataDSL.g:18835:3: rule__XForLoopExpression__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0_0__0();
@@ -58833,16 +62454,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__0"
-    // InternalDataDSL.g:17758:1: rule__XForLoopExpression__Group_0_0__0 : rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 ;
+    // InternalDataDSL.g:18844:1: rule__XForLoopExpression__Group_0_0__0 : rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 ;
     public final void rule__XForLoopExpression__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17762:1: ( rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 )
-            // InternalDataDSL.g:17763:2: rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1
+            // InternalDataDSL.g:18848:1: ( rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1 )
+            // InternalDataDSL.g:18849:2: rule__XForLoopExpression__Group_0_0__0__Impl rule__XForLoopExpression__Group_0_0__1
             {
-            pushFollow(FOLLOW_45);
+            pushFollow(FOLLOW_46);
             rule__XForLoopExpression__Group_0_0__0__Impl();
 
             state._fsp--;
@@ -58871,23 +62492,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__0__Impl"
-    // InternalDataDSL.g:17770:1: rule__XForLoopExpression__Group_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:18856:1: rule__XForLoopExpression__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XForLoopExpression__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17774:1: ( ( () ) )
-            // InternalDataDSL.g:17775:1: ( () )
+            // InternalDataDSL.g:18860:1: ( ( () ) )
+            // InternalDataDSL.g:18861:1: ( () )
             {
-            // InternalDataDSL.g:17775:1: ( () )
-            // InternalDataDSL.g:17776:2: ()
+            // InternalDataDSL.g:18861:1: ( () )
+            // InternalDataDSL.g:18862:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getXForLoopExpressionAction_0_0_0()); 
             }
-            // InternalDataDSL.g:17777:2: ()
-            // InternalDataDSL.g:17777:3: 
+            // InternalDataDSL.g:18863:2: ()
+            // InternalDataDSL.g:18863:3: 
             {
             }
 
@@ -58912,16 +62533,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__1"
-    // InternalDataDSL.g:17785:1: rule__XForLoopExpression__Group_0_0__1 : rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 ;
+    // InternalDataDSL.g:18871:1: rule__XForLoopExpression__Group_0_0__1 : rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 ;
     public final void rule__XForLoopExpression__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17789:1: ( rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 )
-            // InternalDataDSL.g:17790:2: rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2
+            // InternalDataDSL.g:18875:1: ( rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2 )
+            // InternalDataDSL.g:18876:2: rule__XForLoopExpression__Group_0_0__1__Impl rule__XForLoopExpression__Group_0_0__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XForLoopExpression__Group_0_0__1__Impl();
 
             state._fsp--;
@@ -58950,22 +62571,22 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__1__Impl"
-    // InternalDataDSL.g:17797:1: rule__XForLoopExpression__Group_0_0__1__Impl : ( 'for' ) ;
+    // InternalDataDSL.g:18883:1: rule__XForLoopExpression__Group_0_0__1__Impl : ( 'for' ) ;
     public final void rule__XForLoopExpression__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17801:1: ( ( 'for' ) )
-            // InternalDataDSL.g:17802:1: ( 'for' )
+            // InternalDataDSL.g:18887:1: ( ( 'for' ) )
+            // InternalDataDSL.g:18888:1: ( 'for' )
             {
-            // InternalDataDSL.g:17802:1: ( 'for' )
-            // InternalDataDSL.g:17803:2: 'for'
+            // InternalDataDSL.g:18888:1: ( 'for' )
+            // InternalDataDSL.g:18889:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); 
             }
-            match(input,101,FOLLOW_2); if (state.failed) return ;
+            match(input,103,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1()); 
             }
@@ -58991,16 +62612,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__2"
-    // InternalDataDSL.g:17812:1: rule__XForLoopExpression__Group_0_0__2 : rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 ;
+    // InternalDataDSL.g:18898:1: rule__XForLoopExpression__Group_0_0__2 : rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 ;
     public final void rule__XForLoopExpression__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17816:1: ( rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 )
-            // InternalDataDSL.g:17817:2: rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3
+            // InternalDataDSL.g:18902:1: ( rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3 )
+            // InternalDataDSL.g:18903:2: rule__XForLoopExpression__Group_0_0__2__Impl rule__XForLoopExpression__Group_0_0__3
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XForLoopExpression__Group_0_0__2__Impl();
 
             state._fsp--;
@@ -59029,22 +62650,22 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__2__Impl"
-    // InternalDataDSL.g:17824:1: rule__XForLoopExpression__Group_0_0__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:18910:1: rule__XForLoopExpression__Group_0_0__2__Impl : ( '(' ) ;
     public final void rule__XForLoopExpression__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17828:1: ( ( '(' ) )
-            // InternalDataDSL.g:17829:1: ( '(' )
+            // InternalDataDSL.g:18914:1: ( ( '(' ) )
+            // InternalDataDSL.g:18915:1: ( '(' )
             {
-            // InternalDataDSL.g:17829:1: ( '(' )
-            // InternalDataDSL.g:17830:2: '('
+            // InternalDataDSL.g:18915:1: ( '(' )
+            // InternalDataDSL.g:18916:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
             }
@@ -59070,16 +62691,16 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__3"
-    // InternalDataDSL.g:17839:1: rule__XForLoopExpression__Group_0_0__3 : rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 ;
+    // InternalDataDSL.g:18925:1: rule__XForLoopExpression__Group_0_0__3 : rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 ;
     public final void rule__XForLoopExpression__Group_0_0__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17843:1: ( rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 )
-            // InternalDataDSL.g:17844:2: rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4
+            // InternalDataDSL.g:18929:1: ( rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4 )
+            // InternalDataDSL.g:18930:2: rule__XForLoopExpression__Group_0_0__3__Impl rule__XForLoopExpression__Group_0_0__4
             {
-            pushFollow(FOLLOW_135);
+            pushFollow(FOLLOW_143);
             rule__XForLoopExpression__Group_0_0__3__Impl();
 
             state._fsp--;
@@ -59108,23 +62729,23 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__3__Impl"
-    // InternalDataDSL.g:17851:1: rule__XForLoopExpression__Group_0_0__3__Impl : ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) ;
+    // InternalDataDSL.g:18937:1: rule__XForLoopExpression__Group_0_0__3__Impl : ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) ;
     public final void rule__XForLoopExpression__Group_0_0__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17855:1: ( ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) )
-            // InternalDataDSL.g:17856:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            // InternalDataDSL.g:18941:1: ( ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) ) )
+            // InternalDataDSL.g:18942:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
             {
-            // InternalDataDSL.g:17856:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
-            // InternalDataDSL.g:17857:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            // InternalDataDSL.g:18942:1: ( ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 ) )
+            // InternalDataDSL.g:18943:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamAssignment_0_0_3()); 
             }
-            // InternalDataDSL.g:17858:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
-            // InternalDataDSL.g:17858:3: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
+            // InternalDataDSL.g:18944:2: ( rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 )
+            // InternalDataDSL.g:18944:3: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__DeclaredParamAssignment_0_0_3();
@@ -59159,14 +62780,14 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__4"
-    // InternalDataDSL.g:17866:1: rule__XForLoopExpression__Group_0_0__4 : rule__XForLoopExpression__Group_0_0__4__Impl ;
+    // InternalDataDSL.g:18952:1: rule__XForLoopExpression__Group_0_0__4 : rule__XForLoopExpression__Group_0_0__4__Impl ;
     public final void rule__XForLoopExpression__Group_0_0__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17870:1: ( rule__XForLoopExpression__Group_0_0__4__Impl )
-            // InternalDataDSL.g:17871:2: rule__XForLoopExpression__Group_0_0__4__Impl
+            // InternalDataDSL.g:18956:1: ( rule__XForLoopExpression__Group_0_0__4__Impl )
+            // InternalDataDSL.g:18957:2: rule__XForLoopExpression__Group_0_0__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XForLoopExpression__Group_0_0__4__Impl();
@@ -59192,22 +62813,22 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__Group_0_0__4__Impl"
-    // InternalDataDSL.g:17877:1: rule__XForLoopExpression__Group_0_0__4__Impl : ( ':' ) ;
+    // InternalDataDSL.g:18963:1: rule__XForLoopExpression__Group_0_0__4__Impl : ( ':' ) ;
     public final void rule__XForLoopExpression__Group_0_0__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17881:1: ( ( ':' ) )
-            // InternalDataDSL.g:17882:1: ( ':' )
+            // InternalDataDSL.g:18967:1: ( ( ':' ) )
+            // InternalDataDSL.g:18968:1: ( ':' )
             {
-            // InternalDataDSL.g:17882:1: ( ':' )
-            // InternalDataDSL.g:17883:2: ':'
+            // InternalDataDSL.g:18968:1: ( ':' )
+            // InternalDataDSL.g:18969:2: ':'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); 
             }
-            match(input,132,FOLLOW_2); if (state.failed) return ;
+            match(input,138,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4()); 
             }
@@ -59233,16 +62854,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__0"
-    // InternalDataDSL.g:17893:1: rule__XBasicForLoopExpression__Group__0 : rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 ;
+    // InternalDataDSL.g:18979:1: rule__XBasicForLoopExpression__Group__0 : rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 ;
     public final void rule__XBasicForLoopExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17897:1: ( rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 )
-            // InternalDataDSL.g:17898:2: rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1
+            // InternalDataDSL.g:18983:1: ( rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1 )
+            // InternalDataDSL.g:18984:2: rule__XBasicForLoopExpression__Group__0__Impl rule__XBasicForLoopExpression__Group__1
             {
-            pushFollow(FOLLOW_45);
+            pushFollow(FOLLOW_46);
             rule__XBasicForLoopExpression__Group__0__Impl();
 
             state._fsp--;
@@ -59271,23 +62892,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__0__Impl"
-    // InternalDataDSL.g:17905:1: rule__XBasicForLoopExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:18991:1: rule__XBasicForLoopExpression__Group__0__Impl : ( () ) ;
     public final void rule__XBasicForLoopExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17909:1: ( ( () ) )
-            // InternalDataDSL.g:17910:1: ( () )
+            // InternalDataDSL.g:18995:1: ( ( () ) )
+            // InternalDataDSL.g:18996:1: ( () )
             {
-            // InternalDataDSL.g:17910:1: ( () )
-            // InternalDataDSL.g:17911:2: ()
+            // InternalDataDSL.g:18996:1: ( () )
+            // InternalDataDSL.g:18997:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getXBasicForLoopExpressionAction_0()); 
             }
-            // InternalDataDSL.g:17912:2: ()
-            // InternalDataDSL.g:17912:3: 
+            // InternalDataDSL.g:18998:2: ()
+            // InternalDataDSL.g:18998:3: 
             {
             }
 
@@ -59312,16 +62933,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__1"
-    // InternalDataDSL.g:17920:1: rule__XBasicForLoopExpression__Group__1 : rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 ;
+    // InternalDataDSL.g:19006:1: rule__XBasicForLoopExpression__Group__1 : rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 ;
     public final void rule__XBasicForLoopExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17924:1: ( rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 )
-            // InternalDataDSL.g:17925:2: rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2
+            // InternalDataDSL.g:19010:1: ( rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2 )
+            // InternalDataDSL.g:19011:2: rule__XBasicForLoopExpression__Group__1__Impl rule__XBasicForLoopExpression__Group__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XBasicForLoopExpression__Group__1__Impl();
 
             state._fsp--;
@@ -59350,22 +62971,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__1__Impl"
-    // InternalDataDSL.g:17932:1: rule__XBasicForLoopExpression__Group__1__Impl : ( 'for' ) ;
+    // InternalDataDSL.g:19018:1: rule__XBasicForLoopExpression__Group__1__Impl : ( 'for' ) ;
     public final void rule__XBasicForLoopExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17936:1: ( ( 'for' ) )
-            // InternalDataDSL.g:17937:1: ( 'for' )
+            // InternalDataDSL.g:19022:1: ( ( 'for' ) )
+            // InternalDataDSL.g:19023:1: ( 'for' )
             {
-            // InternalDataDSL.g:17937:1: ( 'for' )
-            // InternalDataDSL.g:17938:2: 'for'
+            // InternalDataDSL.g:19023:1: ( 'for' )
+            // InternalDataDSL.g:19024:2: 'for'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); 
             }
-            match(input,101,FOLLOW_2); if (state.failed) return ;
+            match(input,103,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1()); 
             }
@@ -59391,16 +63012,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__2"
-    // InternalDataDSL.g:17947:1: rule__XBasicForLoopExpression__Group__2 : rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 ;
+    // InternalDataDSL.g:19033:1: rule__XBasicForLoopExpression__Group__2 : rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 ;
     public final void rule__XBasicForLoopExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17951:1: ( rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 )
-            // InternalDataDSL.g:17952:2: rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3
+            // InternalDataDSL.g:19037:1: ( rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3 )
+            // InternalDataDSL.g:19038:2: rule__XBasicForLoopExpression__Group__2__Impl rule__XBasicForLoopExpression__Group__3
             {
-            pushFollow(FOLLOW_137);
+            pushFollow(FOLLOW_145);
             rule__XBasicForLoopExpression__Group__2__Impl();
 
             state._fsp--;
@@ -59429,22 +63050,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__2__Impl"
-    // InternalDataDSL.g:17959:1: rule__XBasicForLoopExpression__Group__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:19045:1: rule__XBasicForLoopExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XBasicForLoopExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17963:1: ( ( '(' ) )
-            // InternalDataDSL.g:17964:1: ( '(' )
+            // InternalDataDSL.g:19049:1: ( ( '(' ) )
+            // InternalDataDSL.g:19050:1: ( '(' )
             {
-            // InternalDataDSL.g:17964:1: ( '(' )
-            // InternalDataDSL.g:17965:2: '('
+            // InternalDataDSL.g:19050:1: ( '(' )
+            // InternalDataDSL.g:19051:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
@@ -59470,16 +63091,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__3"
-    // InternalDataDSL.g:17974:1: rule__XBasicForLoopExpression__Group__3 : rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 ;
+    // InternalDataDSL.g:19060:1: rule__XBasicForLoopExpression__Group__3 : rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 ;
     public final void rule__XBasicForLoopExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17978:1: ( rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 )
-            // InternalDataDSL.g:17979:2: rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4
+            // InternalDataDSL.g:19064:1: ( rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4 )
+            // InternalDataDSL.g:19065:2: rule__XBasicForLoopExpression__Group__3__Impl rule__XBasicForLoopExpression__Group__4
             {
-            pushFollow(FOLLOW_137);
+            pushFollow(FOLLOW_145);
             rule__XBasicForLoopExpression__Group__3__Impl();
 
             state._fsp--;
@@ -59508,31 +63129,31 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__3__Impl"
-    // InternalDataDSL.g:17986:1: rule__XBasicForLoopExpression__Group__3__Impl : ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) ;
+    // InternalDataDSL.g:19072:1: rule__XBasicForLoopExpression__Group__3__Impl : ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:17990:1: ( ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) )
-            // InternalDataDSL.g:17991:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            // InternalDataDSL.g:19076:1: ( ( ( rule__XBasicForLoopExpression__Group_3__0 )? ) )
+            // InternalDataDSL.g:19077:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
             {
-            // InternalDataDSL.g:17991:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
-            // InternalDataDSL.g:17992:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            // InternalDataDSL.g:19077:1: ( ( rule__XBasicForLoopExpression__Group_3__0 )? )
+            // InternalDataDSL.g:19078:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:17993:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
-            int alt145=2;
-            int LA145_0 = input.LA(1);
+            // InternalDataDSL.g:19079:2: ( rule__XBasicForLoopExpression__Group_3__0 )?
+            int alt150=2;
+            int LA150_0 = input.LA(1);
 
-            if ( ((LA145_0>=RULE_STRING && LA145_0<=RULE_DECIMAL)||LA145_0==27||(LA145_0>=34 && LA145_0<=35)||LA145_0==40||(LA145_0>=44 && LA145_0<=50)||LA145_0==74||LA145_0==101||LA145_0==122||(LA145_0>=126 && LA145_0<=127)||LA145_0==129||LA145_0==131||(LA145_0>=135 && LA145_0<=142)||LA145_0==144||(LA145_0>=165 && LA145_0<=166)) ) {
-                alt145=1;
+            if ( ((LA150_0>=RULE_STRING && LA150_0<=RULE_DECIMAL)||LA150_0==27||(LA150_0>=34 && LA150_0<=35)||LA150_0==40||(LA150_0>=44 && LA150_0<=50)||LA150_0==74||LA150_0==103||LA150_0==128||(LA150_0>=132 && LA150_0<=133)||LA150_0==135||LA150_0==137||(LA150_0>=141 && LA150_0<=148)||LA150_0==150||(LA150_0>=178 && LA150_0<=179)) ) {
+                alt150=1;
             }
-            switch (alt145) {
+            switch (alt150) {
                 case 1 :
-                    // InternalDataDSL.g:17993:3: rule__XBasicForLoopExpression__Group_3__0
+                    // InternalDataDSL.g:19079:3: rule__XBasicForLoopExpression__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__Group_3__0();
@@ -59570,16 +63191,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__4"
-    // InternalDataDSL.g:18001:1: rule__XBasicForLoopExpression__Group__4 : rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 ;
+    // InternalDataDSL.g:19087:1: rule__XBasicForLoopExpression__Group__4 : rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 ;
     public final void rule__XBasicForLoopExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18005:1: ( rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 )
-            // InternalDataDSL.g:18006:2: rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5
+            // InternalDataDSL.g:19091:1: ( rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5 )
+            // InternalDataDSL.g:19092:2: rule__XBasicForLoopExpression__Group__4__Impl rule__XBasicForLoopExpression__Group__5
             {
-            pushFollow(FOLLOW_138);
+            pushFollow(FOLLOW_146);
             rule__XBasicForLoopExpression__Group__4__Impl();
 
             state._fsp--;
@@ -59608,22 +63229,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__4__Impl"
-    // InternalDataDSL.g:18013:1: rule__XBasicForLoopExpression__Group__4__Impl : ( ';' ) ;
+    // InternalDataDSL.g:19099:1: rule__XBasicForLoopExpression__Group__4__Impl : ( ';' ) ;
     public final void rule__XBasicForLoopExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18017:1: ( ( ';' ) )
-            // InternalDataDSL.g:18018:1: ( ';' )
+            // InternalDataDSL.g:19103:1: ( ( ';' ) )
+            // InternalDataDSL.g:19104:1: ( ';' )
             {
-            // InternalDataDSL.g:18018:1: ( ';' )
-            // InternalDataDSL.g:18019:2: ';'
+            // InternalDataDSL.g:19104:1: ( ';' )
+            // InternalDataDSL.g:19105:2: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); 
             }
-            match(input,120,FOLLOW_2); if (state.failed) return ;
+            match(input,126,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4()); 
             }
@@ -59649,16 +63270,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__5"
-    // InternalDataDSL.g:18028:1: rule__XBasicForLoopExpression__Group__5 : rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 ;
+    // InternalDataDSL.g:19114:1: rule__XBasicForLoopExpression__Group__5 : rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 ;
     public final void rule__XBasicForLoopExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18032:1: ( rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 )
-            // InternalDataDSL.g:18033:2: rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6
+            // InternalDataDSL.g:19118:1: ( rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6 )
+            // InternalDataDSL.g:19119:2: rule__XBasicForLoopExpression__Group__5__Impl rule__XBasicForLoopExpression__Group__6
             {
-            pushFollow(FOLLOW_138);
+            pushFollow(FOLLOW_146);
             rule__XBasicForLoopExpression__Group__5__Impl();
 
             state._fsp--;
@@ -59687,31 +63308,31 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__5__Impl"
-    // InternalDataDSL.g:18040:1: rule__XBasicForLoopExpression__Group__5__Impl : ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) ;
+    // InternalDataDSL.g:19126:1: rule__XBasicForLoopExpression__Group__5__Impl : ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18044:1: ( ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) )
-            // InternalDataDSL.g:18045:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            // InternalDataDSL.g:19130:1: ( ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? ) )
+            // InternalDataDSL.g:19131:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
             {
-            // InternalDataDSL.g:18045:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
-            // InternalDataDSL.g:18046:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            // InternalDataDSL.g:19131:1: ( ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )? )
+            // InternalDataDSL.g:19132:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionAssignment_5()); 
             }
-            // InternalDataDSL.g:18047:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
-            int alt146=2;
-            int LA146_0 = input.LA(1);
+            // InternalDataDSL.g:19133:2: ( rule__XBasicForLoopExpression__ExpressionAssignment_5 )?
+            int alt151=2;
+            int LA151_0 = input.LA(1);
 
-            if ( ((LA146_0>=RULE_STRING && LA146_0<=RULE_DECIMAL)||LA146_0==27||(LA146_0>=34 && LA146_0<=35)||LA146_0==40||(LA146_0>=45 && LA146_0<=50)||LA146_0==74||LA146_0==101||LA146_0==122||(LA146_0>=126 && LA146_0<=127)||LA146_0==129||LA146_0==131||(LA146_0>=135 && LA146_0<=142)||LA146_0==144||LA146_0==166) ) {
-                alt146=1;
+            if ( ((LA151_0>=RULE_STRING && LA151_0<=RULE_DECIMAL)||LA151_0==27||(LA151_0>=34 && LA151_0<=35)||LA151_0==40||(LA151_0>=45 && LA151_0<=50)||LA151_0==74||LA151_0==103||LA151_0==128||(LA151_0>=132 && LA151_0<=133)||LA151_0==135||LA151_0==137||(LA151_0>=141 && LA151_0<=148)||LA151_0==150||LA151_0==179) ) {
+                alt151=1;
             }
-            switch (alt146) {
+            switch (alt151) {
                 case 1 :
-                    // InternalDataDSL.g:18047:3: rule__XBasicForLoopExpression__ExpressionAssignment_5
+                    // InternalDataDSL.g:19133:3: rule__XBasicForLoopExpression__ExpressionAssignment_5
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__ExpressionAssignment_5();
@@ -59749,16 +63370,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__6"
-    // InternalDataDSL.g:18055:1: rule__XBasicForLoopExpression__Group__6 : rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 ;
+    // InternalDataDSL.g:19141:1: rule__XBasicForLoopExpression__Group__6 : rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 ;
     public final void rule__XBasicForLoopExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18059:1: ( rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 )
-            // InternalDataDSL.g:18060:2: rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7
+            // InternalDataDSL.g:19145:1: ( rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7 )
+            // InternalDataDSL.g:19146:2: rule__XBasicForLoopExpression__Group__6__Impl rule__XBasicForLoopExpression__Group__7
             {
-            pushFollow(FOLLOW_81);
+            pushFollow(FOLLOW_89);
             rule__XBasicForLoopExpression__Group__6__Impl();
 
             state._fsp--;
@@ -59787,22 +63408,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__6__Impl"
-    // InternalDataDSL.g:18067:1: rule__XBasicForLoopExpression__Group__6__Impl : ( ';' ) ;
+    // InternalDataDSL.g:19153:1: rule__XBasicForLoopExpression__Group__6__Impl : ( ';' ) ;
     public final void rule__XBasicForLoopExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18071:1: ( ( ';' ) )
-            // InternalDataDSL.g:18072:1: ( ';' )
+            // InternalDataDSL.g:19157:1: ( ( ';' ) )
+            // InternalDataDSL.g:19158:1: ( ';' )
             {
-            // InternalDataDSL.g:18072:1: ( ';' )
-            // InternalDataDSL.g:18073:2: ';'
+            // InternalDataDSL.g:19158:1: ( ';' )
+            // InternalDataDSL.g:19159:2: ';'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); 
             }
-            match(input,120,FOLLOW_2); if (state.failed) return ;
+            match(input,126,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6()); 
             }
@@ -59828,16 +63449,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__7"
-    // InternalDataDSL.g:18082:1: rule__XBasicForLoopExpression__Group__7 : rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 ;
+    // InternalDataDSL.g:19168:1: rule__XBasicForLoopExpression__Group__7 : rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 ;
     public final void rule__XBasicForLoopExpression__Group__7() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18086:1: ( rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 )
-            // InternalDataDSL.g:18087:2: rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8
+            // InternalDataDSL.g:19172:1: ( rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8 )
+            // InternalDataDSL.g:19173:2: rule__XBasicForLoopExpression__Group__7__Impl rule__XBasicForLoopExpression__Group__8
             {
-            pushFollow(FOLLOW_81);
+            pushFollow(FOLLOW_89);
             rule__XBasicForLoopExpression__Group__7__Impl();
 
             state._fsp--;
@@ -59866,31 +63487,31 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__7__Impl"
-    // InternalDataDSL.g:18094:1: rule__XBasicForLoopExpression__Group__7__Impl : ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) ;
+    // InternalDataDSL.g:19180:1: rule__XBasicForLoopExpression__Group__7__Impl : ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) ;
     public final void rule__XBasicForLoopExpression__Group__7__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18098:1: ( ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) )
-            // InternalDataDSL.g:18099:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            // InternalDataDSL.g:19184:1: ( ( ( rule__XBasicForLoopExpression__Group_7__0 )? ) )
+            // InternalDataDSL.g:19185:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
             {
-            // InternalDataDSL.g:18099:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
-            // InternalDataDSL.g:18100:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            // InternalDataDSL.g:19185:1: ( ( rule__XBasicForLoopExpression__Group_7__0 )? )
+            // InternalDataDSL.g:19186:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7()); 
             }
-            // InternalDataDSL.g:18101:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
-            int alt147=2;
-            int LA147_0 = input.LA(1);
+            // InternalDataDSL.g:19187:2: ( rule__XBasicForLoopExpression__Group_7__0 )?
+            int alt152=2;
+            int LA152_0 = input.LA(1);
 
-            if ( ((LA147_0>=RULE_STRING && LA147_0<=RULE_DECIMAL)||LA147_0==27||(LA147_0>=34 && LA147_0<=35)||LA147_0==40||(LA147_0>=45 && LA147_0<=50)||LA147_0==74||LA147_0==101||LA147_0==122||(LA147_0>=126 && LA147_0<=127)||LA147_0==129||LA147_0==131||(LA147_0>=135 && LA147_0<=142)||LA147_0==144||LA147_0==166) ) {
-                alt147=1;
+            if ( ((LA152_0>=RULE_STRING && LA152_0<=RULE_DECIMAL)||LA152_0==27||(LA152_0>=34 && LA152_0<=35)||LA152_0==40||(LA152_0>=45 && LA152_0<=50)||LA152_0==74||LA152_0==103||LA152_0==128||(LA152_0>=132 && LA152_0<=133)||LA152_0==135||LA152_0==137||(LA152_0>=141 && LA152_0<=148)||LA152_0==150||LA152_0==179) ) {
+                alt152=1;
             }
-            switch (alt147) {
+            switch (alt152) {
                 case 1 :
-                    // InternalDataDSL.g:18101:3: rule__XBasicForLoopExpression__Group_7__0
+                    // InternalDataDSL.g:19187:3: rule__XBasicForLoopExpression__Group_7__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XBasicForLoopExpression__Group_7__0();
@@ -59928,16 +63549,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__8"
-    // InternalDataDSL.g:18109:1: rule__XBasicForLoopExpression__Group__8 : rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 ;
+    // InternalDataDSL.g:19195:1: rule__XBasicForLoopExpression__Group__8 : rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 ;
     public final void rule__XBasicForLoopExpression__Group__8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18113:1: ( rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 )
-            // InternalDataDSL.g:18114:2: rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9
+            // InternalDataDSL.g:19199:1: ( rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9 )
+            // InternalDataDSL.g:19200:2: rule__XBasicForLoopExpression__Group__8__Impl rule__XBasicForLoopExpression__Group__9
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XBasicForLoopExpression__Group__8__Impl();
 
             state._fsp--;
@@ -59966,22 +63587,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__8__Impl"
-    // InternalDataDSL.g:18121:1: rule__XBasicForLoopExpression__Group__8__Impl : ( ')' ) ;
+    // InternalDataDSL.g:19207:1: rule__XBasicForLoopExpression__Group__8__Impl : ( ')' ) ;
     public final void rule__XBasicForLoopExpression__Group__8__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18125:1: ( ( ')' ) )
-            // InternalDataDSL.g:18126:1: ( ')' )
+            // InternalDataDSL.g:19211:1: ( ( ')' ) )
+            // InternalDataDSL.g:19212:1: ( ')' )
             {
-            // InternalDataDSL.g:18126:1: ( ')' )
-            // InternalDataDSL.g:18127:2: ')'
+            // InternalDataDSL.g:19212:1: ( ')' )
+            // InternalDataDSL.g:19213:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8()); 
             }
@@ -60007,14 +63628,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__9"
-    // InternalDataDSL.g:18136:1: rule__XBasicForLoopExpression__Group__9 : rule__XBasicForLoopExpression__Group__9__Impl ;
+    // InternalDataDSL.g:19222:1: rule__XBasicForLoopExpression__Group__9 : rule__XBasicForLoopExpression__Group__9__Impl ;
     public final void rule__XBasicForLoopExpression__Group__9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18140:1: ( rule__XBasicForLoopExpression__Group__9__Impl )
-            // InternalDataDSL.g:18141:2: rule__XBasicForLoopExpression__Group__9__Impl
+            // InternalDataDSL.g:19226:1: ( rule__XBasicForLoopExpression__Group__9__Impl )
+            // InternalDataDSL.g:19227:2: rule__XBasicForLoopExpression__Group__9__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group__9__Impl();
@@ -60040,23 +63661,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group__9__Impl"
-    // InternalDataDSL.g:18147:1: rule__XBasicForLoopExpression__Group__9__Impl : ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) ;
+    // InternalDataDSL.g:19233:1: rule__XBasicForLoopExpression__Group__9__Impl : ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) ;
     public final void rule__XBasicForLoopExpression__Group__9__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18151:1: ( ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) )
-            // InternalDataDSL.g:18152:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            // InternalDataDSL.g:19237:1: ( ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) ) )
+            // InternalDataDSL.g:19238:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
             {
-            // InternalDataDSL.g:18152:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
-            // InternalDataDSL.g:18153:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            // InternalDataDSL.g:19238:1: ( ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 ) )
+            // InternalDataDSL.g:19239:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionAssignment_9()); 
             }
-            // InternalDataDSL.g:18154:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
-            // InternalDataDSL.g:18154:3: rule__XBasicForLoopExpression__EachExpressionAssignment_9
+            // InternalDataDSL.g:19240:2: ( rule__XBasicForLoopExpression__EachExpressionAssignment_9 )
+            // InternalDataDSL.g:19240:3: rule__XBasicForLoopExpression__EachExpressionAssignment_9
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__EachExpressionAssignment_9();
@@ -60091,16 +63712,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0"
-    // InternalDataDSL.g:18163:1: rule__XBasicForLoopExpression__Group_3__0 : rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 ;
+    // InternalDataDSL.g:19249:1: rule__XBasicForLoopExpression__Group_3__0 : rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 ;
     public final void rule__XBasicForLoopExpression__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18167:1: ( rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 )
-            // InternalDataDSL.g:18168:2: rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1
+            // InternalDataDSL.g:19253:1: ( rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1 )
+            // InternalDataDSL.g:19254:2: rule__XBasicForLoopExpression__Group_3__0__Impl rule__XBasicForLoopExpression__Group_3__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XBasicForLoopExpression__Group_3__0__Impl();
 
             state._fsp--;
@@ -60129,23 +63750,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__0__Impl"
-    // InternalDataDSL.g:18175:1: rule__XBasicForLoopExpression__Group_3__0__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:19261:1: rule__XBasicForLoopExpression__Group_3__0__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18179:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) )
-            // InternalDataDSL.g:18180:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            // InternalDataDSL.g:19265:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) ) )
+            // InternalDataDSL.g:19266:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:18180:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
-            // InternalDataDSL.g:18181:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            // InternalDataDSL.g:19266:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 ) )
+            // InternalDataDSL.g:19267:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_0()); 
             }
-            // InternalDataDSL.g:18182:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
-            // InternalDataDSL.g:18182:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
+            // InternalDataDSL.g:19268:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 )
+            // InternalDataDSL.g:19268:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0();
@@ -60180,14 +63801,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1"
-    // InternalDataDSL.g:18190:1: rule__XBasicForLoopExpression__Group_3__1 : rule__XBasicForLoopExpression__Group_3__1__Impl ;
+    // InternalDataDSL.g:19276:1: rule__XBasicForLoopExpression__Group_3__1 : rule__XBasicForLoopExpression__Group_3__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18194:1: ( rule__XBasicForLoopExpression__Group_3__1__Impl )
-            // InternalDataDSL.g:18195:2: rule__XBasicForLoopExpression__Group_3__1__Impl
+            // InternalDataDSL.g:19280:1: ( rule__XBasicForLoopExpression__Group_3__1__Impl )
+            // InternalDataDSL.g:19281:2: rule__XBasicForLoopExpression__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_3__1__Impl();
@@ -60213,37 +63834,37 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3__1__Impl"
-    // InternalDataDSL.g:18201:1: rule__XBasicForLoopExpression__Group_3__1__Impl : ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) ;
+    // InternalDataDSL.g:19287:1: rule__XBasicForLoopExpression__Group_3__1__Impl : ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) ;
     public final void rule__XBasicForLoopExpression__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18205:1: ( ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) )
-            // InternalDataDSL.g:18206:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            // InternalDataDSL.g:19291:1: ( ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* ) )
+            // InternalDataDSL.g:19292:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
             {
-            // InternalDataDSL.g:18206:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
-            // InternalDataDSL.g:18207:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            // InternalDataDSL.g:19292:1: ( ( rule__XBasicForLoopExpression__Group_3_1__0 )* )
+            // InternalDataDSL.g:19293:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_3_1()); 
             }
-            // InternalDataDSL.g:18208:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
-            loop148:
+            // InternalDataDSL.g:19294:2: ( rule__XBasicForLoopExpression__Group_3_1__0 )*
+            loop153:
             do {
-                int alt148=2;
-                int LA148_0 = input.LA(1);
+                int alt153=2;
+                int LA153_0 = input.LA(1);
 
-                if ( (LA148_0==124) ) {
-                    alt148=1;
+                if ( (LA153_0==130) ) {
+                    alt153=1;
                 }
 
 
-                switch (alt148) {
+                switch (alt153) {
             	case 1 :
-            	    // InternalDataDSL.g:18208:3: rule__XBasicForLoopExpression__Group_3_1__0
+            	    // InternalDataDSL.g:19294:3: rule__XBasicForLoopExpression__Group_3_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XBasicForLoopExpression__Group_3_1__0();
 
             	    state._fsp--;
@@ -60253,7 +63874,7 @@
             	    break;
 
             	default :
-            	    break loop148;
+            	    break loop153;
                 }
             } while (true);
 
@@ -60282,16 +63903,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0"
-    // InternalDataDSL.g:18217:1: rule__XBasicForLoopExpression__Group_3_1__0 : rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 ;
+    // InternalDataDSL.g:19303:1: rule__XBasicForLoopExpression__Group_3_1__0 : rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 ;
     public final void rule__XBasicForLoopExpression__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18221:1: ( rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 )
-            // InternalDataDSL.g:18222:2: rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1
+            // InternalDataDSL.g:19307:1: ( rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1 )
+            // InternalDataDSL.g:19308:2: rule__XBasicForLoopExpression__Group_3_1__0__Impl rule__XBasicForLoopExpression__Group_3_1__1
             {
-            pushFollow(FOLLOW_139);
+            pushFollow(FOLLOW_147);
             rule__XBasicForLoopExpression__Group_3_1__0__Impl();
 
             state._fsp--;
@@ -60320,22 +63941,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__0__Impl"
-    // InternalDataDSL.g:18229:1: rule__XBasicForLoopExpression__Group_3_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:19315:1: rule__XBasicForLoopExpression__Group_3_1__0__Impl : ( ',' ) ;
     public final void rule__XBasicForLoopExpression__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18233:1: ( ( ',' ) )
-            // InternalDataDSL.g:18234:1: ( ',' )
+            // InternalDataDSL.g:19319:1: ( ( ',' ) )
+            // InternalDataDSL.g:19320:1: ( ',' )
             {
-            // InternalDataDSL.g:18234:1: ( ',' )
-            // InternalDataDSL.g:18235:2: ','
+            // InternalDataDSL.g:19320:1: ( ',' )
+            // InternalDataDSL.g:19321:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0()); 
             }
@@ -60361,14 +63982,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1"
-    // InternalDataDSL.g:18244:1: rule__XBasicForLoopExpression__Group_3_1__1 : rule__XBasicForLoopExpression__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:19330:1: rule__XBasicForLoopExpression__Group_3_1__1 : rule__XBasicForLoopExpression__Group_3_1__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18248:1: ( rule__XBasicForLoopExpression__Group_3_1__1__Impl )
-            // InternalDataDSL.g:18249:2: rule__XBasicForLoopExpression__Group_3_1__1__Impl
+            // InternalDataDSL.g:19334:1: ( rule__XBasicForLoopExpression__Group_3_1__1__Impl )
+            // InternalDataDSL.g:19335:2: rule__XBasicForLoopExpression__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_3_1__1__Impl();
@@ -60394,23 +64015,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_3_1__1__Impl"
-    // InternalDataDSL.g:18255:1: rule__XBasicForLoopExpression__Group_3_1__1__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:19341:1: rule__XBasicForLoopExpression__Group_3_1__1__Impl : ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18259:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:18260:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:19345:1: ( ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:19346:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:18260:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
-            // InternalDataDSL.g:18261:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            // InternalDataDSL.g:19346:1: ( ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 ) )
+            // InternalDataDSL.g:19347:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:18262:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
-            // InternalDataDSL.g:18262:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
+            // InternalDataDSL.g:19348:2: ( rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 )
+            // InternalDataDSL.g:19348:3: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1();
@@ -60445,16 +64066,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0"
-    // InternalDataDSL.g:18271:1: rule__XBasicForLoopExpression__Group_7__0 : rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 ;
+    // InternalDataDSL.g:19357:1: rule__XBasicForLoopExpression__Group_7__0 : rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 ;
     public final void rule__XBasicForLoopExpression__Group_7__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18275:1: ( rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 )
-            // InternalDataDSL.g:18276:2: rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1
+            // InternalDataDSL.g:19361:1: ( rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1 )
+            // InternalDataDSL.g:19362:2: rule__XBasicForLoopExpression__Group_7__0__Impl rule__XBasicForLoopExpression__Group_7__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XBasicForLoopExpression__Group_7__0__Impl();
 
             state._fsp--;
@@ -60483,23 +64104,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__0__Impl"
-    // InternalDataDSL.g:18283:1: rule__XBasicForLoopExpression__Group_7__0__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) ;
+    // InternalDataDSL.g:19369:1: rule__XBasicForLoopExpression__Group_7__0__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_7__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18287:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) )
-            // InternalDataDSL.g:18288:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            // InternalDataDSL.g:19373:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) ) )
+            // InternalDataDSL.g:19374:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
             {
-            // InternalDataDSL.g:18288:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
-            // InternalDataDSL.g:18289:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            // InternalDataDSL.g:19374:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 ) )
+            // InternalDataDSL.g:19375:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_0()); 
             }
-            // InternalDataDSL.g:18290:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
-            // InternalDataDSL.g:18290:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
+            // InternalDataDSL.g:19376:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 )
+            // InternalDataDSL.g:19376:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0();
@@ -60534,14 +64155,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1"
-    // InternalDataDSL.g:18298:1: rule__XBasicForLoopExpression__Group_7__1 : rule__XBasicForLoopExpression__Group_7__1__Impl ;
+    // InternalDataDSL.g:19384:1: rule__XBasicForLoopExpression__Group_7__1 : rule__XBasicForLoopExpression__Group_7__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_7__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18302:1: ( rule__XBasicForLoopExpression__Group_7__1__Impl )
-            // InternalDataDSL.g:18303:2: rule__XBasicForLoopExpression__Group_7__1__Impl
+            // InternalDataDSL.g:19388:1: ( rule__XBasicForLoopExpression__Group_7__1__Impl )
+            // InternalDataDSL.g:19389:2: rule__XBasicForLoopExpression__Group_7__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_7__1__Impl();
@@ -60567,37 +64188,37 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7__1__Impl"
-    // InternalDataDSL.g:18309:1: rule__XBasicForLoopExpression__Group_7__1__Impl : ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) ;
+    // InternalDataDSL.g:19395:1: rule__XBasicForLoopExpression__Group_7__1__Impl : ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) ;
     public final void rule__XBasicForLoopExpression__Group_7__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18313:1: ( ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) )
-            // InternalDataDSL.g:18314:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            // InternalDataDSL.g:19399:1: ( ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* ) )
+            // InternalDataDSL.g:19400:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
             {
-            // InternalDataDSL.g:18314:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
-            // InternalDataDSL.g:18315:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            // InternalDataDSL.g:19400:1: ( ( rule__XBasicForLoopExpression__Group_7_1__0 )* )
+            // InternalDataDSL.g:19401:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getGroup_7_1()); 
             }
-            // InternalDataDSL.g:18316:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
-            loop149:
+            // InternalDataDSL.g:19402:2: ( rule__XBasicForLoopExpression__Group_7_1__0 )*
+            loop154:
             do {
-                int alt149=2;
-                int LA149_0 = input.LA(1);
+                int alt154=2;
+                int LA154_0 = input.LA(1);
 
-                if ( (LA149_0==124) ) {
-                    alt149=1;
+                if ( (LA154_0==130) ) {
+                    alt154=1;
                 }
 
 
-                switch (alt149) {
+                switch (alt154) {
             	case 1 :
-            	    // InternalDataDSL.g:18316:3: rule__XBasicForLoopExpression__Group_7_1__0
+            	    // InternalDataDSL.g:19402:3: rule__XBasicForLoopExpression__Group_7_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XBasicForLoopExpression__Group_7_1__0();
 
             	    state._fsp--;
@@ -60607,7 +64228,7 @@
             	    break;
 
             	default :
-            	    break loop149;
+            	    break loop154;
                 }
             } while (true);
 
@@ -60636,16 +64257,16 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0"
-    // InternalDataDSL.g:18325:1: rule__XBasicForLoopExpression__Group_7_1__0 : rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 ;
+    // InternalDataDSL.g:19411:1: rule__XBasicForLoopExpression__Group_7_1__0 : rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 ;
     public final void rule__XBasicForLoopExpression__Group_7_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18329:1: ( rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 )
-            // InternalDataDSL.g:18330:2: rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1
+            // InternalDataDSL.g:19415:1: ( rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1 )
+            // InternalDataDSL.g:19416:2: rule__XBasicForLoopExpression__Group_7_1__0__Impl rule__XBasicForLoopExpression__Group_7_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XBasicForLoopExpression__Group_7_1__0__Impl();
 
             state._fsp--;
@@ -60674,22 +64295,22 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__0__Impl"
-    // InternalDataDSL.g:18337:1: rule__XBasicForLoopExpression__Group_7_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:19423:1: rule__XBasicForLoopExpression__Group_7_1__0__Impl : ( ',' ) ;
     public final void rule__XBasicForLoopExpression__Group_7_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18341:1: ( ( ',' ) )
-            // InternalDataDSL.g:18342:1: ( ',' )
+            // InternalDataDSL.g:19427:1: ( ( ',' ) )
+            // InternalDataDSL.g:19428:1: ( ',' )
             {
-            // InternalDataDSL.g:18342:1: ( ',' )
-            // InternalDataDSL.g:18343:2: ','
+            // InternalDataDSL.g:19428:1: ( ',' )
+            // InternalDataDSL.g:19429:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0()); 
             }
@@ -60715,14 +64336,14 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1"
-    // InternalDataDSL.g:18352:1: rule__XBasicForLoopExpression__Group_7_1__1 : rule__XBasicForLoopExpression__Group_7_1__1__Impl ;
+    // InternalDataDSL.g:19438:1: rule__XBasicForLoopExpression__Group_7_1__1 : rule__XBasicForLoopExpression__Group_7_1__1__Impl ;
     public final void rule__XBasicForLoopExpression__Group_7_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18356:1: ( rule__XBasicForLoopExpression__Group_7_1__1__Impl )
-            // InternalDataDSL.g:18357:2: rule__XBasicForLoopExpression__Group_7_1__1__Impl
+            // InternalDataDSL.g:19442:1: ( rule__XBasicForLoopExpression__Group_7_1__1__Impl )
+            // InternalDataDSL.g:19443:2: rule__XBasicForLoopExpression__Group_7_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__Group_7_1__1__Impl();
@@ -60748,23 +64369,23 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__Group_7_1__1__Impl"
-    // InternalDataDSL.g:18363:1: rule__XBasicForLoopExpression__Group_7_1__1__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) ;
+    // InternalDataDSL.g:19449:1: rule__XBasicForLoopExpression__Group_7_1__1__Impl : ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) ;
     public final void rule__XBasicForLoopExpression__Group_7_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18367:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) )
-            // InternalDataDSL.g:18368:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            // InternalDataDSL.g:19453:1: ( ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) ) )
+            // InternalDataDSL.g:19454:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
             {
-            // InternalDataDSL.g:18368:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
-            // InternalDataDSL.g:18369:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            // InternalDataDSL.g:19454:1: ( ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 ) )
+            // InternalDataDSL.g:19455:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsAssignment_7_1_1()); 
             }
-            // InternalDataDSL.g:18370:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
-            // InternalDataDSL.g:18370:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
+            // InternalDataDSL.g:19456:2: ( rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 )
+            // InternalDataDSL.g:19456:3: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1();
@@ -60799,16 +64420,16 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__0"
-    // InternalDataDSL.g:18379:1: rule__XWhileExpression__Group__0 : rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 ;
+    // InternalDataDSL.g:19465:1: rule__XWhileExpression__Group__0 : rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 ;
     public final void rule__XWhileExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18383:1: ( rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 )
-            // InternalDataDSL.g:18384:2: rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1
+            // InternalDataDSL.g:19469:1: ( rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1 )
+            // InternalDataDSL.g:19470:2: rule__XWhileExpression__Group__0__Impl rule__XWhileExpression__Group__1
             {
-            pushFollow(FOLLOW_140);
+            pushFollow(FOLLOW_148);
             rule__XWhileExpression__Group__0__Impl();
 
             state._fsp--;
@@ -60837,23 +64458,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__0__Impl"
-    // InternalDataDSL.g:18391:1: rule__XWhileExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:19477:1: rule__XWhileExpression__Group__0__Impl : ( () ) ;
     public final void rule__XWhileExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18395:1: ( ( () ) )
-            // InternalDataDSL.g:18396:1: ( () )
+            // InternalDataDSL.g:19481:1: ( ( () ) )
+            // InternalDataDSL.g:19482:1: ( () )
             {
-            // InternalDataDSL.g:18396:1: ( () )
-            // InternalDataDSL.g:18397:2: ()
+            // InternalDataDSL.g:19482:1: ( () )
+            // InternalDataDSL.g:19483:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getXWhileExpressionAction_0()); 
             }
-            // InternalDataDSL.g:18398:2: ()
-            // InternalDataDSL.g:18398:3: 
+            // InternalDataDSL.g:19484:2: ()
+            // InternalDataDSL.g:19484:3: 
             {
             }
 
@@ -60878,16 +64499,16 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__1"
-    // InternalDataDSL.g:18406:1: rule__XWhileExpression__Group__1 : rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 ;
+    // InternalDataDSL.g:19492:1: rule__XWhileExpression__Group__1 : rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 ;
     public final void rule__XWhileExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18410:1: ( rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 )
-            // InternalDataDSL.g:18411:2: rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2
+            // InternalDataDSL.g:19496:1: ( rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2 )
+            // InternalDataDSL.g:19497:2: rule__XWhileExpression__Group__1__Impl rule__XWhileExpression__Group__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XWhileExpression__Group__1__Impl();
 
             state._fsp--;
@@ -60916,22 +64537,22 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__1__Impl"
-    // InternalDataDSL.g:18418:1: rule__XWhileExpression__Group__1__Impl : ( 'while' ) ;
+    // InternalDataDSL.g:19504:1: rule__XWhileExpression__Group__1__Impl : ( 'while' ) ;
     public final void rule__XWhileExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18422:1: ( ( 'while' ) )
-            // InternalDataDSL.g:18423:1: ( 'while' )
+            // InternalDataDSL.g:19508:1: ( ( 'while' ) )
+            // InternalDataDSL.g:19509:1: ( 'while' )
             {
-            // InternalDataDSL.g:18423:1: ( 'while' )
-            // InternalDataDSL.g:18424:2: 'while'
+            // InternalDataDSL.g:19509:1: ( 'while' )
+            // InternalDataDSL.g:19510:2: 'while'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); 
             }
-            match(input,135,FOLLOW_2); if (state.failed) return ;
+            match(input,141,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1()); 
             }
@@ -60957,16 +64578,16 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__2"
-    // InternalDataDSL.g:18433:1: rule__XWhileExpression__Group__2 : rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 ;
+    // InternalDataDSL.g:19519:1: rule__XWhileExpression__Group__2 : rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 ;
     public final void rule__XWhileExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18437:1: ( rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 )
-            // InternalDataDSL.g:18438:2: rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3
+            // InternalDataDSL.g:19523:1: ( rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3 )
+            // InternalDataDSL.g:19524:2: rule__XWhileExpression__Group__2__Impl rule__XWhileExpression__Group__3
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XWhileExpression__Group__2__Impl();
 
             state._fsp--;
@@ -60995,22 +64616,22 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__2__Impl"
-    // InternalDataDSL.g:18445:1: rule__XWhileExpression__Group__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:19531:1: rule__XWhileExpression__Group__2__Impl : ( '(' ) ;
     public final void rule__XWhileExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18449:1: ( ( '(' ) )
-            // InternalDataDSL.g:18450:1: ( '(' )
+            // InternalDataDSL.g:19535:1: ( ( '(' ) )
+            // InternalDataDSL.g:19536:1: ( '(' )
             {
-            // InternalDataDSL.g:18450:1: ( '(' )
-            // InternalDataDSL.g:18451:2: '('
+            // InternalDataDSL.g:19536:1: ( '(' )
+            // InternalDataDSL.g:19537:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2()); 
             }
@@ -61036,16 +64657,16 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__3"
-    // InternalDataDSL.g:18460:1: rule__XWhileExpression__Group__3 : rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 ;
+    // InternalDataDSL.g:19546:1: rule__XWhileExpression__Group__3 : rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 ;
     public final void rule__XWhileExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18464:1: ( rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 )
-            // InternalDataDSL.g:18465:2: rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4
+            // InternalDataDSL.g:19550:1: ( rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4 )
+            // InternalDataDSL.g:19551:2: rule__XWhileExpression__Group__3__Impl rule__XWhileExpression__Group__4
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XWhileExpression__Group__3__Impl();
 
             state._fsp--;
@@ -61074,23 +64695,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__3__Impl"
-    // InternalDataDSL.g:18472:1: rule__XWhileExpression__Group__3__Impl : ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) ;
+    // InternalDataDSL.g:19558:1: rule__XWhileExpression__Group__3__Impl : ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) ;
     public final void rule__XWhileExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18476:1: ( ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) )
-            // InternalDataDSL.g:18477:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            // InternalDataDSL.g:19562:1: ( ( ( rule__XWhileExpression__PredicateAssignment_3 ) ) )
+            // InternalDataDSL.g:19563:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
             {
-            // InternalDataDSL.g:18477:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
-            // InternalDataDSL.g:18478:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            // InternalDataDSL.g:19563:1: ( ( rule__XWhileExpression__PredicateAssignment_3 ) )
+            // InternalDataDSL.g:19564:2: ( rule__XWhileExpression__PredicateAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getPredicateAssignment_3()); 
             }
-            // InternalDataDSL.g:18479:2: ( rule__XWhileExpression__PredicateAssignment_3 )
-            // InternalDataDSL.g:18479:3: rule__XWhileExpression__PredicateAssignment_3
+            // InternalDataDSL.g:19565:2: ( rule__XWhileExpression__PredicateAssignment_3 )
+            // InternalDataDSL.g:19565:3: rule__XWhileExpression__PredicateAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__PredicateAssignment_3();
@@ -61125,16 +64746,16 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__4"
-    // InternalDataDSL.g:18487:1: rule__XWhileExpression__Group__4 : rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 ;
+    // InternalDataDSL.g:19573:1: rule__XWhileExpression__Group__4 : rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 ;
     public final void rule__XWhileExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18491:1: ( rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 )
-            // InternalDataDSL.g:18492:2: rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5
+            // InternalDataDSL.g:19577:1: ( rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5 )
+            // InternalDataDSL.g:19578:2: rule__XWhileExpression__Group__4__Impl rule__XWhileExpression__Group__5
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XWhileExpression__Group__4__Impl();
 
             state._fsp--;
@@ -61163,22 +64784,22 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__4__Impl"
-    // InternalDataDSL.g:18499:1: rule__XWhileExpression__Group__4__Impl : ( ')' ) ;
+    // InternalDataDSL.g:19585:1: rule__XWhileExpression__Group__4__Impl : ( ')' ) ;
     public final void rule__XWhileExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18503:1: ( ( ')' ) )
-            // InternalDataDSL.g:18504:1: ( ')' )
+            // InternalDataDSL.g:19589:1: ( ( ')' ) )
+            // InternalDataDSL.g:19590:1: ( ')' )
             {
-            // InternalDataDSL.g:18504:1: ( ')' )
-            // InternalDataDSL.g:18505:2: ')'
+            // InternalDataDSL.g:19590:1: ( ')' )
+            // InternalDataDSL.g:19591:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4()); 
             }
@@ -61204,14 +64825,14 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__5"
-    // InternalDataDSL.g:18514:1: rule__XWhileExpression__Group__5 : rule__XWhileExpression__Group__5__Impl ;
+    // InternalDataDSL.g:19600:1: rule__XWhileExpression__Group__5 : rule__XWhileExpression__Group__5__Impl ;
     public final void rule__XWhileExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18518:1: ( rule__XWhileExpression__Group__5__Impl )
-            // InternalDataDSL.g:18519:2: rule__XWhileExpression__Group__5__Impl
+            // InternalDataDSL.g:19604:1: ( rule__XWhileExpression__Group__5__Impl )
+            // InternalDataDSL.g:19605:2: rule__XWhileExpression__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__Group__5__Impl();
@@ -61237,23 +64858,23 @@
 
 
     // $ANTLR start "rule__XWhileExpression__Group__5__Impl"
-    // InternalDataDSL.g:18525:1: rule__XWhileExpression__Group__5__Impl : ( ( rule__XWhileExpression__BodyAssignment_5 ) ) ;
+    // InternalDataDSL.g:19611:1: rule__XWhileExpression__Group__5__Impl : ( ( rule__XWhileExpression__BodyAssignment_5 ) ) ;
     public final void rule__XWhileExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18529:1: ( ( ( rule__XWhileExpression__BodyAssignment_5 ) ) )
-            // InternalDataDSL.g:18530:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            // InternalDataDSL.g:19615:1: ( ( ( rule__XWhileExpression__BodyAssignment_5 ) ) )
+            // InternalDataDSL.g:19616:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
             {
-            // InternalDataDSL.g:18530:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
-            // InternalDataDSL.g:18531:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            // InternalDataDSL.g:19616:1: ( ( rule__XWhileExpression__BodyAssignment_5 ) )
+            // InternalDataDSL.g:19617:2: ( rule__XWhileExpression__BodyAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getBodyAssignment_5()); 
             }
-            // InternalDataDSL.g:18532:2: ( rule__XWhileExpression__BodyAssignment_5 )
-            // InternalDataDSL.g:18532:3: rule__XWhileExpression__BodyAssignment_5
+            // InternalDataDSL.g:19618:2: ( rule__XWhileExpression__BodyAssignment_5 )
+            // InternalDataDSL.g:19618:3: rule__XWhileExpression__BodyAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XWhileExpression__BodyAssignment_5();
@@ -61288,16 +64909,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__0"
-    // InternalDataDSL.g:18541:1: rule__XDoWhileExpression__Group__0 : rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 ;
+    // InternalDataDSL.g:19627:1: rule__XDoWhileExpression__Group__0 : rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 ;
     public final void rule__XDoWhileExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18545:1: ( rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 )
-            // InternalDataDSL.g:18546:2: rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1
+            // InternalDataDSL.g:19631:1: ( rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1 )
+            // InternalDataDSL.g:19632:2: rule__XDoWhileExpression__Group__0__Impl rule__XDoWhileExpression__Group__1
             {
-            pushFollow(FOLLOW_141);
+            pushFollow(FOLLOW_149);
             rule__XDoWhileExpression__Group__0__Impl();
 
             state._fsp--;
@@ -61326,23 +64947,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__0__Impl"
-    // InternalDataDSL.g:18553:1: rule__XDoWhileExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:19639:1: rule__XDoWhileExpression__Group__0__Impl : ( () ) ;
     public final void rule__XDoWhileExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18557:1: ( ( () ) )
-            // InternalDataDSL.g:18558:1: ( () )
+            // InternalDataDSL.g:19643:1: ( ( () ) )
+            // InternalDataDSL.g:19644:1: ( () )
             {
-            // InternalDataDSL.g:18558:1: ( () )
-            // InternalDataDSL.g:18559:2: ()
+            // InternalDataDSL.g:19644:1: ( () )
+            // InternalDataDSL.g:19645:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getXDoWhileExpressionAction_0()); 
             }
-            // InternalDataDSL.g:18560:2: ()
-            // InternalDataDSL.g:18560:3: 
+            // InternalDataDSL.g:19646:2: ()
+            // InternalDataDSL.g:19646:3: 
             {
             }
 
@@ -61367,16 +64988,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__1"
-    // InternalDataDSL.g:18568:1: rule__XDoWhileExpression__Group__1 : rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 ;
+    // InternalDataDSL.g:19654:1: rule__XDoWhileExpression__Group__1 : rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 ;
     public final void rule__XDoWhileExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18572:1: ( rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 )
-            // InternalDataDSL.g:18573:2: rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2
+            // InternalDataDSL.g:19658:1: ( rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2 )
+            // InternalDataDSL.g:19659:2: rule__XDoWhileExpression__Group__1__Impl rule__XDoWhileExpression__Group__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XDoWhileExpression__Group__1__Impl();
 
             state._fsp--;
@@ -61405,22 +65026,22 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__1__Impl"
-    // InternalDataDSL.g:18580:1: rule__XDoWhileExpression__Group__1__Impl : ( 'do' ) ;
+    // InternalDataDSL.g:19666:1: rule__XDoWhileExpression__Group__1__Impl : ( 'do' ) ;
     public final void rule__XDoWhileExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18584:1: ( ( 'do' ) )
-            // InternalDataDSL.g:18585:1: ( 'do' )
+            // InternalDataDSL.g:19670:1: ( ( 'do' ) )
+            // InternalDataDSL.g:19671:1: ( 'do' )
             {
-            // InternalDataDSL.g:18585:1: ( 'do' )
-            // InternalDataDSL.g:18586:2: 'do'
+            // InternalDataDSL.g:19671:1: ( 'do' )
+            // InternalDataDSL.g:19672:2: 'do'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); 
             }
-            match(input,136,FOLLOW_2); if (state.failed) return ;
+            match(input,142,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1()); 
             }
@@ -61446,16 +65067,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__2"
-    // InternalDataDSL.g:18595:1: rule__XDoWhileExpression__Group__2 : rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 ;
+    // InternalDataDSL.g:19681:1: rule__XDoWhileExpression__Group__2 : rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 ;
     public final void rule__XDoWhileExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18599:1: ( rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 )
-            // InternalDataDSL.g:18600:2: rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3
+            // InternalDataDSL.g:19685:1: ( rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3 )
+            // InternalDataDSL.g:19686:2: rule__XDoWhileExpression__Group__2__Impl rule__XDoWhileExpression__Group__3
             {
-            pushFollow(FOLLOW_140);
+            pushFollow(FOLLOW_148);
             rule__XDoWhileExpression__Group__2__Impl();
 
             state._fsp--;
@@ -61484,23 +65105,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__2__Impl"
-    // InternalDataDSL.g:18607:1: rule__XDoWhileExpression__Group__2__Impl : ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) ;
+    // InternalDataDSL.g:19693:1: rule__XDoWhileExpression__Group__2__Impl : ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) ;
     public final void rule__XDoWhileExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18611:1: ( ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) )
-            // InternalDataDSL.g:18612:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            // InternalDataDSL.g:19697:1: ( ( ( rule__XDoWhileExpression__BodyAssignment_2 ) ) )
+            // InternalDataDSL.g:19698:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
             {
-            // InternalDataDSL.g:18612:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
-            // InternalDataDSL.g:18613:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            // InternalDataDSL.g:19698:1: ( ( rule__XDoWhileExpression__BodyAssignment_2 ) )
+            // InternalDataDSL.g:19699:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getBodyAssignment_2()); 
             }
-            // InternalDataDSL.g:18614:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
-            // InternalDataDSL.g:18614:3: rule__XDoWhileExpression__BodyAssignment_2
+            // InternalDataDSL.g:19700:2: ( rule__XDoWhileExpression__BodyAssignment_2 )
+            // InternalDataDSL.g:19700:3: rule__XDoWhileExpression__BodyAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__BodyAssignment_2();
@@ -61535,16 +65156,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__3"
-    // InternalDataDSL.g:18622:1: rule__XDoWhileExpression__Group__3 : rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 ;
+    // InternalDataDSL.g:19708:1: rule__XDoWhileExpression__Group__3 : rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 ;
     public final void rule__XDoWhileExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18626:1: ( rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 )
-            // InternalDataDSL.g:18627:2: rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4
+            // InternalDataDSL.g:19712:1: ( rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4 )
+            // InternalDataDSL.g:19713:2: rule__XDoWhileExpression__Group__3__Impl rule__XDoWhileExpression__Group__4
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XDoWhileExpression__Group__3__Impl();
 
             state._fsp--;
@@ -61573,22 +65194,22 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__3__Impl"
-    // InternalDataDSL.g:18634:1: rule__XDoWhileExpression__Group__3__Impl : ( 'while' ) ;
+    // InternalDataDSL.g:19720:1: rule__XDoWhileExpression__Group__3__Impl : ( 'while' ) ;
     public final void rule__XDoWhileExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18638:1: ( ( 'while' ) )
-            // InternalDataDSL.g:18639:1: ( 'while' )
+            // InternalDataDSL.g:19724:1: ( ( 'while' ) )
+            // InternalDataDSL.g:19725:1: ( 'while' )
             {
-            // InternalDataDSL.g:18639:1: ( 'while' )
-            // InternalDataDSL.g:18640:2: 'while'
+            // InternalDataDSL.g:19725:1: ( 'while' )
+            // InternalDataDSL.g:19726:2: 'while'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); 
             }
-            match(input,135,FOLLOW_2); if (state.failed) return ;
+            match(input,141,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3()); 
             }
@@ -61614,16 +65235,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__4"
-    // InternalDataDSL.g:18649:1: rule__XDoWhileExpression__Group__4 : rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 ;
+    // InternalDataDSL.g:19735:1: rule__XDoWhileExpression__Group__4 : rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 ;
     public final void rule__XDoWhileExpression__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18653:1: ( rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 )
-            // InternalDataDSL.g:18654:2: rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5
+            // InternalDataDSL.g:19739:1: ( rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5 )
+            // InternalDataDSL.g:19740:2: rule__XDoWhileExpression__Group__4__Impl rule__XDoWhileExpression__Group__5
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XDoWhileExpression__Group__4__Impl();
 
             state._fsp--;
@@ -61652,22 +65273,22 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__4__Impl"
-    // InternalDataDSL.g:18661:1: rule__XDoWhileExpression__Group__4__Impl : ( '(' ) ;
+    // InternalDataDSL.g:19747:1: rule__XDoWhileExpression__Group__4__Impl : ( '(' ) ;
     public final void rule__XDoWhileExpression__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18665:1: ( ( '(' ) )
-            // InternalDataDSL.g:18666:1: ( '(' )
+            // InternalDataDSL.g:19751:1: ( ( '(' ) )
+            // InternalDataDSL.g:19752:1: ( '(' )
             {
-            // InternalDataDSL.g:18666:1: ( '(' )
-            // InternalDataDSL.g:18667:2: '('
+            // InternalDataDSL.g:19752:1: ( '(' )
+            // InternalDataDSL.g:19753:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4()); 
             }
@@ -61693,16 +65314,16 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__5"
-    // InternalDataDSL.g:18676:1: rule__XDoWhileExpression__Group__5 : rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 ;
+    // InternalDataDSL.g:19762:1: rule__XDoWhileExpression__Group__5 : rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 ;
     public final void rule__XDoWhileExpression__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18680:1: ( rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 )
-            // InternalDataDSL.g:18681:2: rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6
+            // InternalDataDSL.g:19766:1: ( rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6 )
+            // InternalDataDSL.g:19767:2: rule__XDoWhileExpression__Group__5__Impl rule__XDoWhileExpression__Group__6
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XDoWhileExpression__Group__5__Impl();
 
             state._fsp--;
@@ -61731,23 +65352,23 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__5__Impl"
-    // InternalDataDSL.g:18688:1: rule__XDoWhileExpression__Group__5__Impl : ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) ;
+    // InternalDataDSL.g:19774:1: rule__XDoWhileExpression__Group__5__Impl : ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) ;
     public final void rule__XDoWhileExpression__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18692:1: ( ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) )
-            // InternalDataDSL.g:18693:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            // InternalDataDSL.g:19778:1: ( ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) ) )
+            // InternalDataDSL.g:19779:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
             {
-            // InternalDataDSL.g:18693:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
-            // InternalDataDSL.g:18694:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            // InternalDataDSL.g:19779:1: ( ( rule__XDoWhileExpression__PredicateAssignment_5 ) )
+            // InternalDataDSL.g:19780:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getPredicateAssignment_5()); 
             }
-            // InternalDataDSL.g:18695:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
-            // InternalDataDSL.g:18695:3: rule__XDoWhileExpression__PredicateAssignment_5
+            // InternalDataDSL.g:19781:2: ( rule__XDoWhileExpression__PredicateAssignment_5 )
+            // InternalDataDSL.g:19781:3: rule__XDoWhileExpression__PredicateAssignment_5
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__PredicateAssignment_5();
@@ -61782,14 +65403,14 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__6"
-    // InternalDataDSL.g:18703:1: rule__XDoWhileExpression__Group__6 : rule__XDoWhileExpression__Group__6__Impl ;
+    // InternalDataDSL.g:19789:1: rule__XDoWhileExpression__Group__6 : rule__XDoWhileExpression__Group__6__Impl ;
     public final void rule__XDoWhileExpression__Group__6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18707:1: ( rule__XDoWhileExpression__Group__6__Impl )
-            // InternalDataDSL.g:18708:2: rule__XDoWhileExpression__Group__6__Impl
+            // InternalDataDSL.g:19793:1: ( rule__XDoWhileExpression__Group__6__Impl )
+            // InternalDataDSL.g:19794:2: rule__XDoWhileExpression__Group__6__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XDoWhileExpression__Group__6__Impl();
@@ -61815,22 +65436,22 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__Group__6__Impl"
-    // InternalDataDSL.g:18714:1: rule__XDoWhileExpression__Group__6__Impl : ( ')' ) ;
+    // InternalDataDSL.g:19800:1: rule__XDoWhileExpression__Group__6__Impl : ( ')' ) ;
     public final void rule__XDoWhileExpression__Group__6__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18718:1: ( ( ')' ) )
-            // InternalDataDSL.g:18719:1: ( ')' )
+            // InternalDataDSL.g:19804:1: ( ( ')' ) )
+            // InternalDataDSL.g:19805:1: ( ')' )
             {
-            // InternalDataDSL.g:18719:1: ( ')' )
-            // InternalDataDSL.g:18720:2: ')'
+            // InternalDataDSL.g:19805:1: ( ')' )
+            // InternalDataDSL.g:19806:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6()); 
             }
@@ -61856,14 +65477,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__0"
-    // InternalDataDSL.g:18730:1: rule__XBlockExpression__Group__0 : rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 ;
+    // InternalDataDSL.g:19816:1: rule__XBlockExpression__Group__0 : rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 ;
     public final void rule__XBlockExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18734:1: ( rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 )
-            // InternalDataDSL.g:18735:2: rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1
+            // InternalDataDSL.g:19820:1: ( rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1 )
+            // InternalDataDSL.g:19821:2: rule__XBlockExpression__Group__0__Impl rule__XBlockExpression__Group__1
             {
             pushFollow(FOLLOW_8);
             rule__XBlockExpression__Group__0__Impl();
@@ -61894,23 +65515,23 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__0__Impl"
-    // InternalDataDSL.g:18742:1: rule__XBlockExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:19828:1: rule__XBlockExpression__Group__0__Impl : ( () ) ;
     public final void rule__XBlockExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18746:1: ( ( () ) )
-            // InternalDataDSL.g:18747:1: ( () )
+            // InternalDataDSL.g:19832:1: ( ( () ) )
+            // InternalDataDSL.g:19833:1: ( () )
             {
-            // InternalDataDSL.g:18747:1: ( () )
-            // InternalDataDSL.g:18748:2: ()
+            // InternalDataDSL.g:19833:1: ( () )
+            // InternalDataDSL.g:19834:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getXBlockExpressionAction_0()); 
             }
-            // InternalDataDSL.g:18749:2: ()
-            // InternalDataDSL.g:18749:3: 
+            // InternalDataDSL.g:19835:2: ()
+            // InternalDataDSL.g:19835:3: 
             {
             }
 
@@ -61935,16 +65556,16 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__1"
-    // InternalDataDSL.g:18757:1: rule__XBlockExpression__Group__1 : rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 ;
+    // InternalDataDSL.g:19843:1: rule__XBlockExpression__Group__1 : rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 ;
     public final void rule__XBlockExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18761:1: ( rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 )
-            // InternalDataDSL.g:18762:2: rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2
+            // InternalDataDSL.g:19847:1: ( rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2 )
+            // InternalDataDSL.g:19848:2: rule__XBlockExpression__Group__1__Impl rule__XBlockExpression__Group__2
             {
-            pushFollow(FOLLOW_142);
+            pushFollow(FOLLOW_150);
             rule__XBlockExpression__Group__1__Impl();
 
             state._fsp--;
@@ -61973,17 +65594,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__1__Impl"
-    // InternalDataDSL.g:18769:1: rule__XBlockExpression__Group__1__Impl : ( '{' ) ;
+    // InternalDataDSL.g:19855:1: rule__XBlockExpression__Group__1__Impl : ( '{' ) ;
     public final void rule__XBlockExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18773:1: ( ( '{' ) )
-            // InternalDataDSL.g:18774:1: ( '{' )
+            // InternalDataDSL.g:19859:1: ( ( '{' ) )
+            // InternalDataDSL.g:19860:1: ( '{' )
             {
-            // InternalDataDSL.g:18774:1: ( '{' )
-            // InternalDataDSL.g:18775:2: '{'
+            // InternalDataDSL.g:19860:1: ( '{' )
+            // InternalDataDSL.g:19861:2: '{'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1()); 
@@ -62014,16 +65635,16 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__2"
-    // InternalDataDSL.g:18784:1: rule__XBlockExpression__Group__2 : rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 ;
+    // InternalDataDSL.g:19870:1: rule__XBlockExpression__Group__2 : rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 ;
     public final void rule__XBlockExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18788:1: ( rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 )
-            // InternalDataDSL.g:18789:2: rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3
+            // InternalDataDSL.g:19874:1: ( rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3 )
+            // InternalDataDSL.g:19875:2: rule__XBlockExpression__Group__2__Impl rule__XBlockExpression__Group__3
             {
-            pushFollow(FOLLOW_142);
+            pushFollow(FOLLOW_150);
             rule__XBlockExpression__Group__2__Impl();
 
             state._fsp--;
@@ -62052,37 +65673,37 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__2__Impl"
-    // InternalDataDSL.g:18796:1: rule__XBlockExpression__Group__2__Impl : ( ( rule__XBlockExpression__Group_2__0 )* ) ;
+    // InternalDataDSL.g:19882:1: rule__XBlockExpression__Group__2__Impl : ( ( rule__XBlockExpression__Group_2__0 )* ) ;
     public final void rule__XBlockExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18800:1: ( ( ( rule__XBlockExpression__Group_2__0 )* ) )
-            // InternalDataDSL.g:18801:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            // InternalDataDSL.g:19886:1: ( ( ( rule__XBlockExpression__Group_2__0 )* ) )
+            // InternalDataDSL.g:19887:1: ( ( rule__XBlockExpression__Group_2__0 )* )
             {
-            // InternalDataDSL.g:18801:1: ( ( rule__XBlockExpression__Group_2__0 )* )
-            // InternalDataDSL.g:18802:2: ( rule__XBlockExpression__Group_2__0 )*
+            // InternalDataDSL.g:19887:1: ( ( rule__XBlockExpression__Group_2__0 )* )
+            // InternalDataDSL.g:19888:2: ( rule__XBlockExpression__Group_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getGroup_2()); 
             }
-            // InternalDataDSL.g:18803:2: ( rule__XBlockExpression__Group_2__0 )*
-            loop150:
+            // InternalDataDSL.g:19889:2: ( rule__XBlockExpression__Group_2__0 )*
+            loop155:
             do {
-                int alt150=2;
-                int LA150_0 = input.LA(1);
+                int alt155=2;
+                int LA155_0 = input.LA(1);
 
-                if ( ((LA150_0>=RULE_STRING && LA150_0<=RULE_DECIMAL)||LA150_0==27||(LA150_0>=34 && LA150_0<=35)||LA150_0==40||(LA150_0>=44 && LA150_0<=50)||LA150_0==74||LA150_0==101||LA150_0==122||(LA150_0>=126 && LA150_0<=127)||LA150_0==129||LA150_0==131||(LA150_0>=135 && LA150_0<=142)||LA150_0==144||(LA150_0>=165 && LA150_0<=166)) ) {
-                    alt150=1;
+                if ( ((LA155_0>=RULE_STRING && LA155_0<=RULE_DECIMAL)||LA155_0==27||(LA155_0>=34 && LA155_0<=35)||LA155_0==40||(LA155_0>=44 && LA155_0<=50)||LA155_0==74||LA155_0==103||LA155_0==128||(LA155_0>=132 && LA155_0<=133)||LA155_0==135||LA155_0==137||(LA155_0>=141 && LA155_0<=148)||LA155_0==150||(LA155_0>=178 && LA155_0<=179)) ) {
+                    alt155=1;
                 }
 
 
-                switch (alt150) {
+                switch (alt155) {
             	case 1 :
-            	    // InternalDataDSL.g:18803:3: rule__XBlockExpression__Group_2__0
+            	    // InternalDataDSL.g:19889:3: rule__XBlockExpression__Group_2__0
             	    {
-            	    pushFollow(FOLLOW_127);
+            	    pushFollow(FOLLOW_135);
             	    rule__XBlockExpression__Group_2__0();
 
             	    state._fsp--;
@@ -62092,7 +65713,7 @@
             	    break;
 
             	default :
-            	    break loop150;
+            	    break loop155;
                 }
             } while (true);
 
@@ -62121,14 +65742,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__3"
-    // InternalDataDSL.g:18811:1: rule__XBlockExpression__Group__3 : rule__XBlockExpression__Group__3__Impl ;
+    // InternalDataDSL.g:19897:1: rule__XBlockExpression__Group__3 : rule__XBlockExpression__Group__3__Impl ;
     public final void rule__XBlockExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18815:1: ( rule__XBlockExpression__Group__3__Impl )
-            // InternalDataDSL.g:18816:2: rule__XBlockExpression__Group__3__Impl
+            // InternalDataDSL.g:19901:1: ( rule__XBlockExpression__Group__3__Impl )
+            // InternalDataDSL.g:19902:2: rule__XBlockExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group__3__Impl();
@@ -62154,17 +65775,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group__3__Impl"
-    // InternalDataDSL.g:18822:1: rule__XBlockExpression__Group__3__Impl : ( '}' ) ;
+    // InternalDataDSL.g:19908:1: rule__XBlockExpression__Group__3__Impl : ( '}' ) ;
     public final void rule__XBlockExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18826:1: ( ( '}' ) )
-            // InternalDataDSL.g:18827:1: ( '}' )
+            // InternalDataDSL.g:19912:1: ( ( '}' ) )
+            // InternalDataDSL.g:19913:1: ( '}' )
             {
-            // InternalDataDSL.g:18827:1: ( '}' )
-            // InternalDataDSL.g:18828:2: '}'
+            // InternalDataDSL.g:19913:1: ( '}' )
+            // InternalDataDSL.g:19914:2: '}'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getRightCurlyBracketKeyword_3()); 
@@ -62195,16 +65816,16 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__0"
-    // InternalDataDSL.g:18838:1: rule__XBlockExpression__Group_2__0 : rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 ;
+    // InternalDataDSL.g:19924:1: rule__XBlockExpression__Group_2__0 : rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 ;
     public final void rule__XBlockExpression__Group_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18842:1: ( rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 )
-            // InternalDataDSL.g:18843:2: rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1
+            // InternalDataDSL.g:19928:1: ( rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1 )
+            // InternalDataDSL.g:19929:2: rule__XBlockExpression__Group_2__0__Impl rule__XBlockExpression__Group_2__1
             {
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_84);
             rule__XBlockExpression__Group_2__0__Impl();
 
             state._fsp--;
@@ -62233,23 +65854,23 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__0__Impl"
-    // InternalDataDSL.g:18850:1: rule__XBlockExpression__Group_2__0__Impl : ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) ;
+    // InternalDataDSL.g:19936:1: rule__XBlockExpression__Group_2__0__Impl : ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) ;
     public final void rule__XBlockExpression__Group_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18854:1: ( ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) )
-            // InternalDataDSL.g:18855:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            // InternalDataDSL.g:19940:1: ( ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) ) )
+            // InternalDataDSL.g:19941:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
             {
-            // InternalDataDSL.g:18855:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
-            // InternalDataDSL.g:18856:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            // InternalDataDSL.g:19941:1: ( ( rule__XBlockExpression__ExpressionsAssignment_2_0 ) )
+            // InternalDataDSL.g:19942:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getExpressionsAssignment_2_0()); 
             }
-            // InternalDataDSL.g:18857:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
-            // InternalDataDSL.g:18857:3: rule__XBlockExpression__ExpressionsAssignment_2_0
+            // InternalDataDSL.g:19943:2: ( rule__XBlockExpression__ExpressionsAssignment_2_0 )
+            // InternalDataDSL.g:19943:3: rule__XBlockExpression__ExpressionsAssignment_2_0
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__ExpressionsAssignment_2_0();
@@ -62284,14 +65905,14 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__1"
-    // InternalDataDSL.g:18865:1: rule__XBlockExpression__Group_2__1 : rule__XBlockExpression__Group_2__1__Impl ;
+    // InternalDataDSL.g:19951:1: rule__XBlockExpression__Group_2__1 : rule__XBlockExpression__Group_2__1__Impl ;
     public final void rule__XBlockExpression__Group_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18869:1: ( rule__XBlockExpression__Group_2__1__Impl )
-            // InternalDataDSL.g:18870:2: rule__XBlockExpression__Group_2__1__Impl
+            // InternalDataDSL.g:19955:1: ( rule__XBlockExpression__Group_2__1__Impl )
+            // InternalDataDSL.g:19956:2: rule__XBlockExpression__Group_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBlockExpression__Group_2__1__Impl();
@@ -62317,33 +65938,33 @@
 
 
     // $ANTLR start "rule__XBlockExpression__Group_2__1__Impl"
-    // InternalDataDSL.g:18876:1: rule__XBlockExpression__Group_2__1__Impl : ( ( ';' )? ) ;
+    // InternalDataDSL.g:19962:1: rule__XBlockExpression__Group_2__1__Impl : ( ( ';' )? ) ;
     public final void rule__XBlockExpression__Group_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18880:1: ( ( ( ';' )? ) )
-            // InternalDataDSL.g:18881:1: ( ( ';' )? )
+            // InternalDataDSL.g:19966:1: ( ( ( ';' )? ) )
+            // InternalDataDSL.g:19967:1: ( ( ';' )? )
             {
-            // InternalDataDSL.g:18881:1: ( ( ';' )? )
-            // InternalDataDSL.g:18882:2: ( ';' )?
+            // InternalDataDSL.g:19967:1: ( ( ';' )? )
+            // InternalDataDSL.g:19968:2: ( ';' )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1()); 
             }
-            // InternalDataDSL.g:18883:2: ( ';' )?
-            int alt151=2;
-            int LA151_0 = input.LA(1);
+            // InternalDataDSL.g:19969:2: ( ';' )?
+            int alt156=2;
+            int LA156_0 = input.LA(1);
 
-            if ( (LA151_0==120) ) {
-                alt151=1;
+            if ( (LA156_0==126) ) {
+                alt156=1;
             }
-            switch (alt151) {
+            switch (alt156) {
                 case 1 :
-                    // InternalDataDSL.g:18883:3: ';'
+                    // InternalDataDSL.g:19969:3: ';'
                     {
-                    match(input,120,FOLLOW_2); if (state.failed) return ;
+                    match(input,126,FOLLOW_2); if (state.failed) return ;
 
                     }
                     break;
@@ -62375,16 +65996,16 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__0"
-    // InternalDataDSL.g:18892:1: rule__XVariableDeclaration__Group__0 : rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 ;
+    // InternalDataDSL.g:19978:1: rule__XVariableDeclaration__Group__0 : rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 ;
     public final void rule__XVariableDeclaration__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18896:1: ( rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 )
-            // InternalDataDSL.g:18897:2: rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1
+            // InternalDataDSL.g:19982:1: ( rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1 )
+            // InternalDataDSL.g:19983:2: rule__XVariableDeclaration__Group__0__Impl rule__XVariableDeclaration__Group__1
             {
-            pushFollow(FOLLOW_143);
+            pushFollow(FOLLOW_151);
             rule__XVariableDeclaration__Group__0__Impl();
 
             state._fsp--;
@@ -62413,23 +66034,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__0__Impl"
-    // InternalDataDSL.g:18904:1: rule__XVariableDeclaration__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:19990:1: rule__XVariableDeclaration__Group__0__Impl : ( () ) ;
     public final void rule__XVariableDeclaration__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18908:1: ( ( () ) )
-            // InternalDataDSL.g:18909:1: ( () )
+            // InternalDataDSL.g:19994:1: ( ( () ) )
+            // InternalDataDSL.g:19995:1: ( () )
             {
-            // InternalDataDSL.g:18909:1: ( () )
-            // InternalDataDSL.g:18910:2: ()
+            // InternalDataDSL.g:19995:1: ( () )
+            // InternalDataDSL.g:19996:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getXVariableDeclarationAction_0()); 
             }
-            // InternalDataDSL.g:18911:2: ()
-            // InternalDataDSL.g:18911:3: 
+            // InternalDataDSL.g:19997:2: ()
+            // InternalDataDSL.g:19997:3: 
             {
             }
 
@@ -62454,16 +66075,16 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__1"
-    // InternalDataDSL.g:18919:1: rule__XVariableDeclaration__Group__1 : rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 ;
+    // InternalDataDSL.g:20005:1: rule__XVariableDeclaration__Group__1 : rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 ;
     public final void rule__XVariableDeclaration__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18923:1: ( rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 )
-            // InternalDataDSL.g:18924:2: rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2
+            // InternalDataDSL.g:20009:1: ( rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2 )
+            // InternalDataDSL.g:20010:2: rule__XVariableDeclaration__Group__1__Impl rule__XVariableDeclaration__Group__2
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XVariableDeclaration__Group__1__Impl();
 
             state._fsp--;
@@ -62492,23 +66113,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__1__Impl"
-    // InternalDataDSL.g:18931:1: rule__XVariableDeclaration__Group__1__Impl : ( ( rule__XVariableDeclaration__Alternatives_1 ) ) ;
+    // InternalDataDSL.g:20017:1: rule__XVariableDeclaration__Group__1__Impl : ( ( rule__XVariableDeclaration__Alternatives_1 ) ) ;
     public final void rule__XVariableDeclaration__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18935:1: ( ( ( rule__XVariableDeclaration__Alternatives_1 ) ) )
-            // InternalDataDSL.g:18936:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            // InternalDataDSL.g:20021:1: ( ( ( rule__XVariableDeclaration__Alternatives_1 ) ) )
+            // InternalDataDSL.g:20022:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
             {
-            // InternalDataDSL.g:18936:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
-            // InternalDataDSL.g:18937:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            // InternalDataDSL.g:20022:1: ( ( rule__XVariableDeclaration__Alternatives_1 ) )
+            // InternalDataDSL.g:20023:2: ( rule__XVariableDeclaration__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_1()); 
             }
-            // InternalDataDSL.g:18938:2: ( rule__XVariableDeclaration__Alternatives_1 )
-            // InternalDataDSL.g:18938:3: rule__XVariableDeclaration__Alternatives_1
+            // InternalDataDSL.g:20024:2: ( rule__XVariableDeclaration__Alternatives_1 )
+            // InternalDataDSL.g:20024:3: rule__XVariableDeclaration__Alternatives_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Alternatives_1();
@@ -62543,16 +66164,16 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__2"
-    // InternalDataDSL.g:18946:1: rule__XVariableDeclaration__Group__2 : rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 ;
+    // InternalDataDSL.g:20032:1: rule__XVariableDeclaration__Group__2 : rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 ;
     public final void rule__XVariableDeclaration__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18950:1: ( rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 )
-            // InternalDataDSL.g:18951:2: rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3
+            // InternalDataDSL.g:20036:1: ( rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3 )
+            // InternalDataDSL.g:20037:2: rule__XVariableDeclaration__Group__2__Impl rule__XVariableDeclaration__Group__3
             {
-            pushFollow(FOLLOW_85);
+            pushFollow(FOLLOW_93);
             rule__XVariableDeclaration__Group__2__Impl();
 
             state._fsp--;
@@ -62581,23 +66202,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__2__Impl"
-    // InternalDataDSL.g:18958:1: rule__XVariableDeclaration__Group__2__Impl : ( ( rule__XVariableDeclaration__Alternatives_2 ) ) ;
+    // InternalDataDSL.g:20044:1: rule__XVariableDeclaration__Group__2__Impl : ( ( rule__XVariableDeclaration__Alternatives_2 ) ) ;
     public final void rule__XVariableDeclaration__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18962:1: ( ( ( rule__XVariableDeclaration__Alternatives_2 ) ) )
-            // InternalDataDSL.g:18963:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            // InternalDataDSL.g:20048:1: ( ( ( rule__XVariableDeclaration__Alternatives_2 ) ) )
+            // InternalDataDSL.g:20049:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
             {
-            // InternalDataDSL.g:18963:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
-            // InternalDataDSL.g:18964:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            // InternalDataDSL.g:20049:1: ( ( rule__XVariableDeclaration__Alternatives_2 ) )
+            // InternalDataDSL.g:20050:2: ( rule__XVariableDeclaration__Alternatives_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getAlternatives_2()); 
             }
-            // InternalDataDSL.g:18965:2: ( rule__XVariableDeclaration__Alternatives_2 )
-            // InternalDataDSL.g:18965:3: rule__XVariableDeclaration__Alternatives_2
+            // InternalDataDSL.g:20051:2: ( rule__XVariableDeclaration__Alternatives_2 )
+            // InternalDataDSL.g:20051:3: rule__XVariableDeclaration__Alternatives_2
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Alternatives_2();
@@ -62632,14 +66253,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__3"
-    // InternalDataDSL.g:18973:1: rule__XVariableDeclaration__Group__3 : rule__XVariableDeclaration__Group__3__Impl ;
+    // InternalDataDSL.g:20059:1: rule__XVariableDeclaration__Group__3 : rule__XVariableDeclaration__Group__3__Impl ;
     public final void rule__XVariableDeclaration__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18977:1: ( rule__XVariableDeclaration__Group__3__Impl )
-            // InternalDataDSL.g:18978:2: rule__XVariableDeclaration__Group__3__Impl
+            // InternalDataDSL.g:20063:1: ( rule__XVariableDeclaration__Group__3__Impl )
+            // InternalDataDSL.g:20064:2: rule__XVariableDeclaration__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group__3__Impl();
@@ -62665,31 +66286,31 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group__3__Impl"
-    // InternalDataDSL.g:18984:1: rule__XVariableDeclaration__Group__3__Impl : ( ( rule__XVariableDeclaration__Group_3__0 )? ) ;
+    // InternalDataDSL.g:20070:1: rule__XVariableDeclaration__Group__3__Impl : ( ( rule__XVariableDeclaration__Group_3__0 )? ) ;
     public final void rule__XVariableDeclaration__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:18988:1: ( ( ( rule__XVariableDeclaration__Group_3__0 )? ) )
-            // InternalDataDSL.g:18989:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            // InternalDataDSL.g:20074:1: ( ( ( rule__XVariableDeclaration__Group_3__0 )? ) )
+            // InternalDataDSL.g:20075:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
             {
-            // InternalDataDSL.g:18989:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
-            // InternalDataDSL.g:18990:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            // InternalDataDSL.g:20075:1: ( ( rule__XVariableDeclaration__Group_3__0 )? )
+            // InternalDataDSL.g:20076:2: ( rule__XVariableDeclaration__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:18991:2: ( rule__XVariableDeclaration__Group_3__0 )?
-            int alt152=2;
-            int LA152_0 = input.LA(1);
+            // InternalDataDSL.g:20077:2: ( rule__XVariableDeclaration__Group_3__0 )?
+            int alt157=2;
+            int LA157_0 = input.LA(1);
 
-            if ( (LA152_0==13) ) {
-                alt152=1;
+            if ( (LA157_0==13) ) {
+                alt157=1;
             }
-            switch (alt152) {
+            switch (alt157) {
                 case 1 :
-                    // InternalDataDSL.g:18991:3: rule__XVariableDeclaration__Group_3__0
+                    // InternalDataDSL.g:20077:3: rule__XVariableDeclaration__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XVariableDeclaration__Group_3__0();
@@ -62727,14 +66348,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0"
-    // InternalDataDSL.g:19000:1: rule__XVariableDeclaration__Group_2_0__0 : rule__XVariableDeclaration__Group_2_0__0__Impl ;
+    // InternalDataDSL.g:20086:1: rule__XVariableDeclaration__Group_2_0__0 : rule__XVariableDeclaration__Group_2_0__0__Impl ;
     public final void rule__XVariableDeclaration__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19004:1: ( rule__XVariableDeclaration__Group_2_0__0__Impl )
-            // InternalDataDSL.g:19005:2: rule__XVariableDeclaration__Group_2_0__0__Impl
+            // InternalDataDSL.g:20090:1: ( rule__XVariableDeclaration__Group_2_0__0__Impl )
+            // InternalDataDSL.g:20091:2: rule__XVariableDeclaration__Group_2_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0__0__Impl();
@@ -62760,23 +66381,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0__0__Impl"
-    // InternalDataDSL.g:19011:1: rule__XVariableDeclaration__Group_2_0__0__Impl : ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) ;
+    // InternalDataDSL.g:20097:1: rule__XVariableDeclaration__Group_2_0__0__Impl : ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19015:1: ( ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) )
-            // InternalDataDSL.g:19016:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            // InternalDataDSL.g:20101:1: ( ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) ) )
+            // InternalDataDSL.g:20102:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
             {
-            // InternalDataDSL.g:19016:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
-            // InternalDataDSL.g:19017:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            // InternalDataDSL.g:20102:1: ( ( rule__XVariableDeclaration__Group_2_0_0__0 ) )
+            // InternalDataDSL.g:20103:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0_0()); 
             }
-            // InternalDataDSL.g:19018:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
-            // InternalDataDSL.g:19018:3: rule__XVariableDeclaration__Group_2_0_0__0
+            // InternalDataDSL.g:20104:2: ( rule__XVariableDeclaration__Group_2_0_0__0 )
+            // InternalDataDSL.g:20104:3: rule__XVariableDeclaration__Group_2_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0_0__0();
@@ -62811,14 +66432,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0"
-    // InternalDataDSL.g:19027:1: rule__XVariableDeclaration__Group_2_0_0__0 : rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 ;
+    // InternalDataDSL.g:20113:1: rule__XVariableDeclaration__Group_2_0_0__0 : rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 ;
     public final void rule__XVariableDeclaration__Group_2_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19031:1: ( rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 )
-            // InternalDataDSL.g:19032:2: rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1
+            // InternalDataDSL.g:20117:1: ( rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1 )
+            // InternalDataDSL.g:20118:2: rule__XVariableDeclaration__Group_2_0_0__0__Impl rule__XVariableDeclaration__Group_2_0_0__1
             {
             pushFollow(FOLLOW_7);
             rule__XVariableDeclaration__Group_2_0_0__0__Impl();
@@ -62849,23 +66470,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__0__Impl"
-    // InternalDataDSL.g:19039:1: rule__XVariableDeclaration__Group_2_0_0__0__Impl : ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) ;
+    // InternalDataDSL.g:20125:1: rule__XVariableDeclaration__Group_2_0_0__0__Impl : ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19043:1: ( ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) )
-            // InternalDataDSL.g:19044:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            // InternalDataDSL.g:20129:1: ( ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) ) )
+            // InternalDataDSL.g:20130:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
             {
-            // InternalDataDSL.g:19044:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
-            // InternalDataDSL.g:19045:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            // InternalDataDSL.g:20130:1: ( ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 ) )
+            // InternalDataDSL.g:20131:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getTypeAssignment_2_0_0_0()); 
             }
-            // InternalDataDSL.g:19046:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
-            // InternalDataDSL.g:19046:3: rule__XVariableDeclaration__TypeAssignment_2_0_0_0
+            // InternalDataDSL.g:20132:2: ( rule__XVariableDeclaration__TypeAssignment_2_0_0_0 )
+            // InternalDataDSL.g:20132:3: rule__XVariableDeclaration__TypeAssignment_2_0_0_0
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__TypeAssignment_2_0_0_0();
@@ -62900,14 +66521,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1"
-    // InternalDataDSL.g:19054:1: rule__XVariableDeclaration__Group_2_0_0__1 : rule__XVariableDeclaration__Group_2_0_0__1__Impl ;
+    // InternalDataDSL.g:20140:1: rule__XVariableDeclaration__Group_2_0_0__1 : rule__XVariableDeclaration__Group_2_0_0__1__Impl ;
     public final void rule__XVariableDeclaration__Group_2_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19058:1: ( rule__XVariableDeclaration__Group_2_0_0__1__Impl )
-            // InternalDataDSL.g:19059:2: rule__XVariableDeclaration__Group_2_0_0__1__Impl
+            // InternalDataDSL.g:20144:1: ( rule__XVariableDeclaration__Group_2_0_0__1__Impl )
+            // InternalDataDSL.g:20145:2: rule__XVariableDeclaration__Group_2_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_2_0_0__1__Impl();
@@ -62933,23 +66554,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_2_0_0__1__Impl"
-    // InternalDataDSL.g:19065:1: rule__XVariableDeclaration__Group_2_0_0__1__Impl : ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) ;
+    // InternalDataDSL.g:20151:1: rule__XVariableDeclaration__Group_2_0_0__1__Impl : ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) ;
     public final void rule__XVariableDeclaration__Group_2_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19069:1: ( ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) )
-            // InternalDataDSL.g:19070:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            // InternalDataDSL.g:20155:1: ( ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) ) )
+            // InternalDataDSL.g:20156:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
             {
-            // InternalDataDSL.g:19070:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
-            // InternalDataDSL.g:19071:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            // InternalDataDSL.g:20156:1: ( ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 ) )
+            // InternalDataDSL.g:20157:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameAssignment_2_0_0_1()); 
             }
-            // InternalDataDSL.g:19072:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
-            // InternalDataDSL.g:19072:3: rule__XVariableDeclaration__NameAssignment_2_0_0_1
+            // InternalDataDSL.g:20158:2: ( rule__XVariableDeclaration__NameAssignment_2_0_0_1 )
+            // InternalDataDSL.g:20158:3: rule__XVariableDeclaration__NameAssignment_2_0_0_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__NameAssignment_2_0_0_1();
@@ -62984,16 +66605,16 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__0"
-    // InternalDataDSL.g:19081:1: rule__XVariableDeclaration__Group_3__0 : rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 ;
+    // InternalDataDSL.g:20167:1: rule__XVariableDeclaration__Group_3__0 : rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 ;
     public final void rule__XVariableDeclaration__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19085:1: ( rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 )
-            // InternalDataDSL.g:19086:2: rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1
+            // InternalDataDSL.g:20171:1: ( rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1 )
+            // InternalDataDSL.g:20172:2: rule__XVariableDeclaration__Group_3__0__Impl rule__XVariableDeclaration__Group_3__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XVariableDeclaration__Group_3__0__Impl();
 
             state._fsp--;
@@ -63022,17 +66643,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__0__Impl"
-    // InternalDataDSL.g:19093:1: rule__XVariableDeclaration__Group_3__0__Impl : ( '=' ) ;
+    // InternalDataDSL.g:20179:1: rule__XVariableDeclaration__Group_3__0__Impl : ( '=' ) ;
     public final void rule__XVariableDeclaration__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19097:1: ( ( '=' ) )
-            // InternalDataDSL.g:19098:1: ( '=' )
+            // InternalDataDSL.g:20183:1: ( ( '=' ) )
+            // InternalDataDSL.g:20184:1: ( '=' )
             {
-            // InternalDataDSL.g:19098:1: ( '=' )
-            // InternalDataDSL.g:19099:2: '='
+            // InternalDataDSL.g:20184:1: ( '=' )
+            // InternalDataDSL.g:20185:2: '='
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0()); 
@@ -63063,14 +66684,14 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__1"
-    // InternalDataDSL.g:19108:1: rule__XVariableDeclaration__Group_3__1 : rule__XVariableDeclaration__Group_3__1__Impl ;
+    // InternalDataDSL.g:20194:1: rule__XVariableDeclaration__Group_3__1 : rule__XVariableDeclaration__Group_3__1__Impl ;
     public final void rule__XVariableDeclaration__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19112:1: ( rule__XVariableDeclaration__Group_3__1__Impl )
-            // InternalDataDSL.g:19113:2: rule__XVariableDeclaration__Group_3__1__Impl
+            // InternalDataDSL.g:20198:1: ( rule__XVariableDeclaration__Group_3__1__Impl )
+            // InternalDataDSL.g:20199:2: rule__XVariableDeclaration__Group_3__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__Group_3__1__Impl();
@@ -63096,23 +66717,23 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__Group_3__1__Impl"
-    // InternalDataDSL.g:19119:1: rule__XVariableDeclaration__Group_3__1__Impl : ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) ;
+    // InternalDataDSL.g:20205:1: rule__XVariableDeclaration__Group_3__1__Impl : ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) ;
     public final void rule__XVariableDeclaration__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19123:1: ( ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) )
-            // InternalDataDSL.g:19124:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            // InternalDataDSL.g:20209:1: ( ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) ) )
+            // InternalDataDSL.g:20210:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:19124:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
-            // InternalDataDSL.g:19125:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            // InternalDataDSL.g:20210:1: ( ( rule__XVariableDeclaration__RightAssignment_3_1 ) )
+            // InternalDataDSL.g:20211:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getRightAssignment_3_1()); 
             }
-            // InternalDataDSL.g:19126:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
-            // InternalDataDSL.g:19126:3: rule__XVariableDeclaration__RightAssignment_3_1
+            // InternalDataDSL.g:20212:2: ( rule__XVariableDeclaration__RightAssignment_3_1 )
+            // InternalDataDSL.g:20212:3: rule__XVariableDeclaration__RightAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XVariableDeclaration__RightAssignment_3_1();
@@ -63147,16 +66768,16 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__0"
-    // InternalDataDSL.g:19135:1: rule__JvmFormalParameter__Group__0 : rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 ;
+    // InternalDataDSL.g:20221:1: rule__JvmFormalParameter__Group__0 : rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 ;
     public final void rule__JvmFormalParameter__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19139:1: ( rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 )
-            // InternalDataDSL.g:19140:2: rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1
+            // InternalDataDSL.g:20225:1: ( rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1 )
+            // InternalDataDSL.g:20226:2: rule__JvmFormalParameter__Group__0__Impl rule__JvmFormalParameter__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__JvmFormalParameter__Group__0__Impl();
 
             state._fsp--;
@@ -63185,38 +66806,38 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__0__Impl"
-    // InternalDataDSL.g:19147:1: rule__JvmFormalParameter__Group__0__Impl : ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) ;
+    // InternalDataDSL.g:20233:1: rule__JvmFormalParameter__Group__0__Impl : ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) ;
     public final void rule__JvmFormalParameter__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19151:1: ( ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) )
-            // InternalDataDSL.g:19152:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            // InternalDataDSL.g:20237:1: ( ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? ) )
+            // InternalDataDSL.g:20238:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
             {
-            // InternalDataDSL.g:19152:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
-            // InternalDataDSL.g:19153:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            // InternalDataDSL.g:20238:1: ( ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )? )
+            // InternalDataDSL.g:20239:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
             }
-            // InternalDataDSL.g:19154:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
-            int alt153=2;
-            int LA153_0 = input.LA(1);
+            // InternalDataDSL.g:20240:2: ( rule__JvmFormalParameter__ParameterTypeAssignment_0 )?
+            int alt158=2;
+            int LA158_0 = input.LA(1);
 
-            if ( (LA153_0==RULE_ID) ) {
-                int LA153_1 = input.LA(2);
+            if ( (LA158_0==RULE_ID) ) {
+                int LA158_1 = input.LA(2);
 
-                if ( (LA153_1==RULE_ID||LA153_1==27||LA153_1==43||LA153_1==127) ) {
-                    alt153=1;
+                if ( (LA158_1==RULE_ID||LA158_1==27||LA158_1==43||LA158_1==133) ) {
+                    alt158=1;
                 }
             }
-            else if ( (LA153_0==31||LA153_0==122) ) {
-                alt153=1;
+            else if ( (LA158_0==31||LA158_0==128) ) {
+                alt158=1;
             }
-            switch (alt153) {
+            switch (alt158) {
                 case 1 :
-                    // InternalDataDSL.g:19154:3: rule__JvmFormalParameter__ParameterTypeAssignment_0
+                    // InternalDataDSL.g:20240:3: rule__JvmFormalParameter__ParameterTypeAssignment_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmFormalParameter__ParameterTypeAssignment_0();
@@ -63254,14 +66875,14 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__1"
-    // InternalDataDSL.g:19162:1: rule__JvmFormalParameter__Group__1 : rule__JvmFormalParameter__Group__1__Impl ;
+    // InternalDataDSL.g:20248:1: rule__JvmFormalParameter__Group__1 : rule__JvmFormalParameter__Group__1__Impl ;
     public final void rule__JvmFormalParameter__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19166:1: ( rule__JvmFormalParameter__Group__1__Impl )
-            // InternalDataDSL.g:19167:2: rule__JvmFormalParameter__Group__1__Impl
+            // InternalDataDSL.g:20252:1: ( rule__JvmFormalParameter__Group__1__Impl )
+            // InternalDataDSL.g:20253:2: rule__JvmFormalParameter__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__Group__1__Impl();
@@ -63287,23 +66908,23 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__Group__1__Impl"
-    // InternalDataDSL.g:19173:1: rule__JvmFormalParameter__Group__1__Impl : ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) ;
+    // InternalDataDSL.g:20259:1: rule__JvmFormalParameter__Group__1__Impl : ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) ;
     public final void rule__JvmFormalParameter__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19177:1: ( ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) )
-            // InternalDataDSL.g:19178:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            // InternalDataDSL.g:20263:1: ( ( ( rule__JvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalDataDSL.g:20264:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
             {
-            // InternalDataDSL.g:19178:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
-            // InternalDataDSL.g:19179:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            // InternalDataDSL.g:20264:1: ( ( rule__JvmFormalParameter__NameAssignment_1 ) )
+            // InternalDataDSL.g:20265:2: ( rule__JvmFormalParameter__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getNameAssignment_1()); 
             }
-            // InternalDataDSL.g:19180:2: ( rule__JvmFormalParameter__NameAssignment_1 )
-            // InternalDataDSL.g:19180:3: rule__JvmFormalParameter__NameAssignment_1
+            // InternalDataDSL.g:20266:2: ( rule__JvmFormalParameter__NameAssignment_1 )
+            // InternalDataDSL.g:20266:3: rule__JvmFormalParameter__NameAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmFormalParameter__NameAssignment_1();
@@ -63338,14 +66959,14 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__0"
-    // InternalDataDSL.g:19189:1: rule__FullJvmFormalParameter__Group__0 : rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 ;
+    // InternalDataDSL.g:20275:1: rule__FullJvmFormalParameter__Group__0 : rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 ;
     public final void rule__FullJvmFormalParameter__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19193:1: ( rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 )
-            // InternalDataDSL.g:19194:2: rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1
+            // InternalDataDSL.g:20279:1: ( rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1 )
+            // InternalDataDSL.g:20280:2: rule__FullJvmFormalParameter__Group__0__Impl rule__FullJvmFormalParameter__Group__1
             {
             pushFollow(FOLLOW_7);
             rule__FullJvmFormalParameter__Group__0__Impl();
@@ -63376,23 +66997,23 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__0__Impl"
-    // InternalDataDSL.g:19201:1: rule__FullJvmFormalParameter__Group__0__Impl : ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) ;
+    // InternalDataDSL.g:20287:1: rule__FullJvmFormalParameter__Group__0__Impl : ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) ;
     public final void rule__FullJvmFormalParameter__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19205:1: ( ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) )
-            // InternalDataDSL.g:19206:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            // InternalDataDSL.g:20291:1: ( ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) ) )
+            // InternalDataDSL.g:20292:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
             {
-            // InternalDataDSL.g:19206:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
-            // InternalDataDSL.g:19207:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            // InternalDataDSL.g:20292:1: ( ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 ) )
+            // InternalDataDSL.g:20293:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeAssignment_0()); 
             }
-            // InternalDataDSL.g:19208:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
-            // InternalDataDSL.g:19208:3: rule__FullJvmFormalParameter__ParameterTypeAssignment_0
+            // InternalDataDSL.g:20294:2: ( rule__FullJvmFormalParameter__ParameterTypeAssignment_0 )
+            // InternalDataDSL.g:20294:3: rule__FullJvmFormalParameter__ParameterTypeAssignment_0
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__ParameterTypeAssignment_0();
@@ -63427,14 +67048,14 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__1"
-    // InternalDataDSL.g:19216:1: rule__FullJvmFormalParameter__Group__1 : rule__FullJvmFormalParameter__Group__1__Impl ;
+    // InternalDataDSL.g:20302:1: rule__FullJvmFormalParameter__Group__1 : rule__FullJvmFormalParameter__Group__1__Impl ;
     public final void rule__FullJvmFormalParameter__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19220:1: ( rule__FullJvmFormalParameter__Group__1__Impl )
-            // InternalDataDSL.g:19221:2: rule__FullJvmFormalParameter__Group__1__Impl
+            // InternalDataDSL.g:20306:1: ( rule__FullJvmFormalParameter__Group__1__Impl )
+            // InternalDataDSL.g:20307:2: rule__FullJvmFormalParameter__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__Group__1__Impl();
@@ -63460,23 +67081,23 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__Group__1__Impl"
-    // InternalDataDSL.g:19227:1: rule__FullJvmFormalParameter__Group__1__Impl : ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) ;
+    // InternalDataDSL.g:20313:1: rule__FullJvmFormalParameter__Group__1__Impl : ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) ;
     public final void rule__FullJvmFormalParameter__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19231:1: ( ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) )
-            // InternalDataDSL.g:19232:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            // InternalDataDSL.g:20317:1: ( ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) ) )
+            // InternalDataDSL.g:20318:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
             {
-            // InternalDataDSL.g:19232:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
-            // InternalDataDSL.g:19233:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            // InternalDataDSL.g:20318:1: ( ( rule__FullJvmFormalParameter__NameAssignment_1 ) )
+            // InternalDataDSL.g:20319:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getNameAssignment_1()); 
             }
-            // InternalDataDSL.g:19234:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
-            // InternalDataDSL.g:19234:3: rule__FullJvmFormalParameter__NameAssignment_1
+            // InternalDataDSL.g:20320:2: ( rule__FullJvmFormalParameter__NameAssignment_1 )
+            // InternalDataDSL.g:20320:3: rule__FullJvmFormalParameter__NameAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__FullJvmFormalParameter__NameAssignment_1();
@@ -63511,16 +67132,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__0"
-    // InternalDataDSL.g:19243:1: rule__XFeatureCall__Group__0 : rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 ;
+    // InternalDataDSL.g:20329:1: rule__XFeatureCall__Group__0 : rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 ;
     public final void rule__XFeatureCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19247:1: ( rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 )
-            // InternalDataDSL.g:19248:2: rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1
+            // InternalDataDSL.g:20333:1: ( rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1 )
+            // InternalDataDSL.g:20334:2: rule__XFeatureCall__Group__0__Impl rule__XFeatureCall__Group__1
             {
-            pushFollow(FOLLOW_118);
+            pushFollow(FOLLOW_126);
             rule__XFeatureCall__Group__0__Impl();
 
             state._fsp--;
@@ -63549,23 +67170,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__0__Impl"
-    // InternalDataDSL.g:19255:1: rule__XFeatureCall__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:20341:1: rule__XFeatureCall__Group__0__Impl : ( () ) ;
     public final void rule__XFeatureCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19259:1: ( ( () ) )
-            // InternalDataDSL.g:19260:1: ( () )
+            // InternalDataDSL.g:20345:1: ( ( () ) )
+            // InternalDataDSL.g:20346:1: ( () )
             {
-            // InternalDataDSL.g:19260:1: ( () )
-            // InternalDataDSL.g:19261:2: ()
+            // InternalDataDSL.g:20346:1: ( () )
+            // InternalDataDSL.g:20347:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getXFeatureCallAction_0()); 
             }
-            // InternalDataDSL.g:19262:2: ()
-            // InternalDataDSL.g:19262:3: 
+            // InternalDataDSL.g:20348:2: ()
+            // InternalDataDSL.g:20348:3: 
             {
             }
 
@@ -63590,16 +67211,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__1"
-    // InternalDataDSL.g:19270:1: rule__XFeatureCall__Group__1 : rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 ;
+    // InternalDataDSL.g:20356:1: rule__XFeatureCall__Group__1 : rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 ;
     public final void rule__XFeatureCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19274:1: ( rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 )
-            // InternalDataDSL.g:19275:2: rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2
+            // InternalDataDSL.g:20360:1: ( rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2 )
+            // InternalDataDSL.g:20361:2: rule__XFeatureCall__Group__1__Impl rule__XFeatureCall__Group__2
             {
-            pushFollow(FOLLOW_118);
+            pushFollow(FOLLOW_126);
             rule__XFeatureCall__Group__1__Impl();
 
             state._fsp--;
@@ -63628,31 +67249,31 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__1__Impl"
-    // InternalDataDSL.g:19282:1: rule__XFeatureCall__Group__1__Impl : ( ( rule__XFeatureCall__Group_1__0 )? ) ;
+    // InternalDataDSL.g:20368:1: rule__XFeatureCall__Group__1__Impl : ( ( rule__XFeatureCall__Group_1__0 )? ) ;
     public final void rule__XFeatureCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19286:1: ( ( ( rule__XFeatureCall__Group_1__0 )? ) )
-            // InternalDataDSL.g:19287:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            // InternalDataDSL.g:20372:1: ( ( ( rule__XFeatureCall__Group_1__0 )? ) )
+            // InternalDataDSL.g:20373:1: ( ( rule__XFeatureCall__Group_1__0 )? )
             {
-            // InternalDataDSL.g:19287:1: ( ( rule__XFeatureCall__Group_1__0 )? )
-            // InternalDataDSL.g:19288:2: ( rule__XFeatureCall__Group_1__0 )?
+            // InternalDataDSL.g:20373:1: ( ( rule__XFeatureCall__Group_1__0 )? )
+            // InternalDataDSL.g:20374:2: ( rule__XFeatureCall__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:19289:2: ( rule__XFeatureCall__Group_1__0 )?
-            int alt154=2;
-            int LA154_0 = input.LA(1);
+            // InternalDataDSL.g:20375:2: ( rule__XFeatureCall__Group_1__0 )?
+            int alt159=2;
+            int LA159_0 = input.LA(1);
 
-            if ( (LA154_0==27) ) {
-                alt154=1;
+            if ( (LA159_0==27) ) {
+                alt159=1;
             }
-            switch (alt154) {
+            switch (alt159) {
                 case 1 :
-                    // InternalDataDSL.g:19289:3: rule__XFeatureCall__Group_1__0
+                    // InternalDataDSL.g:20375:3: rule__XFeatureCall__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_1__0();
@@ -63690,16 +67311,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__2"
-    // InternalDataDSL.g:19297:1: rule__XFeatureCall__Group__2 : rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 ;
+    // InternalDataDSL.g:20383:1: rule__XFeatureCall__Group__2 : rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 ;
     public final void rule__XFeatureCall__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19301:1: ( rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 )
-            // InternalDataDSL.g:19302:2: rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3
+            // InternalDataDSL.g:20387:1: ( rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3 )
+            // InternalDataDSL.g:20388:2: rule__XFeatureCall__Group__2__Impl rule__XFeatureCall__Group__3
             {
-            pushFollow(FOLLOW_119);
+            pushFollow(FOLLOW_127);
             rule__XFeatureCall__Group__2__Impl();
 
             state._fsp--;
@@ -63728,23 +67349,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__2__Impl"
-    // InternalDataDSL.g:19309:1: rule__XFeatureCall__Group__2__Impl : ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) ;
+    // InternalDataDSL.g:20395:1: rule__XFeatureCall__Group__2__Impl : ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) ;
     public final void rule__XFeatureCall__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19313:1: ( ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) )
-            // InternalDataDSL.g:19314:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            // InternalDataDSL.g:20399:1: ( ( ( rule__XFeatureCall__FeatureAssignment_2 ) ) )
+            // InternalDataDSL.g:20400:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
             {
-            // InternalDataDSL.g:19314:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
-            // InternalDataDSL.g:19315:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            // InternalDataDSL.g:20400:1: ( ( rule__XFeatureCall__FeatureAssignment_2 ) )
+            // InternalDataDSL.g:20401:2: ( rule__XFeatureCall__FeatureAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureAssignment_2()); 
             }
-            // InternalDataDSL.g:19316:2: ( rule__XFeatureCall__FeatureAssignment_2 )
-            // InternalDataDSL.g:19316:3: rule__XFeatureCall__FeatureAssignment_2
+            // InternalDataDSL.g:20402:2: ( rule__XFeatureCall__FeatureAssignment_2 )
+            // InternalDataDSL.g:20402:3: rule__XFeatureCall__FeatureAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureAssignment_2();
@@ -63779,16 +67400,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__3"
-    // InternalDataDSL.g:19324:1: rule__XFeatureCall__Group__3 : rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 ;
+    // InternalDataDSL.g:20410:1: rule__XFeatureCall__Group__3 : rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 ;
     public final void rule__XFeatureCall__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19328:1: ( rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 )
-            // InternalDataDSL.g:19329:2: rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4
+            // InternalDataDSL.g:20414:1: ( rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4 )
+            // InternalDataDSL.g:20415:2: rule__XFeatureCall__Group__3__Impl rule__XFeatureCall__Group__4
             {
-            pushFollow(FOLLOW_119);
+            pushFollow(FOLLOW_127);
             rule__XFeatureCall__Group__3__Impl();
 
             state._fsp--;
@@ -63817,27 +67438,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__3__Impl"
-    // InternalDataDSL.g:19336:1: rule__XFeatureCall__Group__3__Impl : ( ( rule__XFeatureCall__Group_3__0 )? ) ;
+    // InternalDataDSL.g:20422:1: rule__XFeatureCall__Group__3__Impl : ( ( rule__XFeatureCall__Group_3__0 )? ) ;
     public final void rule__XFeatureCall__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19340:1: ( ( ( rule__XFeatureCall__Group_3__0 )? ) )
-            // InternalDataDSL.g:19341:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            // InternalDataDSL.g:20426:1: ( ( ( rule__XFeatureCall__Group_3__0 )? ) )
+            // InternalDataDSL.g:20427:1: ( ( rule__XFeatureCall__Group_3__0 )? )
             {
-            // InternalDataDSL.g:19341:1: ( ( rule__XFeatureCall__Group_3__0 )? )
-            // InternalDataDSL.g:19342:2: ( rule__XFeatureCall__Group_3__0 )?
+            // InternalDataDSL.g:20427:1: ( ( rule__XFeatureCall__Group_3__0 )? )
+            // InternalDataDSL.g:20428:2: ( rule__XFeatureCall__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:19343:2: ( rule__XFeatureCall__Group_3__0 )?
-            int alt155=2;
-            alt155 = dfa155.predict(input);
-            switch (alt155) {
+            // InternalDataDSL.g:20429:2: ( rule__XFeatureCall__Group_3__0 )?
+            int alt160=2;
+            alt160 = dfa160.predict(input);
+            switch (alt160) {
                 case 1 :
-                    // InternalDataDSL.g:19343:3: rule__XFeatureCall__Group_3__0
+                    // InternalDataDSL.g:20429:3: rule__XFeatureCall__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Group_3__0();
@@ -63875,14 +67496,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__4"
-    // InternalDataDSL.g:19351:1: rule__XFeatureCall__Group__4 : rule__XFeatureCall__Group__4__Impl ;
+    // InternalDataDSL.g:20437:1: rule__XFeatureCall__Group__4 : rule__XFeatureCall__Group__4__Impl ;
     public final void rule__XFeatureCall__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19355:1: ( rule__XFeatureCall__Group__4__Impl )
-            // InternalDataDSL.g:19356:2: rule__XFeatureCall__Group__4__Impl
+            // InternalDataDSL.g:20441:1: ( rule__XFeatureCall__Group__4__Impl )
+            // InternalDataDSL.g:20442:2: rule__XFeatureCall__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group__4__Impl();
@@ -63908,27 +67529,27 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group__4__Impl"
-    // InternalDataDSL.g:19362:1: rule__XFeatureCall__Group__4__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) ;
+    // InternalDataDSL.g:20448:1: rule__XFeatureCall__Group__4__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) ;
     public final void rule__XFeatureCall__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19366:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) )
-            // InternalDataDSL.g:19367:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            // InternalDataDSL.g:20452:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? ) )
+            // InternalDataDSL.g:20453:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
             {
-            // InternalDataDSL.g:19367:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
-            // InternalDataDSL.g:19368:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            // InternalDataDSL.g:20453:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )? )
+            // InternalDataDSL.g:20454:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_4()); 
             }
-            // InternalDataDSL.g:19369:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
-            int alt156=2;
-            alt156 = dfa156.predict(input);
-            switch (alt156) {
+            // InternalDataDSL.g:20455:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?
+            int alt161=2;
+            alt161 = dfa161.predict(input);
+            switch (alt161) {
                 case 1 :
-                    // InternalDataDSL.g:19369:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+                    // InternalDataDSL.g:20455:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
@@ -63966,16 +67587,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__0"
-    // InternalDataDSL.g:19378:1: rule__XFeatureCall__Group_1__0 : rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 ;
+    // InternalDataDSL.g:20464:1: rule__XFeatureCall__Group_1__0 : rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 ;
     public final void rule__XFeatureCall__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19382:1: ( rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 )
-            // InternalDataDSL.g:19383:2: rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1
+            // InternalDataDSL.g:20468:1: ( rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1 )
+            // InternalDataDSL.g:20469:2: rule__XFeatureCall__Group_1__0__Impl rule__XFeatureCall__Group_1__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XFeatureCall__Group_1__0__Impl();
 
             state._fsp--;
@@ -64004,17 +67625,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__0__Impl"
-    // InternalDataDSL.g:19390:1: rule__XFeatureCall__Group_1__0__Impl : ( '<' ) ;
+    // InternalDataDSL.g:20476:1: rule__XFeatureCall__Group_1__0__Impl : ( '<' ) ;
     public final void rule__XFeatureCall__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19394:1: ( ( '<' ) )
-            // InternalDataDSL.g:19395:1: ( '<' )
+            // InternalDataDSL.g:20480:1: ( ( '<' ) )
+            // InternalDataDSL.g:20481:1: ( '<' )
             {
-            // InternalDataDSL.g:19395:1: ( '<' )
-            // InternalDataDSL.g:19396:2: '<'
+            // InternalDataDSL.g:20481:1: ( '<' )
+            // InternalDataDSL.g:20482:2: '<'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0()); 
@@ -64045,16 +67666,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__1"
-    // InternalDataDSL.g:19405:1: rule__XFeatureCall__Group_1__1 : rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 ;
+    // InternalDataDSL.g:20491:1: rule__XFeatureCall__Group_1__1 : rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 ;
     public final void rule__XFeatureCall__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19409:1: ( rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 )
-            // InternalDataDSL.g:19410:2: rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2
+            // InternalDataDSL.g:20495:1: ( rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2 )
+            // InternalDataDSL.g:20496:2: rule__XFeatureCall__Group_1__1__Impl rule__XFeatureCall__Group_1__2
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XFeatureCall__Group_1__1__Impl();
 
             state._fsp--;
@@ -64083,23 +67704,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__1__Impl"
-    // InternalDataDSL.g:19417:1: rule__XFeatureCall__Group_1__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:20503:1: rule__XFeatureCall__Group_1__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) ;
     public final void rule__XFeatureCall__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19421:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) )
-            // InternalDataDSL.g:19422:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            // InternalDataDSL.g:20507:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) ) )
+            // InternalDataDSL.g:20508:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:19422:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
-            // InternalDataDSL.g:19423:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            // InternalDataDSL.g:20508:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 ) )
+            // InternalDataDSL.g:20509:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_1()); 
             }
-            // InternalDataDSL.g:19424:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
-            // InternalDataDSL.g:19424:3: rule__XFeatureCall__TypeArgumentsAssignment_1_1
+            // InternalDataDSL.g:20510:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_1 )
+            // InternalDataDSL.g:20510:3: rule__XFeatureCall__TypeArgumentsAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__TypeArgumentsAssignment_1_1();
@@ -64134,16 +67755,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__2"
-    // InternalDataDSL.g:19432:1: rule__XFeatureCall__Group_1__2 : rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 ;
+    // InternalDataDSL.g:20518:1: rule__XFeatureCall__Group_1__2 : rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 ;
     public final void rule__XFeatureCall__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19436:1: ( rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 )
-            // InternalDataDSL.g:19437:2: rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3
+            // InternalDataDSL.g:20522:1: ( rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3 )
+            // InternalDataDSL.g:20523:2: rule__XFeatureCall__Group_1__2__Impl rule__XFeatureCall__Group_1__3
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XFeatureCall__Group_1__2__Impl();
 
             state._fsp--;
@@ -64172,37 +67793,37 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__2__Impl"
-    // InternalDataDSL.g:19444:1: rule__XFeatureCall__Group_1__2__Impl : ( ( rule__XFeatureCall__Group_1_2__0 )* ) ;
+    // InternalDataDSL.g:20530:1: rule__XFeatureCall__Group_1__2__Impl : ( ( rule__XFeatureCall__Group_1_2__0 )* ) ;
     public final void rule__XFeatureCall__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19448:1: ( ( ( rule__XFeatureCall__Group_1_2__0 )* ) )
-            // InternalDataDSL.g:19449:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            // InternalDataDSL.g:20534:1: ( ( ( rule__XFeatureCall__Group_1_2__0 )* ) )
+            // InternalDataDSL.g:20535:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
             {
-            // InternalDataDSL.g:19449:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
-            // InternalDataDSL.g:19450:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            // InternalDataDSL.g:20535:1: ( ( rule__XFeatureCall__Group_1_2__0 )* )
+            // InternalDataDSL.g:20536:2: ( rule__XFeatureCall__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_1_2()); 
             }
-            // InternalDataDSL.g:19451:2: ( rule__XFeatureCall__Group_1_2__0 )*
-            loop157:
+            // InternalDataDSL.g:20537:2: ( rule__XFeatureCall__Group_1_2__0 )*
+            loop162:
             do {
-                int alt157=2;
-                int LA157_0 = input.LA(1);
+                int alt162=2;
+                int LA162_0 = input.LA(1);
 
-                if ( (LA157_0==124) ) {
-                    alt157=1;
+                if ( (LA162_0==130) ) {
+                    alt162=1;
                 }
 
 
-                switch (alt157) {
+                switch (alt162) {
             	case 1 :
-            	    // InternalDataDSL.g:19451:3: rule__XFeatureCall__Group_1_2__0
+            	    // InternalDataDSL.g:20537:3: rule__XFeatureCall__Group_1_2__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XFeatureCall__Group_1_2__0();
 
             	    state._fsp--;
@@ -64212,7 +67833,7 @@
             	    break;
 
             	default :
-            	    break loop157;
+            	    break loop162;
                 }
             } while (true);
 
@@ -64241,14 +67862,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__3"
-    // InternalDataDSL.g:19459:1: rule__XFeatureCall__Group_1__3 : rule__XFeatureCall__Group_1__3__Impl ;
+    // InternalDataDSL.g:20545:1: rule__XFeatureCall__Group_1__3 : rule__XFeatureCall__Group_1__3__Impl ;
     public final void rule__XFeatureCall__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19463:1: ( rule__XFeatureCall__Group_1__3__Impl )
-            // InternalDataDSL.g:19464:2: rule__XFeatureCall__Group_1__3__Impl
+            // InternalDataDSL.g:20549:1: ( rule__XFeatureCall__Group_1__3__Impl )
+            // InternalDataDSL.g:20550:2: rule__XFeatureCall__Group_1__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_1__3__Impl();
@@ -64274,17 +67895,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1__3__Impl"
-    // InternalDataDSL.g:19470:1: rule__XFeatureCall__Group_1__3__Impl : ( '>' ) ;
+    // InternalDataDSL.g:20556:1: rule__XFeatureCall__Group_1__3__Impl : ( '>' ) ;
     public final void rule__XFeatureCall__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19474:1: ( ( '>' ) )
-            // InternalDataDSL.g:19475:1: ( '>' )
+            // InternalDataDSL.g:20560:1: ( ( '>' ) )
+            // InternalDataDSL.g:20561:1: ( '>' )
             {
-            // InternalDataDSL.g:19475:1: ( '>' )
-            // InternalDataDSL.g:19476:2: '>'
+            // InternalDataDSL.g:20561:1: ( '>' )
+            // InternalDataDSL.g:20562:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3()); 
@@ -64315,16 +67936,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__0"
-    // InternalDataDSL.g:19486:1: rule__XFeatureCall__Group_1_2__0 : rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 ;
+    // InternalDataDSL.g:20572:1: rule__XFeatureCall__Group_1_2__0 : rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 ;
     public final void rule__XFeatureCall__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19490:1: ( rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 )
-            // InternalDataDSL.g:19491:2: rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1
+            // InternalDataDSL.g:20576:1: ( rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1 )
+            // InternalDataDSL.g:20577:2: rule__XFeatureCall__Group_1_2__0__Impl rule__XFeatureCall__Group_1_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XFeatureCall__Group_1_2__0__Impl();
 
             state._fsp--;
@@ -64353,22 +67974,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__0__Impl"
-    // InternalDataDSL.g:19498:1: rule__XFeatureCall__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:20584:1: rule__XFeatureCall__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__XFeatureCall__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19502:1: ( ( ',' ) )
-            // InternalDataDSL.g:19503:1: ( ',' )
+            // InternalDataDSL.g:20588:1: ( ( ',' ) )
+            // InternalDataDSL.g:20589:1: ( ',' )
             {
-            // InternalDataDSL.g:19503:1: ( ',' )
-            // InternalDataDSL.g:19504:2: ','
+            // InternalDataDSL.g:20589:1: ( ',' )
+            // InternalDataDSL.g:20590:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0()); 
             }
@@ -64394,14 +68015,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__1"
-    // InternalDataDSL.g:19513:1: rule__XFeatureCall__Group_1_2__1 : rule__XFeatureCall__Group_1_2__1__Impl ;
+    // InternalDataDSL.g:20599:1: rule__XFeatureCall__Group_1_2__1 : rule__XFeatureCall__Group_1_2__1__Impl ;
     public final void rule__XFeatureCall__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19517:1: ( rule__XFeatureCall__Group_1_2__1__Impl )
-            // InternalDataDSL.g:19518:2: rule__XFeatureCall__Group_1_2__1__Impl
+            // InternalDataDSL.g:20603:1: ( rule__XFeatureCall__Group_1_2__1__Impl )
+            // InternalDataDSL.g:20604:2: rule__XFeatureCall__Group_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_1_2__1__Impl();
@@ -64427,23 +68048,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_1_2__1__Impl"
-    // InternalDataDSL.g:19524:1: rule__XFeatureCall__Group_1_2__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) ;
+    // InternalDataDSL.g:20610:1: rule__XFeatureCall__Group_1_2__1__Impl : ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) ;
     public final void rule__XFeatureCall__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19528:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) )
-            // InternalDataDSL.g:19529:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            // InternalDataDSL.g:20614:1: ( ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) ) )
+            // InternalDataDSL.g:20615:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
             {
-            // InternalDataDSL.g:19529:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
-            // InternalDataDSL.g:19530:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            // InternalDataDSL.g:20615:1: ( ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 ) )
+            // InternalDataDSL.g:20616:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsAssignment_1_2_1()); 
             }
-            // InternalDataDSL.g:19531:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
-            // InternalDataDSL.g:19531:3: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
+            // InternalDataDSL.g:20617:2: ( rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 )
+            // InternalDataDSL.g:20617:3: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__TypeArgumentsAssignment_1_2_1();
@@ -64478,16 +68099,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__0"
-    // InternalDataDSL.g:19540:1: rule__XFeatureCall__Group_3__0 : rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 ;
+    // InternalDataDSL.g:20626:1: rule__XFeatureCall__Group_3__0 : rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 ;
     public final void rule__XFeatureCall__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19544:1: ( rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 )
-            // InternalDataDSL.g:19545:2: rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1
+            // InternalDataDSL.g:20630:1: ( rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1 )
+            // InternalDataDSL.g:20631:2: rule__XFeatureCall__Group_3__0__Impl rule__XFeatureCall__Group_3__1
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XFeatureCall__Group_3__0__Impl();
 
             state._fsp--;
@@ -64516,23 +68137,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__0__Impl"
-    // InternalDataDSL.g:19552:1: rule__XFeatureCall__Group_3__0__Impl : ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) ;
+    // InternalDataDSL.g:20638:1: rule__XFeatureCall__Group_3__0__Impl : ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) ;
     public final void rule__XFeatureCall__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19556:1: ( ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) )
-            // InternalDataDSL.g:19557:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            // InternalDataDSL.g:20642:1: ( ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) ) )
+            // InternalDataDSL.g:20643:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
             {
-            // InternalDataDSL.g:19557:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
-            // InternalDataDSL.g:19558:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            // InternalDataDSL.g:20643:1: ( ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 ) )
+            // InternalDataDSL.g:20644:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallAssignment_3_0()); 
             }
-            // InternalDataDSL.g:19559:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
-            // InternalDataDSL.g:19559:3: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
+            // InternalDataDSL.g:20645:2: ( rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 )
+            // InternalDataDSL.g:20645:3: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__ExplicitOperationCallAssignment_3_0();
@@ -64567,16 +68188,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__1"
-    // InternalDataDSL.g:19567:1: rule__XFeatureCall__Group_3__1 : rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 ;
+    // InternalDataDSL.g:20653:1: rule__XFeatureCall__Group_3__1 : rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 ;
     public final void rule__XFeatureCall__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19571:1: ( rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 )
-            // InternalDataDSL.g:19572:2: rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2
+            // InternalDataDSL.g:20657:1: ( rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2 )
+            // InternalDataDSL.g:20658:2: rule__XFeatureCall__Group_3__1__Impl rule__XFeatureCall__Group_3__2
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XFeatureCall__Group_3__1__Impl();
 
             state._fsp--;
@@ -64605,31 +68226,31 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__1__Impl"
-    // InternalDataDSL.g:19579:1: rule__XFeatureCall__Group_3__1__Impl : ( ( rule__XFeatureCall__Alternatives_3_1 )? ) ;
+    // InternalDataDSL.g:20665:1: rule__XFeatureCall__Group_3__1__Impl : ( ( rule__XFeatureCall__Alternatives_3_1 )? ) ;
     public final void rule__XFeatureCall__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19583:1: ( ( ( rule__XFeatureCall__Alternatives_3_1 )? ) )
-            // InternalDataDSL.g:19584:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            // InternalDataDSL.g:20669:1: ( ( ( rule__XFeatureCall__Alternatives_3_1 )? ) )
+            // InternalDataDSL.g:20670:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
             {
-            // InternalDataDSL.g:19584:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
-            // InternalDataDSL.g:19585:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            // InternalDataDSL.g:20670:1: ( ( rule__XFeatureCall__Alternatives_3_1 )? )
+            // InternalDataDSL.g:20671:2: ( rule__XFeatureCall__Alternatives_3_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getAlternatives_3_1()); 
             }
-            // InternalDataDSL.g:19586:2: ( rule__XFeatureCall__Alternatives_3_1 )?
-            int alt158=2;
-            int LA158_0 = input.LA(1);
+            // InternalDataDSL.g:20672:2: ( rule__XFeatureCall__Alternatives_3_1 )?
+            int alt163=2;
+            int LA163_0 = input.LA(1);
 
-            if ( ((LA158_0>=RULE_STRING && LA158_0<=RULE_DECIMAL)||LA158_0==27||LA158_0==31||(LA158_0>=34 && LA158_0<=35)||LA158_0==40||(LA158_0>=45 && LA158_0<=50)||LA158_0==74||LA158_0==101||LA158_0==122||(LA158_0>=126 && LA158_0<=127)||LA158_0==129||LA158_0==131||(LA158_0>=135 && LA158_0<=142)||LA158_0==144||LA158_0==164||LA158_0==166) ) {
-                alt158=1;
+            if ( ((LA163_0>=RULE_STRING && LA163_0<=RULE_DECIMAL)||LA163_0==27||LA163_0==31||(LA163_0>=34 && LA163_0<=35)||LA163_0==40||(LA163_0>=45 && LA163_0<=50)||LA163_0==74||LA163_0==103||LA163_0==128||(LA163_0>=132 && LA163_0<=133)||LA163_0==135||LA163_0==137||(LA163_0>=141 && LA163_0<=148)||LA163_0==150||LA163_0==177||LA163_0==179) ) {
+                alt163=1;
             }
-            switch (alt158) {
+            switch (alt163) {
                 case 1 :
-                    // InternalDataDSL.g:19586:3: rule__XFeatureCall__Alternatives_3_1
+                    // InternalDataDSL.g:20672:3: rule__XFeatureCall__Alternatives_3_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFeatureCall__Alternatives_3_1();
@@ -64667,14 +68288,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__2"
-    // InternalDataDSL.g:19594:1: rule__XFeatureCall__Group_3__2 : rule__XFeatureCall__Group_3__2__Impl ;
+    // InternalDataDSL.g:20680:1: rule__XFeatureCall__Group_3__2 : rule__XFeatureCall__Group_3__2__Impl ;
     public final void rule__XFeatureCall__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19598:1: ( rule__XFeatureCall__Group_3__2__Impl )
-            // InternalDataDSL.g:19599:2: rule__XFeatureCall__Group_3__2__Impl
+            // InternalDataDSL.g:20684:1: ( rule__XFeatureCall__Group_3__2__Impl )
+            // InternalDataDSL.g:20685:2: rule__XFeatureCall__Group_3__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3__2__Impl();
@@ -64700,22 +68321,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3__2__Impl"
-    // InternalDataDSL.g:19605:1: rule__XFeatureCall__Group_3__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:20691:1: rule__XFeatureCall__Group_3__2__Impl : ( ')' ) ;
     public final void rule__XFeatureCall__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19609:1: ( ( ')' ) )
-            // InternalDataDSL.g:19610:1: ( ')' )
+            // InternalDataDSL.g:20695:1: ( ( ')' ) )
+            // InternalDataDSL.g:20696:1: ( ')' )
             {
-            // InternalDataDSL.g:19610:1: ( ')' )
-            // InternalDataDSL.g:19611:2: ')'
+            // InternalDataDSL.g:20696:1: ( ')' )
+            // InternalDataDSL.g:20697:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2()); 
             }
@@ -64741,16 +68362,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0"
-    // InternalDataDSL.g:19621:1: rule__XFeatureCall__Group_3_1_1__0 : rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 ;
+    // InternalDataDSL.g:20707:1: rule__XFeatureCall__Group_3_1_1__0 : rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 ;
     public final void rule__XFeatureCall__Group_3_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19625:1: ( rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 )
-            // InternalDataDSL.g:19626:2: rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1
+            // InternalDataDSL.g:20711:1: ( rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1 )
+            // InternalDataDSL.g:20712:2: rule__XFeatureCall__Group_3_1_1__0__Impl rule__XFeatureCall__Group_3_1_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XFeatureCall__Group_3_1_1__0__Impl();
 
             state._fsp--;
@@ -64779,23 +68400,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__0__Impl"
-    // InternalDataDSL.g:19633:1: rule__XFeatureCall__Group_3_1_1__0__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) ;
+    // InternalDataDSL.g:20719:1: rule__XFeatureCall__Group_3_1_1__0__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) ;
     public final void rule__XFeatureCall__Group_3_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19637:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) )
-            // InternalDataDSL.g:19638:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            // InternalDataDSL.g:20723:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) ) )
+            // InternalDataDSL.g:20724:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
             {
-            // InternalDataDSL.g:19638:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
-            // InternalDataDSL.g:19639:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            // InternalDataDSL.g:20724:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 ) )
+            // InternalDataDSL.g:20725:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_0()); 
             }
-            // InternalDataDSL.g:19640:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
-            // InternalDataDSL.g:19640:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
+            // InternalDataDSL.g:20726:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 )
+            // InternalDataDSL.g:20726:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0();
@@ -64830,14 +68451,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1"
-    // InternalDataDSL.g:19648:1: rule__XFeatureCall__Group_3_1_1__1 : rule__XFeatureCall__Group_3_1_1__1__Impl ;
+    // InternalDataDSL.g:20734:1: rule__XFeatureCall__Group_3_1_1__1 : rule__XFeatureCall__Group_3_1_1__1__Impl ;
     public final void rule__XFeatureCall__Group_3_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19652:1: ( rule__XFeatureCall__Group_3_1_1__1__Impl )
-            // InternalDataDSL.g:19653:2: rule__XFeatureCall__Group_3_1_1__1__Impl
+            // InternalDataDSL.g:20738:1: ( rule__XFeatureCall__Group_3_1_1__1__Impl )
+            // InternalDataDSL.g:20739:2: rule__XFeatureCall__Group_3_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3_1_1__1__Impl();
@@ -64863,37 +68484,37 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1__1__Impl"
-    // InternalDataDSL.g:19659:1: rule__XFeatureCall__Group_3_1_1__1__Impl : ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) ;
+    // InternalDataDSL.g:20745:1: rule__XFeatureCall__Group_3_1_1__1__Impl : ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) ;
     public final void rule__XFeatureCall__Group_3_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19663:1: ( ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) )
-            // InternalDataDSL.g:19664:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            // InternalDataDSL.g:20749:1: ( ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* ) )
+            // InternalDataDSL.g:20750:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
             {
-            // InternalDataDSL.g:19664:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
-            // InternalDataDSL.g:19665:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            // InternalDataDSL.g:20750:1: ( ( rule__XFeatureCall__Group_3_1_1_1__0 )* )
+            // InternalDataDSL.g:20751:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getGroup_3_1_1_1()); 
             }
-            // InternalDataDSL.g:19666:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
-            loop159:
+            // InternalDataDSL.g:20752:2: ( rule__XFeatureCall__Group_3_1_1_1__0 )*
+            loop164:
             do {
-                int alt159=2;
-                int LA159_0 = input.LA(1);
+                int alt164=2;
+                int LA164_0 = input.LA(1);
 
-                if ( (LA159_0==124) ) {
-                    alt159=1;
+                if ( (LA164_0==130) ) {
+                    alt164=1;
                 }
 
 
-                switch (alt159) {
+                switch (alt164) {
             	case 1 :
-            	    // InternalDataDSL.g:19666:3: rule__XFeatureCall__Group_3_1_1_1__0
+            	    // InternalDataDSL.g:20752:3: rule__XFeatureCall__Group_3_1_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XFeatureCall__Group_3_1_1_1__0();
 
             	    state._fsp--;
@@ -64903,7 +68524,7 @@
             	    break;
 
             	default :
-            	    break loop159;
+            	    break loop164;
                 }
             } while (true);
 
@@ -64932,16 +68553,16 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0"
-    // InternalDataDSL.g:19675:1: rule__XFeatureCall__Group_3_1_1_1__0 : rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 ;
+    // InternalDataDSL.g:20761:1: rule__XFeatureCall__Group_3_1_1_1__0 : rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 ;
     public final void rule__XFeatureCall__Group_3_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19679:1: ( rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 )
-            // InternalDataDSL.g:19680:2: rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1
+            // InternalDataDSL.g:20765:1: ( rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1 )
+            // InternalDataDSL.g:20766:2: rule__XFeatureCall__Group_3_1_1_1__0__Impl rule__XFeatureCall__Group_3_1_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XFeatureCall__Group_3_1_1_1__0__Impl();
 
             state._fsp--;
@@ -64970,22 +68591,22 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__0__Impl"
-    // InternalDataDSL.g:19687:1: rule__XFeatureCall__Group_3_1_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:20773:1: rule__XFeatureCall__Group_3_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XFeatureCall__Group_3_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19691:1: ( ( ',' ) )
-            // InternalDataDSL.g:19692:1: ( ',' )
+            // InternalDataDSL.g:20777:1: ( ( ',' ) )
+            // InternalDataDSL.g:20778:1: ( ',' )
             {
-            // InternalDataDSL.g:19692:1: ( ',' )
-            // InternalDataDSL.g:19693:2: ','
+            // InternalDataDSL.g:20778:1: ( ',' )
+            // InternalDataDSL.g:20779:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0()); 
             }
@@ -65011,14 +68632,14 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1"
-    // InternalDataDSL.g:19702:1: rule__XFeatureCall__Group_3_1_1_1__1 : rule__XFeatureCall__Group_3_1_1_1__1__Impl ;
+    // InternalDataDSL.g:20788:1: rule__XFeatureCall__Group_3_1_1_1__1 : rule__XFeatureCall__Group_3_1_1_1__1__Impl ;
     public final void rule__XFeatureCall__Group_3_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19706:1: ( rule__XFeatureCall__Group_3_1_1_1__1__Impl )
-            // InternalDataDSL.g:19707:2: rule__XFeatureCall__Group_3_1_1_1__1__Impl
+            // InternalDataDSL.g:20792:1: ( rule__XFeatureCall__Group_3_1_1_1__1__Impl )
+            // InternalDataDSL.g:20793:2: rule__XFeatureCall__Group_3_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__Group_3_1_1_1__1__Impl();
@@ -65044,23 +68665,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__Group_3_1_1_1__1__Impl"
-    // InternalDataDSL.g:19713:1: rule__XFeatureCall__Group_3_1_1_1__1__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) ;
+    // InternalDataDSL.g:20799:1: rule__XFeatureCall__Group_3_1_1_1__1__Impl : ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) ;
     public final void rule__XFeatureCall__Group_3_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19717:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) )
-            // InternalDataDSL.g:19718:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            // InternalDataDSL.g:20803:1: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) ) )
+            // InternalDataDSL.g:20804:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
             {
-            // InternalDataDSL.g:19718:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
-            // InternalDataDSL.g:19719:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            // InternalDataDSL.g:20804:1: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 ) )
+            // InternalDataDSL.g:20805:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_1_1_1()); 
             }
-            // InternalDataDSL.g:19720:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
-            // InternalDataDSL.g:19720:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
+            // InternalDataDSL.g:20806:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 )
+            // InternalDataDSL.g:20806:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1();
@@ -65095,16 +68716,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__0"
-    // InternalDataDSL.g:19729:1: rule__XConstructorCall__Group__0 : rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 ;
+    // InternalDataDSL.g:20815:1: rule__XConstructorCall__Group__0 : rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 ;
     public final void rule__XConstructorCall__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19733:1: ( rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 )
-            // InternalDataDSL.g:19734:2: rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1
+            // InternalDataDSL.g:20819:1: ( rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1 )
+            // InternalDataDSL.g:20820:2: rule__XConstructorCall__Group__0__Impl rule__XConstructorCall__Group__1
             {
-            pushFollow(FOLLOW_144);
+            pushFollow(FOLLOW_152);
             rule__XConstructorCall__Group__0__Impl();
 
             state._fsp--;
@@ -65133,23 +68754,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__0__Impl"
-    // InternalDataDSL.g:19741:1: rule__XConstructorCall__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:20827:1: rule__XConstructorCall__Group__0__Impl : ( () ) ;
     public final void rule__XConstructorCall__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19745:1: ( ( () ) )
-            // InternalDataDSL.g:19746:1: ( () )
+            // InternalDataDSL.g:20831:1: ( ( () ) )
+            // InternalDataDSL.g:20832:1: ( () )
             {
-            // InternalDataDSL.g:19746:1: ( () )
-            // InternalDataDSL.g:19747:2: ()
+            // InternalDataDSL.g:20832:1: ( () )
+            // InternalDataDSL.g:20833:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getXConstructorCallAction_0()); 
             }
-            // InternalDataDSL.g:19748:2: ()
-            // InternalDataDSL.g:19748:3: 
+            // InternalDataDSL.g:20834:2: ()
+            // InternalDataDSL.g:20834:3: 
             {
             }
 
@@ -65174,14 +68795,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__1"
-    // InternalDataDSL.g:19756:1: rule__XConstructorCall__Group__1 : rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 ;
+    // InternalDataDSL.g:20842:1: rule__XConstructorCall__Group__1 : rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 ;
     public final void rule__XConstructorCall__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19760:1: ( rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 )
-            // InternalDataDSL.g:19761:2: rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2
+            // InternalDataDSL.g:20846:1: ( rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2 )
+            // InternalDataDSL.g:20847:2: rule__XConstructorCall__Group__1__Impl rule__XConstructorCall__Group__2
             {
             pushFollow(FOLLOW_7);
             rule__XConstructorCall__Group__1__Impl();
@@ -65212,22 +68833,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__1__Impl"
-    // InternalDataDSL.g:19768:1: rule__XConstructorCall__Group__1__Impl : ( 'new' ) ;
+    // InternalDataDSL.g:20854:1: rule__XConstructorCall__Group__1__Impl : ( 'new' ) ;
     public final void rule__XConstructorCall__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19772:1: ( ( 'new' ) )
-            // InternalDataDSL.g:19773:1: ( 'new' )
+            // InternalDataDSL.g:20858:1: ( ( 'new' ) )
+            // InternalDataDSL.g:20859:1: ( 'new' )
             {
-            // InternalDataDSL.g:19773:1: ( 'new' )
-            // InternalDataDSL.g:19774:2: 'new'
+            // InternalDataDSL.g:20859:1: ( 'new' )
+            // InternalDataDSL.g:20860:2: 'new'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); 
             }
-            match(input,137,FOLLOW_2); if (state.failed) return ;
+            match(input,143,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXConstructorCallAccess().getNewKeyword_1()); 
             }
@@ -65253,16 +68874,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__2"
-    // InternalDataDSL.g:19783:1: rule__XConstructorCall__Group__2 : rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 ;
+    // InternalDataDSL.g:20869:1: rule__XConstructorCall__Group__2 : rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 ;
     public final void rule__XConstructorCall__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19787:1: ( rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 )
-            // InternalDataDSL.g:19788:2: rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3
+            // InternalDataDSL.g:20873:1: ( rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3 )
+            // InternalDataDSL.g:20874:2: rule__XConstructorCall__Group__2__Impl rule__XConstructorCall__Group__3
             {
-            pushFollow(FOLLOW_145);
+            pushFollow(FOLLOW_153);
             rule__XConstructorCall__Group__2__Impl();
 
             state._fsp--;
@@ -65291,23 +68912,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__2__Impl"
-    // InternalDataDSL.g:19795:1: rule__XConstructorCall__Group__2__Impl : ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) ;
+    // InternalDataDSL.g:20881:1: rule__XConstructorCall__Group__2__Impl : ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) ;
     public final void rule__XConstructorCall__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19799:1: ( ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) )
-            // InternalDataDSL.g:19800:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            // InternalDataDSL.g:20885:1: ( ( ( rule__XConstructorCall__ConstructorAssignment_2 ) ) )
+            // InternalDataDSL.g:20886:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
             {
-            // InternalDataDSL.g:19800:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
-            // InternalDataDSL.g:19801:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            // InternalDataDSL.g:20886:1: ( ( rule__XConstructorCall__ConstructorAssignment_2 ) )
+            // InternalDataDSL.g:20887:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorAssignment_2()); 
             }
-            // InternalDataDSL.g:19802:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
-            // InternalDataDSL.g:19802:3: rule__XConstructorCall__ConstructorAssignment_2
+            // InternalDataDSL.g:20888:2: ( rule__XConstructorCall__ConstructorAssignment_2 )
+            // InternalDataDSL.g:20888:3: rule__XConstructorCall__ConstructorAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ConstructorAssignment_2();
@@ -65342,16 +68963,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__3"
-    // InternalDataDSL.g:19810:1: rule__XConstructorCall__Group__3 : rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 ;
+    // InternalDataDSL.g:20896:1: rule__XConstructorCall__Group__3 : rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 ;
     public final void rule__XConstructorCall__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19814:1: ( rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 )
-            // InternalDataDSL.g:19815:2: rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4
+            // InternalDataDSL.g:20900:1: ( rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4 )
+            // InternalDataDSL.g:20901:2: rule__XConstructorCall__Group__3__Impl rule__XConstructorCall__Group__4
             {
-            pushFollow(FOLLOW_145);
+            pushFollow(FOLLOW_153);
             rule__XConstructorCall__Group__3__Impl();
 
             state._fsp--;
@@ -65380,27 +69001,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__3__Impl"
-    // InternalDataDSL.g:19822:1: rule__XConstructorCall__Group__3__Impl : ( ( rule__XConstructorCall__Group_3__0 )? ) ;
+    // InternalDataDSL.g:20908:1: rule__XConstructorCall__Group__3__Impl : ( ( rule__XConstructorCall__Group_3__0 )? ) ;
     public final void rule__XConstructorCall__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19826:1: ( ( ( rule__XConstructorCall__Group_3__0 )? ) )
-            // InternalDataDSL.g:19827:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            // InternalDataDSL.g:20912:1: ( ( ( rule__XConstructorCall__Group_3__0 )? ) )
+            // InternalDataDSL.g:20913:1: ( ( rule__XConstructorCall__Group_3__0 )? )
             {
-            // InternalDataDSL.g:19827:1: ( ( rule__XConstructorCall__Group_3__0 )? )
-            // InternalDataDSL.g:19828:2: ( rule__XConstructorCall__Group_3__0 )?
+            // InternalDataDSL.g:20913:1: ( ( rule__XConstructorCall__Group_3__0 )? )
+            // InternalDataDSL.g:20914:2: ( rule__XConstructorCall__Group_3__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_3()); 
             }
-            // InternalDataDSL.g:19829:2: ( rule__XConstructorCall__Group_3__0 )?
-            int alt160=2;
-            alt160 = dfa160.predict(input);
-            switch (alt160) {
+            // InternalDataDSL.g:20915:2: ( rule__XConstructorCall__Group_3__0 )?
+            int alt165=2;
+            alt165 = dfa165.predict(input);
+            switch (alt165) {
                 case 1 :
-                    // InternalDataDSL.g:19829:3: rule__XConstructorCall__Group_3__0
+                    // InternalDataDSL.g:20915:3: rule__XConstructorCall__Group_3__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_3__0();
@@ -65438,16 +69059,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__4"
-    // InternalDataDSL.g:19837:1: rule__XConstructorCall__Group__4 : rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 ;
+    // InternalDataDSL.g:20923:1: rule__XConstructorCall__Group__4 : rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 ;
     public final void rule__XConstructorCall__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19841:1: ( rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 )
-            // InternalDataDSL.g:19842:2: rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5
+            // InternalDataDSL.g:20927:1: ( rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5 )
+            // InternalDataDSL.g:20928:2: rule__XConstructorCall__Group__4__Impl rule__XConstructorCall__Group__5
             {
-            pushFollow(FOLLOW_145);
+            pushFollow(FOLLOW_153);
             rule__XConstructorCall__Group__4__Impl();
 
             state._fsp--;
@@ -65476,27 +69097,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__4__Impl"
-    // InternalDataDSL.g:19849:1: rule__XConstructorCall__Group__4__Impl : ( ( rule__XConstructorCall__Group_4__0 )? ) ;
+    // InternalDataDSL.g:20935:1: rule__XConstructorCall__Group__4__Impl : ( ( rule__XConstructorCall__Group_4__0 )? ) ;
     public final void rule__XConstructorCall__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19853:1: ( ( ( rule__XConstructorCall__Group_4__0 )? ) )
-            // InternalDataDSL.g:19854:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            // InternalDataDSL.g:20939:1: ( ( ( rule__XConstructorCall__Group_4__0 )? ) )
+            // InternalDataDSL.g:20940:1: ( ( rule__XConstructorCall__Group_4__0 )? )
             {
-            // InternalDataDSL.g:19854:1: ( ( rule__XConstructorCall__Group_4__0 )? )
-            // InternalDataDSL.g:19855:2: ( rule__XConstructorCall__Group_4__0 )?
+            // InternalDataDSL.g:20940:1: ( ( rule__XConstructorCall__Group_4__0 )? )
+            // InternalDataDSL.g:20941:2: ( rule__XConstructorCall__Group_4__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_4()); 
             }
-            // InternalDataDSL.g:19856:2: ( rule__XConstructorCall__Group_4__0 )?
-            int alt161=2;
-            alt161 = dfa161.predict(input);
-            switch (alt161) {
+            // InternalDataDSL.g:20942:2: ( rule__XConstructorCall__Group_4__0 )?
+            int alt166=2;
+            alt166 = dfa166.predict(input);
+            switch (alt166) {
                 case 1 :
-                    // InternalDataDSL.g:19856:3: rule__XConstructorCall__Group_4__0
+                    // InternalDataDSL.g:20942:3: rule__XConstructorCall__Group_4__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Group_4__0();
@@ -65534,14 +69155,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__5"
-    // InternalDataDSL.g:19864:1: rule__XConstructorCall__Group__5 : rule__XConstructorCall__Group__5__Impl ;
+    // InternalDataDSL.g:20950:1: rule__XConstructorCall__Group__5 : rule__XConstructorCall__Group__5__Impl ;
     public final void rule__XConstructorCall__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19868:1: ( rule__XConstructorCall__Group__5__Impl )
-            // InternalDataDSL.g:19869:2: rule__XConstructorCall__Group__5__Impl
+            // InternalDataDSL.g:20954:1: ( rule__XConstructorCall__Group__5__Impl )
+            // InternalDataDSL.g:20955:2: rule__XConstructorCall__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group__5__Impl();
@@ -65567,27 +69188,27 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group__5__Impl"
-    // InternalDataDSL.g:19875:1: rule__XConstructorCall__Group__5__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) ;
+    // InternalDataDSL.g:20961:1: rule__XConstructorCall__Group__5__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) ;
     public final void rule__XConstructorCall__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19879:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) )
-            // InternalDataDSL.g:19880:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            // InternalDataDSL.g:20965:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? ) )
+            // InternalDataDSL.g:20966:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
             {
-            // InternalDataDSL.g:19880:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
-            // InternalDataDSL.g:19881:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            // InternalDataDSL.g:20966:1: ( ( rule__XConstructorCall__ArgumentsAssignment_5 )? )
+            // InternalDataDSL.g:20967:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_5()); 
             }
-            // InternalDataDSL.g:19882:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
-            int alt162=2;
-            alt162 = dfa162.predict(input);
-            switch (alt162) {
+            // InternalDataDSL.g:20968:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?
+            int alt167=2;
+            alt167 = dfa167.predict(input);
+            switch (alt167) {
                 case 1 :
-                    // InternalDataDSL.g:19882:3: rule__XConstructorCall__ArgumentsAssignment_5
+                    // InternalDataDSL.g:20968:3: rule__XConstructorCall__ArgumentsAssignment_5
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__ArgumentsAssignment_5();
@@ -65625,16 +69246,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__0"
-    // InternalDataDSL.g:19891:1: rule__XConstructorCall__Group_3__0 : rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 ;
+    // InternalDataDSL.g:20977:1: rule__XConstructorCall__Group_3__0 : rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 ;
     public final void rule__XConstructorCall__Group_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19895:1: ( rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 )
-            // InternalDataDSL.g:19896:2: rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1
+            // InternalDataDSL.g:20981:1: ( rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1 )
+            // InternalDataDSL.g:20982:2: rule__XConstructorCall__Group_3__0__Impl rule__XConstructorCall__Group_3__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XConstructorCall__Group_3__0__Impl();
 
             state._fsp--;
@@ -65663,23 +69284,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__0__Impl"
-    // InternalDataDSL.g:19903:1: rule__XConstructorCall__Group_3__0__Impl : ( ( '<' ) ) ;
+    // InternalDataDSL.g:20989:1: rule__XConstructorCall__Group_3__0__Impl : ( ( '<' ) ) ;
     public final void rule__XConstructorCall__Group_3__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19907:1: ( ( ( '<' ) ) )
-            // InternalDataDSL.g:19908:1: ( ( '<' ) )
+            // InternalDataDSL.g:20993:1: ( ( ( '<' ) ) )
+            // InternalDataDSL.g:20994:1: ( ( '<' ) )
             {
-            // InternalDataDSL.g:19908:1: ( ( '<' ) )
-            // InternalDataDSL.g:19909:2: ( '<' )
+            // InternalDataDSL.g:20994:1: ( ( '<' ) )
+            // InternalDataDSL.g:20995:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0()); 
             }
-            // InternalDataDSL.g:19910:2: ( '<' )
-            // InternalDataDSL.g:19910:3: '<'
+            // InternalDataDSL.g:20996:2: ( '<' )
+            // InternalDataDSL.g:20996:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -65710,16 +69331,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__1"
-    // InternalDataDSL.g:19918:1: rule__XConstructorCall__Group_3__1 : rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 ;
+    // InternalDataDSL.g:21004:1: rule__XConstructorCall__Group_3__1 : rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 ;
     public final void rule__XConstructorCall__Group_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19922:1: ( rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 )
-            // InternalDataDSL.g:19923:2: rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2
+            // InternalDataDSL.g:21008:1: ( rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2 )
+            // InternalDataDSL.g:21009:2: rule__XConstructorCall__Group_3__1__Impl rule__XConstructorCall__Group_3__2
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XConstructorCall__Group_3__1__Impl();
 
             state._fsp--;
@@ -65748,23 +69369,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__1__Impl"
-    // InternalDataDSL.g:19930:1: rule__XConstructorCall__Group_3__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) ;
+    // InternalDataDSL.g:21016:1: rule__XConstructorCall__Group_3__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) ;
     public final void rule__XConstructorCall__Group_3__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19934:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) )
-            // InternalDataDSL.g:19935:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            // InternalDataDSL.g:21020:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) ) )
+            // InternalDataDSL.g:21021:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
             {
-            // InternalDataDSL.g:19935:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
-            // InternalDataDSL.g:19936:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            // InternalDataDSL.g:21021:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 ) )
+            // InternalDataDSL.g:21022:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_1()); 
             }
-            // InternalDataDSL.g:19937:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
-            // InternalDataDSL.g:19937:3: rule__XConstructorCall__TypeArgumentsAssignment_3_1
+            // InternalDataDSL.g:21023:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_1 )
+            // InternalDataDSL.g:21023:3: rule__XConstructorCall__TypeArgumentsAssignment_3_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__TypeArgumentsAssignment_3_1();
@@ -65799,16 +69420,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__2"
-    // InternalDataDSL.g:19945:1: rule__XConstructorCall__Group_3__2 : rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 ;
+    // InternalDataDSL.g:21031:1: rule__XConstructorCall__Group_3__2 : rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 ;
     public final void rule__XConstructorCall__Group_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19949:1: ( rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 )
-            // InternalDataDSL.g:19950:2: rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3
+            // InternalDataDSL.g:21035:1: ( rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3 )
+            // InternalDataDSL.g:21036:2: rule__XConstructorCall__Group_3__2__Impl rule__XConstructorCall__Group_3__3
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__XConstructorCall__Group_3__2__Impl();
 
             state._fsp--;
@@ -65837,37 +69458,37 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__2__Impl"
-    // InternalDataDSL.g:19957:1: rule__XConstructorCall__Group_3__2__Impl : ( ( rule__XConstructorCall__Group_3_2__0 )* ) ;
+    // InternalDataDSL.g:21043:1: rule__XConstructorCall__Group_3__2__Impl : ( ( rule__XConstructorCall__Group_3_2__0 )* ) ;
     public final void rule__XConstructorCall__Group_3__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19961:1: ( ( ( rule__XConstructorCall__Group_3_2__0 )* ) )
-            // InternalDataDSL.g:19962:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            // InternalDataDSL.g:21047:1: ( ( ( rule__XConstructorCall__Group_3_2__0 )* ) )
+            // InternalDataDSL.g:21048:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
             {
-            // InternalDataDSL.g:19962:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
-            // InternalDataDSL.g:19963:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            // InternalDataDSL.g:21048:1: ( ( rule__XConstructorCall__Group_3_2__0 )* )
+            // InternalDataDSL.g:21049:2: ( rule__XConstructorCall__Group_3_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_3_2()); 
             }
-            // InternalDataDSL.g:19964:2: ( rule__XConstructorCall__Group_3_2__0 )*
-            loop163:
+            // InternalDataDSL.g:21050:2: ( rule__XConstructorCall__Group_3_2__0 )*
+            loop168:
             do {
-                int alt163=2;
-                int LA163_0 = input.LA(1);
+                int alt168=2;
+                int LA168_0 = input.LA(1);
 
-                if ( (LA163_0==124) ) {
-                    alt163=1;
+                if ( (LA168_0==130) ) {
+                    alt168=1;
                 }
 
 
-                switch (alt163) {
+                switch (alt168) {
             	case 1 :
-            	    // InternalDataDSL.g:19964:3: rule__XConstructorCall__Group_3_2__0
+            	    // InternalDataDSL.g:21050:3: rule__XConstructorCall__Group_3_2__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XConstructorCall__Group_3_2__0();
 
             	    state._fsp--;
@@ -65877,7 +69498,7 @@
             	    break;
 
             	default :
-            	    break loop163;
+            	    break loop168;
                 }
             } while (true);
 
@@ -65906,14 +69527,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__3"
-    // InternalDataDSL.g:19972:1: rule__XConstructorCall__Group_3__3 : rule__XConstructorCall__Group_3__3__Impl ;
+    // InternalDataDSL.g:21058:1: rule__XConstructorCall__Group_3__3 : rule__XConstructorCall__Group_3__3__Impl ;
     public final void rule__XConstructorCall__Group_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19976:1: ( rule__XConstructorCall__Group_3__3__Impl )
-            // InternalDataDSL.g:19977:2: rule__XConstructorCall__Group_3__3__Impl
+            // InternalDataDSL.g:21062:1: ( rule__XConstructorCall__Group_3__3__Impl )
+            // InternalDataDSL.g:21063:2: rule__XConstructorCall__Group_3__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_3__3__Impl();
@@ -65939,17 +69560,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3__3__Impl"
-    // InternalDataDSL.g:19983:1: rule__XConstructorCall__Group_3__3__Impl : ( '>' ) ;
+    // InternalDataDSL.g:21069:1: rule__XConstructorCall__Group_3__3__Impl : ( '>' ) ;
     public final void rule__XConstructorCall__Group_3__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:19987:1: ( ( '>' ) )
-            // InternalDataDSL.g:19988:1: ( '>' )
+            // InternalDataDSL.g:21073:1: ( ( '>' ) )
+            // InternalDataDSL.g:21074:1: ( '>' )
             {
-            // InternalDataDSL.g:19988:1: ( '>' )
-            // InternalDataDSL.g:19989:2: '>'
+            // InternalDataDSL.g:21074:1: ( '>' )
+            // InternalDataDSL.g:21075:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3()); 
@@ -65980,16 +69601,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__0"
-    // InternalDataDSL.g:19999:1: rule__XConstructorCall__Group_3_2__0 : rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 ;
+    // InternalDataDSL.g:21085:1: rule__XConstructorCall__Group_3_2__0 : rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 ;
     public final void rule__XConstructorCall__Group_3_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20003:1: ( rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 )
-            // InternalDataDSL.g:20004:2: rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1
+            // InternalDataDSL.g:21089:1: ( rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1 )
+            // InternalDataDSL.g:21090:2: rule__XConstructorCall__Group_3_2__0__Impl rule__XConstructorCall__Group_3_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__XConstructorCall__Group_3_2__0__Impl();
 
             state._fsp--;
@@ -66018,22 +69639,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__0__Impl"
-    // InternalDataDSL.g:20011:1: rule__XConstructorCall__Group_3_2__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:21097:1: rule__XConstructorCall__Group_3_2__0__Impl : ( ',' ) ;
     public final void rule__XConstructorCall__Group_3_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20015:1: ( ( ',' ) )
-            // InternalDataDSL.g:20016:1: ( ',' )
+            // InternalDataDSL.g:21101:1: ( ( ',' ) )
+            // InternalDataDSL.g:21102:1: ( ',' )
             {
-            // InternalDataDSL.g:20016:1: ( ',' )
-            // InternalDataDSL.g:20017:2: ','
+            // InternalDataDSL.g:21102:1: ( ',' )
+            // InternalDataDSL.g:21103:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0()); 
             }
@@ -66059,14 +69680,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__1"
-    // InternalDataDSL.g:20026:1: rule__XConstructorCall__Group_3_2__1 : rule__XConstructorCall__Group_3_2__1__Impl ;
+    // InternalDataDSL.g:21112:1: rule__XConstructorCall__Group_3_2__1 : rule__XConstructorCall__Group_3_2__1__Impl ;
     public final void rule__XConstructorCall__Group_3_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20030:1: ( rule__XConstructorCall__Group_3_2__1__Impl )
-            // InternalDataDSL.g:20031:2: rule__XConstructorCall__Group_3_2__1__Impl
+            // InternalDataDSL.g:21116:1: ( rule__XConstructorCall__Group_3_2__1__Impl )
+            // InternalDataDSL.g:21117:2: rule__XConstructorCall__Group_3_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_3_2__1__Impl();
@@ -66092,23 +69713,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_3_2__1__Impl"
-    // InternalDataDSL.g:20037:1: rule__XConstructorCall__Group_3_2__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) ;
+    // InternalDataDSL.g:21123:1: rule__XConstructorCall__Group_3_2__1__Impl : ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) ;
     public final void rule__XConstructorCall__Group_3_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20041:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) )
-            // InternalDataDSL.g:20042:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            // InternalDataDSL.g:21127:1: ( ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) ) )
+            // InternalDataDSL.g:21128:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
             {
-            // InternalDataDSL.g:20042:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
-            // InternalDataDSL.g:20043:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            // InternalDataDSL.g:21128:1: ( ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 ) )
+            // InternalDataDSL.g:21129:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsAssignment_3_2_1()); 
             }
-            // InternalDataDSL.g:20044:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
-            // InternalDataDSL.g:20044:3: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
+            // InternalDataDSL.g:21130:2: ( rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 )
+            // InternalDataDSL.g:21130:3: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__TypeArgumentsAssignment_3_2_1();
@@ -66143,16 +69764,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__0"
-    // InternalDataDSL.g:20053:1: rule__XConstructorCall__Group_4__0 : rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 ;
+    // InternalDataDSL.g:21139:1: rule__XConstructorCall__Group_4__0 : rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 ;
     public final void rule__XConstructorCall__Group_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20057:1: ( rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 )
-            // InternalDataDSL.g:20058:2: rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1
+            // InternalDataDSL.g:21143:1: ( rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1 )
+            // InternalDataDSL.g:21144:2: rule__XConstructorCall__Group_4__0__Impl rule__XConstructorCall__Group_4__1
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XConstructorCall__Group_4__0__Impl();
 
             state._fsp--;
@@ -66181,23 +69802,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__0__Impl"
-    // InternalDataDSL.g:20065:1: rule__XConstructorCall__Group_4__0__Impl : ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) ;
+    // InternalDataDSL.g:21151:1: rule__XConstructorCall__Group_4__0__Impl : ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) ;
     public final void rule__XConstructorCall__Group_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20069:1: ( ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) )
-            // InternalDataDSL.g:20070:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            // InternalDataDSL.g:21155:1: ( ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) ) )
+            // InternalDataDSL.g:21156:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
             {
-            // InternalDataDSL.g:20070:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
-            // InternalDataDSL.g:20071:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            // InternalDataDSL.g:21156:1: ( ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 ) )
+            // InternalDataDSL.g:21157:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallAssignment_4_0()); 
             }
-            // InternalDataDSL.g:20072:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
-            // InternalDataDSL.g:20072:3: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
+            // InternalDataDSL.g:21158:2: ( rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 )
+            // InternalDataDSL.g:21158:3: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0();
@@ -66232,16 +69853,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__1"
-    // InternalDataDSL.g:20080:1: rule__XConstructorCall__Group_4__1 : rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 ;
+    // InternalDataDSL.g:21166:1: rule__XConstructorCall__Group_4__1 : rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 ;
     public final void rule__XConstructorCall__Group_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20084:1: ( rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 )
-            // InternalDataDSL.g:20085:2: rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2
+            // InternalDataDSL.g:21170:1: ( rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2 )
+            // InternalDataDSL.g:21171:2: rule__XConstructorCall__Group_4__1__Impl rule__XConstructorCall__Group_4__2
             {
-            pushFollow(FOLLOW_122);
+            pushFollow(FOLLOW_130);
             rule__XConstructorCall__Group_4__1__Impl();
 
             state._fsp--;
@@ -66270,31 +69891,31 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__1__Impl"
-    // InternalDataDSL.g:20092:1: rule__XConstructorCall__Group_4__1__Impl : ( ( rule__XConstructorCall__Alternatives_4_1 )? ) ;
+    // InternalDataDSL.g:21178:1: rule__XConstructorCall__Group_4__1__Impl : ( ( rule__XConstructorCall__Alternatives_4_1 )? ) ;
     public final void rule__XConstructorCall__Group_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20096:1: ( ( ( rule__XConstructorCall__Alternatives_4_1 )? ) )
-            // InternalDataDSL.g:20097:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            // InternalDataDSL.g:21182:1: ( ( ( rule__XConstructorCall__Alternatives_4_1 )? ) )
+            // InternalDataDSL.g:21183:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
             {
-            // InternalDataDSL.g:20097:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
-            // InternalDataDSL.g:20098:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            // InternalDataDSL.g:21183:1: ( ( rule__XConstructorCall__Alternatives_4_1 )? )
+            // InternalDataDSL.g:21184:2: ( rule__XConstructorCall__Alternatives_4_1 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getAlternatives_4_1()); 
             }
-            // InternalDataDSL.g:20099:2: ( rule__XConstructorCall__Alternatives_4_1 )?
-            int alt164=2;
-            int LA164_0 = input.LA(1);
+            // InternalDataDSL.g:21185:2: ( rule__XConstructorCall__Alternatives_4_1 )?
+            int alt169=2;
+            int LA169_0 = input.LA(1);
 
-            if ( ((LA164_0>=RULE_STRING && LA164_0<=RULE_DECIMAL)||LA164_0==27||LA164_0==31||(LA164_0>=34 && LA164_0<=35)||LA164_0==40||(LA164_0>=45 && LA164_0<=50)||LA164_0==74||LA164_0==101||LA164_0==122||(LA164_0>=126 && LA164_0<=127)||LA164_0==129||LA164_0==131||(LA164_0>=135 && LA164_0<=142)||LA164_0==144||LA164_0==164||LA164_0==166) ) {
-                alt164=1;
+            if ( ((LA169_0>=RULE_STRING && LA169_0<=RULE_DECIMAL)||LA169_0==27||LA169_0==31||(LA169_0>=34 && LA169_0<=35)||LA169_0==40||(LA169_0>=45 && LA169_0<=50)||LA169_0==74||LA169_0==103||LA169_0==128||(LA169_0>=132 && LA169_0<=133)||LA169_0==135||LA169_0==137||(LA169_0>=141 && LA169_0<=148)||LA169_0==150||LA169_0==177||LA169_0==179) ) {
+                alt169=1;
             }
-            switch (alt164) {
+            switch (alt169) {
                 case 1 :
-                    // InternalDataDSL.g:20099:3: rule__XConstructorCall__Alternatives_4_1
+                    // InternalDataDSL.g:21185:3: rule__XConstructorCall__Alternatives_4_1
                     {
                     pushFollow(FOLLOW_2);
                     rule__XConstructorCall__Alternatives_4_1();
@@ -66332,14 +69953,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__2"
-    // InternalDataDSL.g:20107:1: rule__XConstructorCall__Group_4__2 : rule__XConstructorCall__Group_4__2__Impl ;
+    // InternalDataDSL.g:21193:1: rule__XConstructorCall__Group_4__2 : rule__XConstructorCall__Group_4__2__Impl ;
     public final void rule__XConstructorCall__Group_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20111:1: ( rule__XConstructorCall__Group_4__2__Impl )
-            // InternalDataDSL.g:20112:2: rule__XConstructorCall__Group_4__2__Impl
+            // InternalDataDSL.g:21197:1: ( rule__XConstructorCall__Group_4__2__Impl )
+            // InternalDataDSL.g:21198:2: rule__XConstructorCall__Group_4__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4__2__Impl();
@@ -66365,22 +69986,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4__2__Impl"
-    // InternalDataDSL.g:20118:1: rule__XConstructorCall__Group_4__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:21204:1: rule__XConstructorCall__Group_4__2__Impl : ( ')' ) ;
     public final void rule__XConstructorCall__Group_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20122:1: ( ( ')' ) )
-            // InternalDataDSL.g:20123:1: ( ')' )
+            // InternalDataDSL.g:21208:1: ( ( ')' ) )
+            // InternalDataDSL.g:21209:1: ( ')' )
             {
-            // InternalDataDSL.g:20123:1: ( ')' )
-            // InternalDataDSL.g:20124:2: ')'
+            // InternalDataDSL.g:21209:1: ( ')' )
+            // InternalDataDSL.g:21210:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2()); 
             }
@@ -66406,16 +70027,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0"
-    // InternalDataDSL.g:20134:1: rule__XConstructorCall__Group_4_1_1__0 : rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 ;
+    // InternalDataDSL.g:21220:1: rule__XConstructorCall__Group_4_1_1__0 : rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 ;
     public final void rule__XConstructorCall__Group_4_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20138:1: ( rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 )
-            // InternalDataDSL.g:20139:2: rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1
+            // InternalDataDSL.g:21224:1: ( rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1 )
+            // InternalDataDSL.g:21225:2: rule__XConstructorCall__Group_4_1_1__0__Impl rule__XConstructorCall__Group_4_1_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XConstructorCall__Group_4_1_1__0__Impl();
 
             state._fsp--;
@@ -66444,23 +70065,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__0__Impl"
-    // InternalDataDSL.g:20146:1: rule__XConstructorCall__Group_4_1_1__0__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) ;
+    // InternalDataDSL.g:21232:1: rule__XConstructorCall__Group_4_1_1__0__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) ;
     public final void rule__XConstructorCall__Group_4_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20150:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) )
-            // InternalDataDSL.g:20151:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            // InternalDataDSL.g:21236:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) ) )
+            // InternalDataDSL.g:21237:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
             {
-            // InternalDataDSL.g:20151:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
-            // InternalDataDSL.g:20152:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            // InternalDataDSL.g:21237:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 ) )
+            // InternalDataDSL.g:21238:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_0()); 
             }
-            // InternalDataDSL.g:20153:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
-            // InternalDataDSL.g:20153:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
+            // InternalDataDSL.g:21239:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 )
+            // InternalDataDSL.g:21239:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ArgumentsAssignment_4_1_1_0();
@@ -66495,14 +70116,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1"
-    // InternalDataDSL.g:20161:1: rule__XConstructorCall__Group_4_1_1__1 : rule__XConstructorCall__Group_4_1_1__1__Impl ;
+    // InternalDataDSL.g:21247:1: rule__XConstructorCall__Group_4_1_1__1 : rule__XConstructorCall__Group_4_1_1__1__Impl ;
     public final void rule__XConstructorCall__Group_4_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20165:1: ( rule__XConstructorCall__Group_4_1_1__1__Impl )
-            // InternalDataDSL.g:20166:2: rule__XConstructorCall__Group_4_1_1__1__Impl
+            // InternalDataDSL.g:21251:1: ( rule__XConstructorCall__Group_4_1_1__1__Impl )
+            // InternalDataDSL.g:21252:2: rule__XConstructorCall__Group_4_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4_1_1__1__Impl();
@@ -66528,37 +70149,37 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1__1__Impl"
-    // InternalDataDSL.g:20172:1: rule__XConstructorCall__Group_4_1_1__1__Impl : ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) ;
+    // InternalDataDSL.g:21258:1: rule__XConstructorCall__Group_4_1_1__1__Impl : ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) ;
     public final void rule__XConstructorCall__Group_4_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20176:1: ( ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) )
-            // InternalDataDSL.g:20177:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            // InternalDataDSL.g:21262:1: ( ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* ) )
+            // InternalDataDSL.g:21263:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
             {
-            // InternalDataDSL.g:20177:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
-            // InternalDataDSL.g:20178:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            // InternalDataDSL.g:21263:1: ( ( rule__XConstructorCall__Group_4_1_1_1__0 )* )
+            // InternalDataDSL.g:21264:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getGroup_4_1_1_1()); 
             }
-            // InternalDataDSL.g:20179:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
-            loop165:
+            // InternalDataDSL.g:21265:2: ( rule__XConstructorCall__Group_4_1_1_1__0 )*
+            loop170:
             do {
-                int alt165=2;
-                int LA165_0 = input.LA(1);
+                int alt170=2;
+                int LA170_0 = input.LA(1);
 
-                if ( (LA165_0==124) ) {
-                    alt165=1;
+                if ( (LA170_0==130) ) {
+                    alt170=1;
                 }
 
 
-                switch (alt165) {
+                switch (alt170) {
             	case 1 :
-            	    // InternalDataDSL.g:20179:3: rule__XConstructorCall__Group_4_1_1_1__0
+            	    // InternalDataDSL.g:21265:3: rule__XConstructorCall__Group_4_1_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XConstructorCall__Group_4_1_1_1__0();
 
             	    state._fsp--;
@@ -66568,7 +70189,7 @@
             	    break;
 
             	default :
-            	    break loop165;
+            	    break loop170;
                 }
             } while (true);
 
@@ -66597,16 +70218,16 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0"
-    // InternalDataDSL.g:20188:1: rule__XConstructorCall__Group_4_1_1_1__0 : rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 ;
+    // InternalDataDSL.g:21274:1: rule__XConstructorCall__Group_4_1_1_1__0 : rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 ;
     public final void rule__XConstructorCall__Group_4_1_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20192:1: ( rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 )
-            // InternalDataDSL.g:20193:2: rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1
+            // InternalDataDSL.g:21278:1: ( rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1 )
+            // InternalDataDSL.g:21279:2: rule__XConstructorCall__Group_4_1_1_1__0__Impl rule__XConstructorCall__Group_4_1_1_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XConstructorCall__Group_4_1_1_1__0__Impl();
 
             state._fsp--;
@@ -66635,22 +70256,22 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__0__Impl"
-    // InternalDataDSL.g:20200:1: rule__XConstructorCall__Group_4_1_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:21286:1: rule__XConstructorCall__Group_4_1_1_1__0__Impl : ( ',' ) ;
     public final void rule__XConstructorCall__Group_4_1_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20204:1: ( ( ',' ) )
-            // InternalDataDSL.g:20205:1: ( ',' )
+            // InternalDataDSL.g:21290:1: ( ( ',' ) )
+            // InternalDataDSL.g:21291:1: ( ',' )
             {
-            // InternalDataDSL.g:20205:1: ( ',' )
-            // InternalDataDSL.g:20206:2: ','
+            // InternalDataDSL.g:21291:1: ( ',' )
+            // InternalDataDSL.g:21292:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0()); 
             }
@@ -66676,14 +70297,14 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1"
-    // InternalDataDSL.g:20215:1: rule__XConstructorCall__Group_4_1_1_1__1 : rule__XConstructorCall__Group_4_1_1_1__1__Impl ;
+    // InternalDataDSL.g:21301:1: rule__XConstructorCall__Group_4_1_1_1__1 : rule__XConstructorCall__Group_4_1_1_1__1__Impl ;
     public final void rule__XConstructorCall__Group_4_1_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20219:1: ( rule__XConstructorCall__Group_4_1_1_1__1__Impl )
-            // InternalDataDSL.g:20220:2: rule__XConstructorCall__Group_4_1_1_1__1__Impl
+            // InternalDataDSL.g:21305:1: ( rule__XConstructorCall__Group_4_1_1_1__1__Impl )
+            // InternalDataDSL.g:21306:2: rule__XConstructorCall__Group_4_1_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__Group_4_1_1_1__1__Impl();
@@ -66709,23 +70330,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__Group_4_1_1_1__1__Impl"
-    // InternalDataDSL.g:20226:1: rule__XConstructorCall__Group_4_1_1_1__1__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) ;
+    // InternalDataDSL.g:21312:1: rule__XConstructorCall__Group_4_1_1_1__1__Impl : ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) ;
     public final void rule__XConstructorCall__Group_4_1_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20230:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) )
-            // InternalDataDSL.g:20231:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            // InternalDataDSL.g:21316:1: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) ) )
+            // InternalDataDSL.g:21317:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
             {
-            // InternalDataDSL.g:20231:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
-            // InternalDataDSL.g:20232:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            // InternalDataDSL.g:21317:1: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 ) )
+            // InternalDataDSL.g:21318:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_1_1_1()); 
             }
-            // InternalDataDSL.g:20233:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
-            // InternalDataDSL.g:20233:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
+            // InternalDataDSL.g:21319:2: ( rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 )
+            // InternalDataDSL.g:21319:3: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1();
@@ -66760,16 +70381,16 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__0"
-    // InternalDataDSL.g:20242:1: rule__XBooleanLiteral__Group__0 : rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 ;
+    // InternalDataDSL.g:21328:1: rule__XBooleanLiteral__Group__0 : rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 ;
     public final void rule__XBooleanLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20246:1: ( rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 )
-            // InternalDataDSL.g:20247:2: rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1
+            // InternalDataDSL.g:21332:1: ( rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1 )
+            // InternalDataDSL.g:21333:2: rule__XBooleanLiteral__Group__0__Impl rule__XBooleanLiteral__Group__1
             {
-            pushFollow(FOLLOW_146);
+            pushFollow(FOLLOW_154);
             rule__XBooleanLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -66798,23 +70419,23 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__0__Impl"
-    // InternalDataDSL.g:20254:1: rule__XBooleanLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21340:1: rule__XBooleanLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XBooleanLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20258:1: ( ( () ) )
-            // InternalDataDSL.g:20259:1: ( () )
+            // InternalDataDSL.g:21344:1: ( ( () ) )
+            // InternalDataDSL.g:21345:1: ( () )
             {
-            // InternalDataDSL.g:20259:1: ( () )
-            // InternalDataDSL.g:20260:2: ()
+            // InternalDataDSL.g:21345:1: ( () )
+            // InternalDataDSL.g:21346:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getXBooleanLiteralAction_0()); 
             }
-            // InternalDataDSL.g:20261:2: ()
-            // InternalDataDSL.g:20261:3: 
+            // InternalDataDSL.g:21347:2: ()
+            // InternalDataDSL.g:21347:3: 
             {
             }
 
@@ -66839,14 +70460,14 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__1"
-    // InternalDataDSL.g:20269:1: rule__XBooleanLiteral__Group__1 : rule__XBooleanLiteral__Group__1__Impl ;
+    // InternalDataDSL.g:21355:1: rule__XBooleanLiteral__Group__1 : rule__XBooleanLiteral__Group__1__Impl ;
     public final void rule__XBooleanLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20273:1: ( rule__XBooleanLiteral__Group__1__Impl )
-            // InternalDataDSL.g:20274:2: rule__XBooleanLiteral__Group__1__Impl
+            // InternalDataDSL.g:21359:1: ( rule__XBooleanLiteral__Group__1__Impl )
+            // InternalDataDSL.g:21360:2: rule__XBooleanLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Group__1__Impl();
@@ -66872,23 +70493,23 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__Group__1__Impl"
-    // InternalDataDSL.g:20280:1: rule__XBooleanLiteral__Group__1__Impl : ( ( rule__XBooleanLiteral__Alternatives_1 ) ) ;
+    // InternalDataDSL.g:21366:1: rule__XBooleanLiteral__Group__1__Impl : ( ( rule__XBooleanLiteral__Alternatives_1 ) ) ;
     public final void rule__XBooleanLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20284:1: ( ( ( rule__XBooleanLiteral__Alternatives_1 ) ) )
-            // InternalDataDSL.g:20285:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            // InternalDataDSL.g:21370:1: ( ( ( rule__XBooleanLiteral__Alternatives_1 ) ) )
+            // InternalDataDSL.g:21371:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
             {
-            // InternalDataDSL.g:20285:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
-            // InternalDataDSL.g:20286:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            // InternalDataDSL.g:21371:1: ( ( rule__XBooleanLiteral__Alternatives_1 ) )
+            // InternalDataDSL.g:21372:2: ( rule__XBooleanLiteral__Alternatives_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getAlternatives_1()); 
             }
-            // InternalDataDSL.g:20287:2: ( rule__XBooleanLiteral__Alternatives_1 )
-            // InternalDataDSL.g:20287:3: rule__XBooleanLiteral__Alternatives_1
+            // InternalDataDSL.g:21373:2: ( rule__XBooleanLiteral__Alternatives_1 )
+            // InternalDataDSL.g:21373:3: rule__XBooleanLiteral__Alternatives_1
             {
             pushFollow(FOLLOW_2);
             rule__XBooleanLiteral__Alternatives_1();
@@ -66923,16 +70544,16 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__0"
-    // InternalDataDSL.g:20296:1: rule__XNullLiteral__Group__0 : rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 ;
+    // InternalDataDSL.g:21382:1: rule__XNullLiteral__Group__0 : rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 ;
     public final void rule__XNullLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20300:1: ( rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 )
-            // InternalDataDSL.g:20301:2: rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1
+            // InternalDataDSL.g:21386:1: ( rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1 )
+            // InternalDataDSL.g:21387:2: rule__XNullLiteral__Group__0__Impl rule__XNullLiteral__Group__1
             {
-            pushFollow(FOLLOW_147);
+            pushFollow(FOLLOW_155);
             rule__XNullLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -66961,23 +70582,23 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__0__Impl"
-    // InternalDataDSL.g:20308:1: rule__XNullLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21394:1: rule__XNullLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XNullLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20312:1: ( ( () ) )
-            // InternalDataDSL.g:20313:1: ( () )
+            // InternalDataDSL.g:21398:1: ( ( () ) )
+            // InternalDataDSL.g:21399:1: ( () )
             {
-            // InternalDataDSL.g:20313:1: ( () )
-            // InternalDataDSL.g:20314:2: ()
+            // InternalDataDSL.g:21399:1: ( () )
+            // InternalDataDSL.g:21400:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getXNullLiteralAction_0()); 
             }
-            // InternalDataDSL.g:20315:2: ()
-            // InternalDataDSL.g:20315:3: 
+            // InternalDataDSL.g:21401:2: ()
+            // InternalDataDSL.g:21401:3: 
             {
             }
 
@@ -67002,14 +70623,14 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__1"
-    // InternalDataDSL.g:20323:1: rule__XNullLiteral__Group__1 : rule__XNullLiteral__Group__1__Impl ;
+    // InternalDataDSL.g:21409:1: rule__XNullLiteral__Group__1 : rule__XNullLiteral__Group__1__Impl ;
     public final void rule__XNullLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20327:1: ( rule__XNullLiteral__Group__1__Impl )
-            // InternalDataDSL.g:20328:2: rule__XNullLiteral__Group__1__Impl
+            // InternalDataDSL.g:21413:1: ( rule__XNullLiteral__Group__1__Impl )
+            // InternalDataDSL.g:21414:2: rule__XNullLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XNullLiteral__Group__1__Impl();
@@ -67035,22 +70656,22 @@
 
 
     // $ANTLR start "rule__XNullLiteral__Group__1__Impl"
-    // InternalDataDSL.g:20334:1: rule__XNullLiteral__Group__1__Impl : ( 'null' ) ;
+    // InternalDataDSL.g:21420:1: rule__XNullLiteral__Group__1__Impl : ( 'null' ) ;
     public final void rule__XNullLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20338:1: ( ( 'null' ) )
-            // InternalDataDSL.g:20339:1: ( 'null' )
+            // InternalDataDSL.g:21424:1: ( ( 'null' ) )
+            // InternalDataDSL.g:21425:1: ( 'null' )
             {
-            // InternalDataDSL.g:20339:1: ( 'null' )
-            // InternalDataDSL.g:20340:2: 'null'
+            // InternalDataDSL.g:21425:1: ( 'null' )
+            // InternalDataDSL.g:21426:2: 'null'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); 
             }
-            match(input,138,FOLLOW_2); if (state.failed) return ;
+            match(input,144,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXNullLiteralAccess().getNullKeyword_1()); 
             }
@@ -67076,16 +70697,16 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__0"
-    // InternalDataDSL.g:20350:1: rule__XNumberLiteral__Group__0 : rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 ;
+    // InternalDataDSL.g:21436:1: rule__XNumberLiteral__Group__0 : rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 ;
     public final void rule__XNumberLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20354:1: ( rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 )
-            // InternalDataDSL.g:20355:2: rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1
+            // InternalDataDSL.g:21440:1: ( rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1 )
+            // InternalDataDSL.g:21441:2: rule__XNumberLiteral__Group__0__Impl rule__XNumberLiteral__Group__1
             {
-            pushFollow(FOLLOW_148);
+            pushFollow(FOLLOW_156);
             rule__XNumberLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -67114,23 +70735,23 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__0__Impl"
-    // InternalDataDSL.g:20362:1: rule__XNumberLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21448:1: rule__XNumberLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XNumberLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20366:1: ( ( () ) )
-            // InternalDataDSL.g:20367:1: ( () )
+            // InternalDataDSL.g:21452:1: ( ( () ) )
+            // InternalDataDSL.g:21453:1: ( () )
             {
-            // InternalDataDSL.g:20367:1: ( () )
-            // InternalDataDSL.g:20368:2: ()
+            // InternalDataDSL.g:21453:1: ( () )
+            // InternalDataDSL.g:21454:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getXNumberLiteralAction_0()); 
             }
-            // InternalDataDSL.g:20369:2: ()
-            // InternalDataDSL.g:20369:3: 
+            // InternalDataDSL.g:21455:2: ()
+            // InternalDataDSL.g:21455:3: 
             {
             }
 
@@ -67155,14 +70776,14 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__1"
-    // InternalDataDSL.g:20377:1: rule__XNumberLiteral__Group__1 : rule__XNumberLiteral__Group__1__Impl ;
+    // InternalDataDSL.g:21463:1: rule__XNumberLiteral__Group__1 : rule__XNumberLiteral__Group__1__Impl ;
     public final void rule__XNumberLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20381:1: ( rule__XNumberLiteral__Group__1__Impl )
-            // InternalDataDSL.g:20382:2: rule__XNumberLiteral__Group__1__Impl
+            // InternalDataDSL.g:21467:1: ( rule__XNumberLiteral__Group__1__Impl )
+            // InternalDataDSL.g:21468:2: rule__XNumberLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__Group__1__Impl();
@@ -67188,23 +70809,23 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__Group__1__Impl"
-    // InternalDataDSL.g:20388:1: rule__XNumberLiteral__Group__1__Impl : ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) ;
+    // InternalDataDSL.g:21474:1: rule__XNumberLiteral__Group__1__Impl : ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) ;
     public final void rule__XNumberLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20392:1: ( ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) )
-            // InternalDataDSL.g:20393:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            // InternalDataDSL.g:21478:1: ( ( ( rule__XNumberLiteral__ValueAssignment_1 ) ) )
+            // InternalDataDSL.g:21479:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
             {
-            // InternalDataDSL.g:20393:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
-            // InternalDataDSL.g:20394:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            // InternalDataDSL.g:21479:1: ( ( rule__XNumberLiteral__ValueAssignment_1 ) )
+            // InternalDataDSL.g:21480:2: ( rule__XNumberLiteral__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getValueAssignment_1()); 
             }
-            // InternalDataDSL.g:20395:2: ( rule__XNumberLiteral__ValueAssignment_1 )
-            // InternalDataDSL.g:20395:3: rule__XNumberLiteral__ValueAssignment_1
+            // InternalDataDSL.g:21481:2: ( rule__XNumberLiteral__ValueAssignment_1 )
+            // InternalDataDSL.g:21481:3: rule__XNumberLiteral__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XNumberLiteral__ValueAssignment_1();
@@ -67239,14 +70860,14 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__0"
-    // InternalDataDSL.g:20404:1: rule__XStringLiteral__Group__0 : rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 ;
+    // InternalDataDSL.g:21490:1: rule__XStringLiteral__Group__0 : rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 ;
     public final void rule__XStringLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20408:1: ( rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 )
-            // InternalDataDSL.g:20409:2: rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1
+            // InternalDataDSL.g:21494:1: ( rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1 )
+            // InternalDataDSL.g:21495:2: rule__XStringLiteral__Group__0__Impl rule__XStringLiteral__Group__1
             {
             pushFollow(FOLLOW_21);
             rule__XStringLiteral__Group__0__Impl();
@@ -67277,23 +70898,23 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__0__Impl"
-    // InternalDataDSL.g:20416:1: rule__XStringLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21502:1: rule__XStringLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XStringLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20420:1: ( ( () ) )
-            // InternalDataDSL.g:20421:1: ( () )
+            // InternalDataDSL.g:21506:1: ( ( () ) )
+            // InternalDataDSL.g:21507:1: ( () )
             {
-            // InternalDataDSL.g:20421:1: ( () )
-            // InternalDataDSL.g:20422:2: ()
+            // InternalDataDSL.g:21507:1: ( () )
+            // InternalDataDSL.g:21508:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getXStringLiteralAction_0()); 
             }
-            // InternalDataDSL.g:20423:2: ()
-            // InternalDataDSL.g:20423:3: 
+            // InternalDataDSL.g:21509:2: ()
+            // InternalDataDSL.g:21509:3: 
             {
             }
 
@@ -67318,14 +70939,14 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__1"
-    // InternalDataDSL.g:20431:1: rule__XStringLiteral__Group__1 : rule__XStringLiteral__Group__1__Impl ;
+    // InternalDataDSL.g:21517:1: rule__XStringLiteral__Group__1 : rule__XStringLiteral__Group__1__Impl ;
     public final void rule__XStringLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20435:1: ( rule__XStringLiteral__Group__1__Impl )
-            // InternalDataDSL.g:20436:2: rule__XStringLiteral__Group__1__Impl
+            // InternalDataDSL.g:21521:1: ( rule__XStringLiteral__Group__1__Impl )
+            // InternalDataDSL.g:21522:2: rule__XStringLiteral__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__Group__1__Impl();
@@ -67351,23 +70972,23 @@
 
 
     // $ANTLR start "rule__XStringLiteral__Group__1__Impl"
-    // InternalDataDSL.g:20442:1: rule__XStringLiteral__Group__1__Impl : ( ( rule__XStringLiteral__ValueAssignment_1 ) ) ;
+    // InternalDataDSL.g:21528:1: rule__XStringLiteral__Group__1__Impl : ( ( rule__XStringLiteral__ValueAssignment_1 ) ) ;
     public final void rule__XStringLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20446:1: ( ( ( rule__XStringLiteral__ValueAssignment_1 ) ) )
-            // InternalDataDSL.g:20447:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            // InternalDataDSL.g:21532:1: ( ( ( rule__XStringLiteral__ValueAssignment_1 ) ) )
+            // InternalDataDSL.g:21533:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
             {
-            // InternalDataDSL.g:20447:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
-            // InternalDataDSL.g:20448:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            // InternalDataDSL.g:21533:1: ( ( rule__XStringLiteral__ValueAssignment_1 ) )
+            // InternalDataDSL.g:21534:2: ( rule__XStringLiteral__ValueAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getValueAssignment_1()); 
             }
-            // InternalDataDSL.g:20449:2: ( rule__XStringLiteral__ValueAssignment_1 )
-            // InternalDataDSL.g:20449:3: rule__XStringLiteral__ValueAssignment_1
+            // InternalDataDSL.g:21535:2: ( rule__XStringLiteral__ValueAssignment_1 )
+            // InternalDataDSL.g:21535:3: rule__XStringLiteral__ValueAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XStringLiteral__ValueAssignment_1();
@@ -67402,16 +71023,16 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__0"
-    // InternalDataDSL.g:20458:1: rule__XTypeLiteral__Group__0 : rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 ;
+    // InternalDataDSL.g:21544:1: rule__XTypeLiteral__Group__0 : rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 ;
     public final void rule__XTypeLiteral__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20462:1: ( rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 )
-            // InternalDataDSL.g:20463:2: rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1
+            // InternalDataDSL.g:21548:1: ( rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1 )
+            // InternalDataDSL.g:21549:2: rule__XTypeLiteral__Group__0__Impl rule__XTypeLiteral__Group__1
             {
-            pushFollow(FOLLOW_149);
+            pushFollow(FOLLOW_157);
             rule__XTypeLiteral__Group__0__Impl();
 
             state._fsp--;
@@ -67440,23 +71061,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__0__Impl"
-    // InternalDataDSL.g:20470:1: rule__XTypeLiteral__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21556:1: rule__XTypeLiteral__Group__0__Impl : ( () ) ;
     public final void rule__XTypeLiteral__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20474:1: ( ( () ) )
-            // InternalDataDSL.g:20475:1: ( () )
+            // InternalDataDSL.g:21560:1: ( ( () ) )
+            // InternalDataDSL.g:21561:1: ( () )
             {
-            // InternalDataDSL.g:20475:1: ( () )
-            // InternalDataDSL.g:20476:2: ()
+            // InternalDataDSL.g:21561:1: ( () )
+            // InternalDataDSL.g:21562:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getXTypeLiteralAction_0()); 
             }
-            // InternalDataDSL.g:20477:2: ()
-            // InternalDataDSL.g:20477:3: 
+            // InternalDataDSL.g:21563:2: ()
+            // InternalDataDSL.g:21563:3: 
             {
             }
 
@@ -67481,16 +71102,16 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__1"
-    // InternalDataDSL.g:20485:1: rule__XTypeLiteral__Group__1 : rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 ;
+    // InternalDataDSL.g:21571:1: rule__XTypeLiteral__Group__1 : rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 ;
     public final void rule__XTypeLiteral__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20489:1: ( rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 )
-            // InternalDataDSL.g:20490:2: rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2
+            // InternalDataDSL.g:21575:1: ( rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2 )
+            // InternalDataDSL.g:21576:2: rule__XTypeLiteral__Group__1__Impl rule__XTypeLiteral__Group__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XTypeLiteral__Group__1__Impl();
 
             state._fsp--;
@@ -67519,22 +71140,22 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__1__Impl"
-    // InternalDataDSL.g:20497:1: rule__XTypeLiteral__Group__1__Impl : ( 'typeof' ) ;
+    // InternalDataDSL.g:21583:1: rule__XTypeLiteral__Group__1__Impl : ( 'typeof' ) ;
     public final void rule__XTypeLiteral__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20501:1: ( ( 'typeof' ) )
-            // InternalDataDSL.g:20502:1: ( 'typeof' )
+            // InternalDataDSL.g:21587:1: ( ( 'typeof' ) )
+            // InternalDataDSL.g:21588:1: ( 'typeof' )
             {
-            // InternalDataDSL.g:20502:1: ( 'typeof' )
-            // InternalDataDSL.g:20503:2: 'typeof'
+            // InternalDataDSL.g:21588:1: ( 'typeof' )
+            // InternalDataDSL.g:21589:2: 'typeof'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); 
             }
-            match(input,139,FOLLOW_2); if (state.failed) return ;
+            match(input,145,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1()); 
             }
@@ -67560,14 +71181,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__2"
-    // InternalDataDSL.g:20512:1: rule__XTypeLiteral__Group__2 : rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 ;
+    // InternalDataDSL.g:21598:1: rule__XTypeLiteral__Group__2 : rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 ;
     public final void rule__XTypeLiteral__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20516:1: ( rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 )
-            // InternalDataDSL.g:20517:2: rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3
+            // InternalDataDSL.g:21602:1: ( rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3 )
+            // InternalDataDSL.g:21603:2: rule__XTypeLiteral__Group__2__Impl rule__XTypeLiteral__Group__3
             {
             pushFollow(FOLLOW_7);
             rule__XTypeLiteral__Group__2__Impl();
@@ -67598,22 +71219,22 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__2__Impl"
-    // InternalDataDSL.g:20524:1: rule__XTypeLiteral__Group__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:21610:1: rule__XTypeLiteral__Group__2__Impl : ( '(' ) ;
     public final void rule__XTypeLiteral__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20528:1: ( ( '(' ) )
-            // InternalDataDSL.g:20529:1: ( '(' )
+            // InternalDataDSL.g:21614:1: ( ( '(' ) )
+            // InternalDataDSL.g:21615:1: ( '(' )
             {
-            // InternalDataDSL.g:20529:1: ( '(' )
-            // InternalDataDSL.g:20530:2: '('
+            // InternalDataDSL.g:21615:1: ( '(' )
+            // InternalDataDSL.g:21616:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2()); 
             }
@@ -67639,16 +71260,16 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__3"
-    // InternalDataDSL.g:20539:1: rule__XTypeLiteral__Group__3 : rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 ;
+    // InternalDataDSL.g:21625:1: rule__XTypeLiteral__Group__3 : rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 ;
     public final void rule__XTypeLiteral__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20543:1: ( rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 )
-            // InternalDataDSL.g:20544:2: rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4
+            // InternalDataDSL.g:21629:1: ( rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4 )
+            // InternalDataDSL.g:21630:2: rule__XTypeLiteral__Group__3__Impl rule__XTypeLiteral__Group__4
             {
-            pushFollow(FOLLOW_150);
+            pushFollow(FOLLOW_158);
             rule__XTypeLiteral__Group__3__Impl();
 
             state._fsp--;
@@ -67677,23 +71298,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__3__Impl"
-    // InternalDataDSL.g:20551:1: rule__XTypeLiteral__Group__3__Impl : ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) ;
+    // InternalDataDSL.g:21637:1: rule__XTypeLiteral__Group__3__Impl : ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) ;
     public final void rule__XTypeLiteral__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20555:1: ( ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) )
-            // InternalDataDSL.g:20556:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            // InternalDataDSL.g:21641:1: ( ( ( rule__XTypeLiteral__TypeAssignment_3 ) ) )
+            // InternalDataDSL.g:21642:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
             {
-            // InternalDataDSL.g:20556:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
-            // InternalDataDSL.g:20557:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            // InternalDataDSL.g:21642:1: ( ( rule__XTypeLiteral__TypeAssignment_3 ) )
+            // InternalDataDSL.g:21643:2: ( rule__XTypeLiteral__TypeAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeAssignment_3()); 
             }
-            // InternalDataDSL.g:20558:2: ( rule__XTypeLiteral__TypeAssignment_3 )
-            // InternalDataDSL.g:20558:3: rule__XTypeLiteral__TypeAssignment_3
+            // InternalDataDSL.g:21644:2: ( rule__XTypeLiteral__TypeAssignment_3 )
+            // InternalDataDSL.g:21644:3: rule__XTypeLiteral__TypeAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__TypeAssignment_3();
@@ -67728,16 +71349,16 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__4"
-    // InternalDataDSL.g:20566:1: rule__XTypeLiteral__Group__4 : rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 ;
+    // InternalDataDSL.g:21652:1: rule__XTypeLiteral__Group__4 : rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 ;
     public final void rule__XTypeLiteral__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20570:1: ( rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 )
-            // InternalDataDSL.g:20571:2: rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5
+            // InternalDataDSL.g:21656:1: ( rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5 )
+            // InternalDataDSL.g:21657:2: rule__XTypeLiteral__Group__4__Impl rule__XTypeLiteral__Group__5
             {
-            pushFollow(FOLLOW_150);
+            pushFollow(FOLLOW_158);
             rule__XTypeLiteral__Group__4__Impl();
 
             state._fsp--;
@@ -67766,37 +71387,37 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__4__Impl"
-    // InternalDataDSL.g:20578:1: rule__XTypeLiteral__Group__4__Impl : ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) ;
+    // InternalDataDSL.g:21664:1: rule__XTypeLiteral__Group__4__Impl : ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) ;
     public final void rule__XTypeLiteral__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20582:1: ( ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) )
-            // InternalDataDSL.g:20583:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            // InternalDataDSL.g:21668:1: ( ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* ) )
+            // InternalDataDSL.g:21669:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
             {
-            // InternalDataDSL.g:20583:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
-            // InternalDataDSL.g:20584:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            // InternalDataDSL.g:21669:1: ( ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )* )
+            // InternalDataDSL.g:21670:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsAssignment_4()); 
             }
-            // InternalDataDSL.g:20585:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
-            loop166:
+            // InternalDataDSL.g:21671:2: ( rule__XTypeLiteral__ArrayDimensionsAssignment_4 )*
+            loop171:
             do {
-                int alt166=2;
-                int LA166_0 = input.LA(1);
+                int alt171=2;
+                int LA171_0 = input.LA(1);
 
-                if ( (LA166_0==127) ) {
-                    alt166=1;
+                if ( (LA171_0==133) ) {
+                    alt171=1;
                 }
 
 
-                switch (alt166) {
+                switch (alt171) {
             	case 1 :
-            	    // InternalDataDSL.g:20585:3: rule__XTypeLiteral__ArrayDimensionsAssignment_4
+            	    // InternalDataDSL.g:21671:3: rule__XTypeLiteral__ArrayDimensionsAssignment_4
             	    {
-            	    pushFollow(FOLLOW_151);
+            	    pushFollow(FOLLOW_159);
             	    rule__XTypeLiteral__ArrayDimensionsAssignment_4();
 
             	    state._fsp--;
@@ -67806,7 +71427,7 @@
             	    break;
 
             	default :
-            	    break loop166;
+            	    break loop171;
                 }
             } while (true);
 
@@ -67835,14 +71456,14 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__5"
-    // InternalDataDSL.g:20593:1: rule__XTypeLiteral__Group__5 : rule__XTypeLiteral__Group__5__Impl ;
+    // InternalDataDSL.g:21679:1: rule__XTypeLiteral__Group__5 : rule__XTypeLiteral__Group__5__Impl ;
     public final void rule__XTypeLiteral__Group__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20597:1: ( rule__XTypeLiteral__Group__5__Impl )
-            // InternalDataDSL.g:20598:2: rule__XTypeLiteral__Group__5__Impl
+            // InternalDataDSL.g:21683:1: ( rule__XTypeLiteral__Group__5__Impl )
+            // InternalDataDSL.g:21684:2: rule__XTypeLiteral__Group__5__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTypeLiteral__Group__5__Impl();
@@ -67868,22 +71489,22 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__Group__5__Impl"
-    // InternalDataDSL.g:20604:1: rule__XTypeLiteral__Group__5__Impl : ( ')' ) ;
+    // InternalDataDSL.g:21690:1: rule__XTypeLiteral__Group__5__Impl : ( ')' ) ;
     public final void rule__XTypeLiteral__Group__5__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20608:1: ( ( ')' ) )
-            // InternalDataDSL.g:20609:1: ( ')' )
+            // InternalDataDSL.g:21694:1: ( ( ')' ) )
+            // InternalDataDSL.g:21695:1: ( ')' )
             {
-            // InternalDataDSL.g:20609:1: ( ')' )
-            // InternalDataDSL.g:20610:2: ')'
+            // InternalDataDSL.g:21695:1: ( ')' )
+            // InternalDataDSL.g:21696:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5()); 
             }
@@ -67909,16 +71530,16 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__0"
-    // InternalDataDSL.g:20620:1: rule__XThrowExpression__Group__0 : rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 ;
+    // InternalDataDSL.g:21706:1: rule__XThrowExpression__Group__0 : rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 ;
     public final void rule__XThrowExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20624:1: ( rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 )
-            // InternalDataDSL.g:20625:2: rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1
+            // InternalDataDSL.g:21710:1: ( rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1 )
+            // InternalDataDSL.g:21711:2: rule__XThrowExpression__Group__0__Impl rule__XThrowExpression__Group__1
             {
-            pushFollow(FOLLOW_152);
+            pushFollow(FOLLOW_160);
             rule__XThrowExpression__Group__0__Impl();
 
             state._fsp--;
@@ -67947,23 +71568,23 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__0__Impl"
-    // InternalDataDSL.g:20632:1: rule__XThrowExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21718:1: rule__XThrowExpression__Group__0__Impl : ( () ) ;
     public final void rule__XThrowExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20636:1: ( ( () ) )
-            // InternalDataDSL.g:20637:1: ( () )
+            // InternalDataDSL.g:21722:1: ( ( () ) )
+            // InternalDataDSL.g:21723:1: ( () )
             {
-            // InternalDataDSL.g:20637:1: ( () )
-            // InternalDataDSL.g:20638:2: ()
+            // InternalDataDSL.g:21723:1: ( () )
+            // InternalDataDSL.g:21724:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getXThrowExpressionAction_0()); 
             }
-            // InternalDataDSL.g:20639:2: ()
-            // InternalDataDSL.g:20639:3: 
+            // InternalDataDSL.g:21725:2: ()
+            // InternalDataDSL.g:21725:3: 
             {
             }
 
@@ -67988,16 +71609,16 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__1"
-    // InternalDataDSL.g:20647:1: rule__XThrowExpression__Group__1 : rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 ;
+    // InternalDataDSL.g:21733:1: rule__XThrowExpression__Group__1 : rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 ;
     public final void rule__XThrowExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20651:1: ( rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 )
-            // InternalDataDSL.g:20652:2: rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2
+            // InternalDataDSL.g:21737:1: ( rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2 )
+            // InternalDataDSL.g:21738:2: rule__XThrowExpression__Group__1__Impl rule__XThrowExpression__Group__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XThrowExpression__Group__1__Impl();
 
             state._fsp--;
@@ -68026,22 +71647,22 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__1__Impl"
-    // InternalDataDSL.g:20659:1: rule__XThrowExpression__Group__1__Impl : ( 'throw' ) ;
+    // InternalDataDSL.g:21745:1: rule__XThrowExpression__Group__1__Impl : ( 'throw' ) ;
     public final void rule__XThrowExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20663:1: ( ( 'throw' ) )
-            // InternalDataDSL.g:20664:1: ( 'throw' )
+            // InternalDataDSL.g:21749:1: ( ( 'throw' ) )
+            // InternalDataDSL.g:21750:1: ( 'throw' )
             {
-            // InternalDataDSL.g:20664:1: ( 'throw' )
-            // InternalDataDSL.g:20665:2: 'throw'
+            // InternalDataDSL.g:21750:1: ( 'throw' )
+            // InternalDataDSL.g:21751:2: 'throw'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); 
             }
-            match(input,140,FOLLOW_2); if (state.failed) return ;
+            match(input,146,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1()); 
             }
@@ -68067,14 +71688,14 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__2"
-    // InternalDataDSL.g:20674:1: rule__XThrowExpression__Group__2 : rule__XThrowExpression__Group__2__Impl ;
+    // InternalDataDSL.g:21760:1: rule__XThrowExpression__Group__2 : rule__XThrowExpression__Group__2__Impl ;
     public final void rule__XThrowExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20678:1: ( rule__XThrowExpression__Group__2__Impl )
-            // InternalDataDSL.g:20679:2: rule__XThrowExpression__Group__2__Impl
+            // InternalDataDSL.g:21764:1: ( rule__XThrowExpression__Group__2__Impl )
+            // InternalDataDSL.g:21765:2: rule__XThrowExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__Group__2__Impl();
@@ -68100,23 +71721,23 @@
 
 
     // $ANTLR start "rule__XThrowExpression__Group__2__Impl"
-    // InternalDataDSL.g:20685:1: rule__XThrowExpression__Group__2__Impl : ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) ;
+    // InternalDataDSL.g:21771:1: rule__XThrowExpression__Group__2__Impl : ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) ;
     public final void rule__XThrowExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20689:1: ( ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) )
-            // InternalDataDSL.g:20690:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:21775:1: ( ( ( rule__XThrowExpression__ExpressionAssignment_2 ) ) )
+            // InternalDataDSL.g:21776:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
             {
-            // InternalDataDSL.g:20690:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
-            // InternalDataDSL.g:20691:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            // InternalDataDSL.g:21776:1: ( ( rule__XThrowExpression__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:21777:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalDataDSL.g:20692:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
-            // InternalDataDSL.g:20692:3: rule__XThrowExpression__ExpressionAssignment_2
+            // InternalDataDSL.g:21778:2: ( rule__XThrowExpression__ExpressionAssignment_2 )
+            // InternalDataDSL.g:21778:3: rule__XThrowExpression__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XThrowExpression__ExpressionAssignment_2();
@@ -68151,16 +71772,16 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__0"
-    // InternalDataDSL.g:20701:1: rule__XReturnExpression__Group__0 : rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 ;
+    // InternalDataDSL.g:21787:1: rule__XReturnExpression__Group__0 : rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 ;
     public final void rule__XReturnExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20705:1: ( rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 )
-            // InternalDataDSL.g:20706:2: rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1
+            // InternalDataDSL.g:21791:1: ( rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1 )
+            // InternalDataDSL.g:21792:2: rule__XReturnExpression__Group__0__Impl rule__XReturnExpression__Group__1
             {
-            pushFollow(FOLLOW_153);
+            pushFollow(FOLLOW_161);
             rule__XReturnExpression__Group__0__Impl();
 
             state._fsp--;
@@ -68189,23 +71810,23 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__0__Impl"
-    // InternalDataDSL.g:20713:1: rule__XReturnExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21799:1: rule__XReturnExpression__Group__0__Impl : ( () ) ;
     public final void rule__XReturnExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20717:1: ( ( () ) )
-            // InternalDataDSL.g:20718:1: ( () )
+            // InternalDataDSL.g:21803:1: ( ( () ) )
+            // InternalDataDSL.g:21804:1: ( () )
             {
-            // InternalDataDSL.g:20718:1: ( () )
-            // InternalDataDSL.g:20719:2: ()
+            // InternalDataDSL.g:21804:1: ( () )
+            // InternalDataDSL.g:21805:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getXReturnExpressionAction_0()); 
             }
-            // InternalDataDSL.g:20720:2: ()
-            // InternalDataDSL.g:20720:3: 
+            // InternalDataDSL.g:21806:2: ()
+            // InternalDataDSL.g:21806:3: 
             {
             }
 
@@ -68230,16 +71851,16 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__1"
-    // InternalDataDSL.g:20728:1: rule__XReturnExpression__Group__1 : rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 ;
+    // InternalDataDSL.g:21814:1: rule__XReturnExpression__Group__1 : rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 ;
     public final void rule__XReturnExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20732:1: ( rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 )
-            // InternalDataDSL.g:20733:2: rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2
+            // InternalDataDSL.g:21818:1: ( rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2 )
+            // InternalDataDSL.g:21819:2: rule__XReturnExpression__Group__1__Impl rule__XReturnExpression__Group__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XReturnExpression__Group__1__Impl();
 
             state._fsp--;
@@ -68268,22 +71889,22 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__1__Impl"
-    // InternalDataDSL.g:20740:1: rule__XReturnExpression__Group__1__Impl : ( 'return' ) ;
+    // InternalDataDSL.g:21826:1: rule__XReturnExpression__Group__1__Impl : ( 'return' ) ;
     public final void rule__XReturnExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20744:1: ( ( 'return' ) )
-            // InternalDataDSL.g:20745:1: ( 'return' )
+            // InternalDataDSL.g:21830:1: ( ( 'return' ) )
+            // InternalDataDSL.g:21831:1: ( 'return' )
             {
-            // InternalDataDSL.g:20745:1: ( 'return' )
-            // InternalDataDSL.g:20746:2: 'return'
+            // InternalDataDSL.g:21831:1: ( 'return' )
+            // InternalDataDSL.g:21832:2: 'return'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); 
             }
-            match(input,141,FOLLOW_2); if (state.failed) return ;
+            match(input,147,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1()); 
             }
@@ -68309,14 +71930,14 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__2"
-    // InternalDataDSL.g:20755:1: rule__XReturnExpression__Group__2 : rule__XReturnExpression__Group__2__Impl ;
+    // InternalDataDSL.g:21841:1: rule__XReturnExpression__Group__2 : rule__XReturnExpression__Group__2__Impl ;
     public final void rule__XReturnExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20759:1: ( rule__XReturnExpression__Group__2__Impl )
-            // InternalDataDSL.g:20760:2: rule__XReturnExpression__Group__2__Impl
+            // InternalDataDSL.g:21845:1: ( rule__XReturnExpression__Group__2__Impl )
+            // InternalDataDSL.g:21846:2: rule__XReturnExpression__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XReturnExpression__Group__2__Impl();
@@ -68342,27 +71963,27 @@
 
 
     // $ANTLR start "rule__XReturnExpression__Group__2__Impl"
-    // InternalDataDSL.g:20766:1: rule__XReturnExpression__Group__2__Impl : ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) ;
+    // InternalDataDSL.g:21852:1: rule__XReturnExpression__Group__2__Impl : ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) ;
     public final void rule__XReturnExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20770:1: ( ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) )
-            // InternalDataDSL.g:20771:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            // InternalDataDSL.g:21856:1: ( ( ( rule__XReturnExpression__ExpressionAssignment_2 )? ) )
+            // InternalDataDSL.g:21857:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
             {
-            // InternalDataDSL.g:20771:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
-            // InternalDataDSL.g:20772:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            // InternalDataDSL.g:21857:1: ( ( rule__XReturnExpression__ExpressionAssignment_2 )? )
+            // InternalDataDSL.g:21858:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalDataDSL.g:20773:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
-            int alt167=2;
-            alt167 = dfa167.predict(input);
-            switch (alt167) {
+            // InternalDataDSL.g:21859:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?
+            int alt172=2;
+            alt172 = dfa172.predict(input);
+            switch (alt172) {
                 case 1 :
-                    // InternalDataDSL.g:20773:3: rule__XReturnExpression__ExpressionAssignment_2
+                    // InternalDataDSL.g:21859:3: rule__XReturnExpression__ExpressionAssignment_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__XReturnExpression__ExpressionAssignment_2();
@@ -68400,16 +72021,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0"
-    // InternalDataDSL.g:20782:1: rule__XTryCatchFinallyExpression__Group__0 : rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 ;
+    // InternalDataDSL.g:21868:1: rule__XTryCatchFinallyExpression__Group__0 : rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 ;
     public final void rule__XTryCatchFinallyExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20786:1: ( rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 )
-            // InternalDataDSL.g:20787:2: rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1
+            // InternalDataDSL.g:21872:1: ( rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1 )
+            // InternalDataDSL.g:21873:2: rule__XTryCatchFinallyExpression__Group__0__Impl rule__XTryCatchFinallyExpression__Group__1
             {
-            pushFollow(FOLLOW_154);
+            pushFollow(FOLLOW_162);
             rule__XTryCatchFinallyExpression__Group__0__Impl();
 
             state._fsp--;
@@ -68438,23 +72059,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__0__Impl"
-    // InternalDataDSL.g:20794:1: rule__XTryCatchFinallyExpression__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:21880:1: rule__XTryCatchFinallyExpression__Group__0__Impl : ( () ) ;
     public final void rule__XTryCatchFinallyExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20798:1: ( ( () ) )
-            // InternalDataDSL.g:20799:1: ( () )
+            // InternalDataDSL.g:21884:1: ( ( () ) )
+            // InternalDataDSL.g:21885:1: ( () )
             {
-            // InternalDataDSL.g:20799:1: ( () )
-            // InternalDataDSL.g:20800:2: ()
+            // InternalDataDSL.g:21885:1: ( () )
+            // InternalDataDSL.g:21886:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getXTryCatchFinallyExpressionAction_0()); 
             }
-            // InternalDataDSL.g:20801:2: ()
-            // InternalDataDSL.g:20801:3: 
+            // InternalDataDSL.g:21887:2: ()
+            // InternalDataDSL.g:21887:3: 
             {
             }
 
@@ -68479,16 +72100,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1"
-    // InternalDataDSL.g:20809:1: rule__XTryCatchFinallyExpression__Group__1 : rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 ;
+    // InternalDataDSL.g:21895:1: rule__XTryCatchFinallyExpression__Group__1 : rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 ;
     public final void rule__XTryCatchFinallyExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20813:1: ( rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 )
-            // InternalDataDSL.g:20814:2: rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2
+            // InternalDataDSL.g:21899:1: ( rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2 )
+            // InternalDataDSL.g:21900:2: rule__XTryCatchFinallyExpression__Group__1__Impl rule__XTryCatchFinallyExpression__Group__2
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XTryCatchFinallyExpression__Group__1__Impl();
 
             state._fsp--;
@@ -68517,22 +72138,22 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__1__Impl"
-    // InternalDataDSL.g:20821:1: rule__XTryCatchFinallyExpression__Group__1__Impl : ( 'try' ) ;
+    // InternalDataDSL.g:21907:1: rule__XTryCatchFinallyExpression__Group__1__Impl : ( 'try' ) ;
     public final void rule__XTryCatchFinallyExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20825:1: ( ( 'try' ) )
-            // InternalDataDSL.g:20826:1: ( 'try' )
+            // InternalDataDSL.g:21911:1: ( ( 'try' ) )
+            // InternalDataDSL.g:21912:1: ( 'try' )
             {
-            // InternalDataDSL.g:20826:1: ( 'try' )
-            // InternalDataDSL.g:20827:2: 'try'
+            // InternalDataDSL.g:21912:1: ( 'try' )
+            // InternalDataDSL.g:21913:2: 'try'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); 
             }
-            match(input,142,FOLLOW_2); if (state.failed) return ;
+            match(input,148,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1()); 
             }
@@ -68558,16 +72179,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2"
-    // InternalDataDSL.g:20836:1: rule__XTryCatchFinallyExpression__Group__2 : rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 ;
+    // InternalDataDSL.g:21922:1: rule__XTryCatchFinallyExpression__Group__2 : rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 ;
     public final void rule__XTryCatchFinallyExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20840:1: ( rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 )
-            // InternalDataDSL.g:20841:2: rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3
+            // InternalDataDSL.g:21926:1: ( rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3 )
+            // InternalDataDSL.g:21927:2: rule__XTryCatchFinallyExpression__Group__2__Impl rule__XTryCatchFinallyExpression__Group__3
             {
-            pushFollow(FOLLOW_155);
+            pushFollow(FOLLOW_163);
             rule__XTryCatchFinallyExpression__Group__2__Impl();
 
             state._fsp--;
@@ -68596,23 +72217,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__2__Impl"
-    // InternalDataDSL.g:20848:1: rule__XTryCatchFinallyExpression__Group__2__Impl : ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) ;
+    // InternalDataDSL.g:21934:1: rule__XTryCatchFinallyExpression__Group__2__Impl : ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20852:1: ( ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) )
-            // InternalDataDSL.g:20853:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:21938:1: ( ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) ) )
+            // InternalDataDSL.g:21939:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
             {
-            // InternalDataDSL.g:20853:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
-            // InternalDataDSL.g:20854:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            // InternalDataDSL.g:21939:1: ( ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 ) )
+            // InternalDataDSL.g:21940:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionAssignment_2()); 
             }
-            // InternalDataDSL.g:20855:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
-            // InternalDataDSL.g:20855:3: rule__XTryCatchFinallyExpression__ExpressionAssignment_2
+            // InternalDataDSL.g:21941:2: ( rule__XTryCatchFinallyExpression__ExpressionAssignment_2 )
+            // InternalDataDSL.g:21941:3: rule__XTryCatchFinallyExpression__ExpressionAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__ExpressionAssignment_2();
@@ -68647,14 +72268,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3"
-    // InternalDataDSL.g:20863:1: rule__XTryCatchFinallyExpression__Group__3 : rule__XTryCatchFinallyExpression__Group__3__Impl ;
+    // InternalDataDSL.g:21949:1: rule__XTryCatchFinallyExpression__Group__3 : rule__XTryCatchFinallyExpression__Group__3__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20867:1: ( rule__XTryCatchFinallyExpression__Group__3__Impl )
-            // InternalDataDSL.g:20868:2: rule__XTryCatchFinallyExpression__Group__3__Impl
+            // InternalDataDSL.g:21953:1: ( rule__XTryCatchFinallyExpression__Group__3__Impl )
+            // InternalDataDSL.g:21954:2: rule__XTryCatchFinallyExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group__3__Impl();
@@ -68680,23 +72301,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group__3__Impl"
-    // InternalDataDSL.g:20874:1: rule__XTryCatchFinallyExpression__Group__3__Impl : ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) ;
+    // InternalDataDSL.g:21960:1: rule__XTryCatchFinallyExpression__Group__3__Impl : ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20878:1: ( ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) )
-            // InternalDataDSL.g:20879:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            // InternalDataDSL.g:21964:1: ( ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) ) )
+            // InternalDataDSL.g:21965:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
             {
-            // InternalDataDSL.g:20879:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
-            // InternalDataDSL.g:20880:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            // InternalDataDSL.g:21965:1: ( ( rule__XTryCatchFinallyExpression__Alternatives_3 ) )
+            // InternalDataDSL.g:21966:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getAlternatives_3()); 
             }
-            // InternalDataDSL.g:20881:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
-            // InternalDataDSL.g:20881:3: rule__XTryCatchFinallyExpression__Alternatives_3
+            // InternalDataDSL.g:21967:2: ( rule__XTryCatchFinallyExpression__Alternatives_3 )
+            // InternalDataDSL.g:21967:3: rule__XTryCatchFinallyExpression__Alternatives_3
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Alternatives_3();
@@ -68731,16 +72352,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0"
-    // InternalDataDSL.g:20890:1: rule__XTryCatchFinallyExpression__Group_3_0__0 : rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 ;
+    // InternalDataDSL.g:21976:1: rule__XTryCatchFinallyExpression__Group_3_0__0 : rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20894:1: ( rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 )
-            // InternalDataDSL.g:20895:2: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1
+            // InternalDataDSL.g:21980:1: ( rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1 )
+            // InternalDataDSL.g:21981:2: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl rule__XTryCatchFinallyExpression__Group_3_0__1
             {
-            pushFollow(FOLLOW_156);
+            pushFollow(FOLLOW_164);
             rule__XTryCatchFinallyExpression__Group_3_0__0__Impl();
 
             state._fsp--;
@@ -68769,28 +72390,28 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__0__Impl"
-    // InternalDataDSL.g:20902:1: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl : ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) ;
+    // InternalDataDSL.g:21988:1: rule__XTryCatchFinallyExpression__Group_3_0__0__Impl : ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20906:1: ( ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) )
-            // InternalDataDSL.g:20907:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            // InternalDataDSL.g:21992:1: ( ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) ) )
+            // InternalDataDSL.g:21993:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
             {
-            // InternalDataDSL.g:20907:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
-            // InternalDataDSL.g:20908:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            // InternalDataDSL.g:21993:1: ( ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* ) )
+            // InternalDataDSL.g:21994:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) ) ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
             {
-            // InternalDataDSL.g:20908:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) )
-            // InternalDataDSL.g:20909:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            // InternalDataDSL.g:21994:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 ) )
+            // InternalDataDSL.g:21995:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
             }
-            // InternalDataDSL.g:20910:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
-            // InternalDataDSL.g:20910:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            // InternalDataDSL.g:21996:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+            // InternalDataDSL.g:21996:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
             {
-            pushFollow(FOLLOW_157);
+            pushFollow(FOLLOW_165);
             rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
 
             state._fsp--;
@@ -68804,34 +72425,34 @@
 
             }
 
-            // InternalDataDSL.g:20913:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
-            // InternalDataDSL.g:20914:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            // InternalDataDSL.g:21999:2: ( ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )* )
+            // InternalDataDSL.g:22000:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesAssignment_3_0_0()); 
             }
-            // InternalDataDSL.g:20915:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
-            loop168:
+            // InternalDataDSL.g:22001:3: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )*
+            loop173:
             do {
-                int alt168=2;
-                int LA168_0 = input.LA(1);
+                int alt173=2;
+                int LA173_0 = input.LA(1);
 
-                if ( (LA168_0==145) ) {
-                    int LA168_2 = input.LA(2);
+                if ( (LA173_0==151) ) {
+                    int LA173_2 = input.LA(2);
 
-                    if ( (synpred228_InternalDataDSL()) ) {
-                        alt168=1;
+                    if ( (synpred239_InternalDataDSL()) ) {
+                        alt173=1;
                     }
 
 
                 }
 
 
-                switch (alt168) {
+                switch (alt173) {
             	case 1 :
-            	    // InternalDataDSL.g:20915:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+            	    // InternalDataDSL.g:22001:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
             	    {
-            	    pushFollow(FOLLOW_157);
+            	    pushFollow(FOLLOW_165);
             	    rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
 
             	    state._fsp--;
@@ -68841,7 +72462,7 @@
             	    break;
 
             	default :
-            	    break loop168;
+            	    break loop173;
                 }
             } while (true);
 
@@ -68873,14 +72494,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1"
-    // InternalDataDSL.g:20924:1: rule__XTryCatchFinallyExpression__Group_3_0__1 : rule__XTryCatchFinallyExpression__Group_3_0__1__Impl ;
+    // InternalDataDSL.g:22010:1: rule__XTryCatchFinallyExpression__Group_3_0__1 : rule__XTryCatchFinallyExpression__Group_3_0__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20928:1: ( rule__XTryCatchFinallyExpression__Group_3_0__1__Impl )
-            // InternalDataDSL.g:20929:2: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
+            // InternalDataDSL.g:22014:1: ( rule__XTryCatchFinallyExpression__Group_3_0__1__Impl )
+            // InternalDataDSL.g:22015:2: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_0__1__Impl();
@@ -68906,35 +72527,35 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0__1__Impl"
-    // InternalDataDSL.g:20935:1: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl : ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) ;
+    // InternalDataDSL.g:22021:1: rule__XTryCatchFinallyExpression__Group_3_0__1__Impl : ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20939:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) )
-            // InternalDataDSL.g:20940:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            // InternalDataDSL.g:22025:1: ( ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? ) )
+            // InternalDataDSL.g:22026:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
             {
-            // InternalDataDSL.g:20940:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
-            // InternalDataDSL.g:20941:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            // InternalDataDSL.g:22026:1: ( ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )? )
+            // InternalDataDSL.g:22027:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getGroup_3_0_1()); 
             }
-            // InternalDataDSL.g:20942:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
-            int alt169=2;
-            int LA169_0 = input.LA(1);
+            // InternalDataDSL.g:22028:2: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )?
+            int alt174=2;
+            int LA174_0 = input.LA(1);
 
-            if ( (LA169_0==143) ) {
-                int LA169_1 = input.LA(2);
+            if ( (LA174_0==149) ) {
+                int LA174_1 = input.LA(2);
 
-                if ( (synpred229_InternalDataDSL()) ) {
-                    alt169=1;
+                if ( (synpred240_InternalDataDSL()) ) {
+                    alt174=1;
                 }
             }
-            switch (alt169) {
+            switch (alt174) {
                 case 1 :
-                    // InternalDataDSL.g:20942:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+                    // InternalDataDSL.g:22028:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XTryCatchFinallyExpression__Group_3_0_1__0();
@@ -68972,16 +72593,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0"
-    // InternalDataDSL.g:20951:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0 : rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 ;
+    // InternalDataDSL.g:22037:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0 : rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20955:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 )
-            // InternalDataDSL.g:20956:2: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1
+            // InternalDataDSL.g:22041:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1 )
+            // InternalDataDSL.g:22042:2: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_0_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl();
 
             state._fsp--;
@@ -69010,25 +72631,25 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl"
-    // InternalDataDSL.g:20963:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl : ( ( 'finally' ) ) ;
+    // InternalDataDSL.g:22049:1: rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl : ( ( 'finally' ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20967:1: ( ( ( 'finally' ) ) )
-            // InternalDataDSL.g:20968:1: ( ( 'finally' ) )
+            // InternalDataDSL.g:22053:1: ( ( ( 'finally' ) ) )
+            // InternalDataDSL.g:22054:1: ( ( 'finally' ) )
             {
-            // InternalDataDSL.g:20968:1: ( ( 'finally' ) )
-            // InternalDataDSL.g:20969:2: ( 'finally' )
+            // InternalDataDSL.g:22054:1: ( ( 'finally' ) )
+            // InternalDataDSL.g:22055:2: ( 'finally' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0()); 
             }
-            // InternalDataDSL.g:20970:2: ( 'finally' )
-            // InternalDataDSL.g:20970:3: 'finally'
+            // InternalDataDSL.g:22056:2: ( 'finally' )
+            // InternalDataDSL.g:22056:3: 'finally'
             {
-            match(input,143,FOLLOW_2); if (state.failed) return ;
+            match(input,149,FOLLOW_2); if (state.failed) return ;
 
             }
 
@@ -69057,14 +72678,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1"
-    // InternalDataDSL.g:20978:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1 : rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl ;
+    // InternalDataDSL.g:22064:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1 : rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20982:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl )
-            // InternalDataDSL.g:20983:2: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
+            // InternalDataDSL.g:22068:1: ( rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl )
+            // InternalDataDSL.g:22069:2: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl();
@@ -69090,23 +72711,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl"
-    // InternalDataDSL.g:20989:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) ;
+    // InternalDataDSL.g:22075:1: rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:20993:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) )
-            // InternalDataDSL.g:20994:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            // InternalDataDSL.g:22079:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) ) )
+            // InternalDataDSL.g:22080:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
             {
-            // InternalDataDSL.g:20994:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
-            // InternalDataDSL.g:20995:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            // InternalDataDSL.g:22080:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 ) )
+            // InternalDataDSL.g:22081:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_0_1_1()); 
             }
-            // InternalDataDSL.g:20996:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
-            // InternalDataDSL.g:20996:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
+            // InternalDataDSL.g:22082:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 )
+            // InternalDataDSL.g:22082:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1();
@@ -69141,16 +72762,16 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0"
-    // InternalDataDSL.g:21005:1: rule__XTryCatchFinallyExpression__Group_3_1__0 : rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 ;
+    // InternalDataDSL.g:22091:1: rule__XTryCatchFinallyExpression__Group_3_1__0 : rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21009:1: ( rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 )
-            // InternalDataDSL.g:21010:2: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1
+            // InternalDataDSL.g:22095:1: ( rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1 )
+            // InternalDataDSL.g:22096:2: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl rule__XTryCatchFinallyExpression__Group_3_1__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XTryCatchFinallyExpression__Group_3_1__0__Impl();
 
             state._fsp--;
@@ -69179,22 +72800,22 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__0__Impl"
-    // InternalDataDSL.g:21017:1: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl : ( 'finally' ) ;
+    // InternalDataDSL.g:22103:1: rule__XTryCatchFinallyExpression__Group_3_1__0__Impl : ( 'finally' ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21021:1: ( ( 'finally' ) )
-            // InternalDataDSL.g:21022:1: ( 'finally' )
+            // InternalDataDSL.g:22107:1: ( ( 'finally' ) )
+            // InternalDataDSL.g:22108:1: ( 'finally' )
             {
-            // InternalDataDSL.g:21022:1: ( 'finally' )
-            // InternalDataDSL.g:21023:2: 'finally'
+            // InternalDataDSL.g:22108:1: ( 'finally' )
+            // InternalDataDSL.g:22109:2: 'finally'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); 
             }
-            match(input,143,FOLLOW_2); if (state.failed) return ;
+            match(input,149,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0()); 
             }
@@ -69220,14 +72841,14 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1"
-    // InternalDataDSL.g:21032:1: rule__XTryCatchFinallyExpression__Group_3_1__1 : rule__XTryCatchFinallyExpression__Group_3_1__1__Impl ;
+    // InternalDataDSL.g:22118:1: rule__XTryCatchFinallyExpression__Group_3_1__1 : rule__XTryCatchFinallyExpression__Group_3_1__1__Impl ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21036:1: ( rule__XTryCatchFinallyExpression__Group_3_1__1__Impl )
-            // InternalDataDSL.g:21037:2: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
+            // InternalDataDSL.g:22122:1: ( rule__XTryCatchFinallyExpression__Group_3_1__1__Impl )
+            // InternalDataDSL.g:22123:2: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__Group_3_1__1__Impl();
@@ -69253,23 +72874,23 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__Group_3_1__1__Impl"
-    // InternalDataDSL.g:21043:1: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) ;
+    // InternalDataDSL.g:22129:1: rule__XTryCatchFinallyExpression__Group_3_1__1__Impl : ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) ;
     public final void rule__XTryCatchFinallyExpression__Group_3_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21047:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) )
-            // InternalDataDSL.g:21048:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            // InternalDataDSL.g:22133:1: ( ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) ) )
+            // InternalDataDSL.g:22134:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
             {
-            // InternalDataDSL.g:21048:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
-            // InternalDataDSL.g:21049:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            // InternalDataDSL.g:22134:1: ( ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 ) )
+            // InternalDataDSL.g:22135:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionAssignment_3_1_1()); 
             }
-            // InternalDataDSL.g:21050:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
-            // InternalDataDSL.g:21050:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
+            // InternalDataDSL.g:22136:2: ( rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 )
+            // InternalDataDSL.g:22136:3: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1();
@@ -69304,16 +72925,16 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__0"
-    // InternalDataDSL.g:21059:1: rule__XSynchronizedExpression__Group__0 : rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 ;
+    // InternalDataDSL.g:22145:1: rule__XSynchronizedExpression__Group__0 : rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 ;
     public final void rule__XSynchronizedExpression__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21063:1: ( rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 )
-            // InternalDataDSL.g:21064:2: rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1
+            // InternalDataDSL.g:22149:1: ( rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1 )
+            // InternalDataDSL.g:22150:2: rule__XSynchronizedExpression__Group__0__Impl rule__XSynchronizedExpression__Group__1
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XSynchronizedExpression__Group__0__Impl();
 
             state._fsp--;
@@ -69342,23 +72963,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__0__Impl"
-    // InternalDataDSL.g:21071:1: rule__XSynchronizedExpression__Group__0__Impl : ( ( rule__XSynchronizedExpression__Group_0__0 ) ) ;
+    // InternalDataDSL.g:22157:1: rule__XSynchronizedExpression__Group__0__Impl : ( ( rule__XSynchronizedExpression__Group_0__0 ) ) ;
     public final void rule__XSynchronizedExpression__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21075:1: ( ( ( rule__XSynchronizedExpression__Group_0__0 ) ) )
-            // InternalDataDSL.g:21076:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            // InternalDataDSL.g:22161:1: ( ( ( rule__XSynchronizedExpression__Group_0__0 ) ) )
+            // InternalDataDSL.g:22162:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
             {
-            // InternalDataDSL.g:21076:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
-            // InternalDataDSL.g:21077:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            // InternalDataDSL.g:22162:1: ( ( rule__XSynchronizedExpression__Group_0__0 ) )
+            // InternalDataDSL.g:22163:2: ( rule__XSynchronizedExpression__Group_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:21078:2: ( rule__XSynchronizedExpression__Group_0__0 )
-            // InternalDataDSL.g:21078:3: rule__XSynchronizedExpression__Group_0__0
+            // InternalDataDSL.g:22164:2: ( rule__XSynchronizedExpression__Group_0__0 )
+            // InternalDataDSL.g:22164:3: rule__XSynchronizedExpression__Group_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0__0();
@@ -69393,16 +73014,16 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__1"
-    // InternalDataDSL.g:21086:1: rule__XSynchronizedExpression__Group__1 : rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 ;
+    // InternalDataDSL.g:22172:1: rule__XSynchronizedExpression__Group__1 : rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 ;
     public final void rule__XSynchronizedExpression__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21090:1: ( rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 )
-            // InternalDataDSL.g:21091:2: rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2
+            // InternalDataDSL.g:22176:1: ( rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2 )
+            // InternalDataDSL.g:22177:2: rule__XSynchronizedExpression__Group__1__Impl rule__XSynchronizedExpression__Group__2
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XSynchronizedExpression__Group__1__Impl();
 
             state._fsp--;
@@ -69431,23 +73052,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__1__Impl"
-    // InternalDataDSL.g:21098:1: rule__XSynchronizedExpression__Group__1__Impl : ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) ;
+    // InternalDataDSL.g:22184:1: rule__XSynchronizedExpression__Group__1__Impl : ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) ;
     public final void rule__XSynchronizedExpression__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21102:1: ( ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) )
-            // InternalDataDSL.g:21103:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            // InternalDataDSL.g:22188:1: ( ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) ) )
+            // InternalDataDSL.g:22189:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
             {
-            // InternalDataDSL.g:21103:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
-            // InternalDataDSL.g:21104:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            // InternalDataDSL.g:22189:1: ( ( rule__XSynchronizedExpression__ParamAssignment_1 ) )
+            // InternalDataDSL.g:22190:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getParamAssignment_1()); 
             }
-            // InternalDataDSL.g:21105:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
-            // InternalDataDSL.g:21105:3: rule__XSynchronizedExpression__ParamAssignment_1
+            // InternalDataDSL.g:22191:2: ( rule__XSynchronizedExpression__ParamAssignment_1 )
+            // InternalDataDSL.g:22191:3: rule__XSynchronizedExpression__ParamAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__ParamAssignment_1();
@@ -69482,16 +73103,16 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__2"
-    // InternalDataDSL.g:21113:1: rule__XSynchronizedExpression__Group__2 : rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 ;
+    // InternalDataDSL.g:22199:1: rule__XSynchronizedExpression__Group__2 : rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 ;
     public final void rule__XSynchronizedExpression__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21117:1: ( rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 )
-            // InternalDataDSL.g:21118:2: rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3
+            // InternalDataDSL.g:22203:1: ( rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3 )
+            // InternalDataDSL.g:22204:2: rule__XSynchronizedExpression__Group__2__Impl rule__XSynchronizedExpression__Group__3
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XSynchronizedExpression__Group__2__Impl();
 
             state._fsp--;
@@ -69520,22 +73141,22 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__2__Impl"
-    // InternalDataDSL.g:21125:1: rule__XSynchronizedExpression__Group__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:22211:1: rule__XSynchronizedExpression__Group__2__Impl : ( ')' ) ;
     public final void rule__XSynchronizedExpression__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21129:1: ( ( ')' ) )
-            // InternalDataDSL.g:21130:1: ( ')' )
+            // InternalDataDSL.g:22215:1: ( ( ')' ) )
+            // InternalDataDSL.g:22216:1: ( ')' )
             {
-            // InternalDataDSL.g:21130:1: ( ')' )
-            // InternalDataDSL.g:21131:2: ')'
+            // InternalDataDSL.g:22216:1: ( ')' )
+            // InternalDataDSL.g:22217:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2()); 
             }
@@ -69561,14 +73182,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__3"
-    // InternalDataDSL.g:21140:1: rule__XSynchronizedExpression__Group__3 : rule__XSynchronizedExpression__Group__3__Impl ;
+    // InternalDataDSL.g:22226:1: rule__XSynchronizedExpression__Group__3 : rule__XSynchronizedExpression__Group__3__Impl ;
     public final void rule__XSynchronizedExpression__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21144:1: ( rule__XSynchronizedExpression__Group__3__Impl )
-            // InternalDataDSL.g:21145:2: rule__XSynchronizedExpression__Group__3__Impl
+            // InternalDataDSL.g:22230:1: ( rule__XSynchronizedExpression__Group__3__Impl )
+            // InternalDataDSL.g:22231:2: rule__XSynchronizedExpression__Group__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group__3__Impl();
@@ -69594,23 +73215,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group__3__Impl"
-    // InternalDataDSL.g:21151:1: rule__XSynchronizedExpression__Group__3__Impl : ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) ;
+    // InternalDataDSL.g:22237:1: rule__XSynchronizedExpression__Group__3__Impl : ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) ;
     public final void rule__XSynchronizedExpression__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21155:1: ( ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) )
-            // InternalDataDSL.g:21156:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            // InternalDataDSL.g:22241:1: ( ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) ) )
+            // InternalDataDSL.g:22242:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
             {
-            // InternalDataDSL.g:21156:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
-            // InternalDataDSL.g:21157:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            // InternalDataDSL.g:22242:1: ( ( rule__XSynchronizedExpression__ExpressionAssignment_3 ) )
+            // InternalDataDSL.g:22243:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionAssignment_3()); 
             }
-            // InternalDataDSL.g:21158:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
-            // InternalDataDSL.g:21158:3: rule__XSynchronizedExpression__ExpressionAssignment_3
+            // InternalDataDSL.g:22244:2: ( rule__XSynchronizedExpression__ExpressionAssignment_3 )
+            // InternalDataDSL.g:22244:3: rule__XSynchronizedExpression__ExpressionAssignment_3
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__ExpressionAssignment_3();
@@ -69645,14 +73266,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0__0"
-    // InternalDataDSL.g:21167:1: rule__XSynchronizedExpression__Group_0__0 : rule__XSynchronizedExpression__Group_0__0__Impl ;
+    // InternalDataDSL.g:22253:1: rule__XSynchronizedExpression__Group_0__0 : rule__XSynchronizedExpression__Group_0__0__Impl ;
     public final void rule__XSynchronizedExpression__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21171:1: ( rule__XSynchronizedExpression__Group_0__0__Impl )
-            // InternalDataDSL.g:21172:2: rule__XSynchronizedExpression__Group_0__0__Impl
+            // InternalDataDSL.g:22257:1: ( rule__XSynchronizedExpression__Group_0__0__Impl )
+            // InternalDataDSL.g:22258:2: rule__XSynchronizedExpression__Group_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0__0__Impl();
@@ -69678,23 +73299,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0__0__Impl"
-    // InternalDataDSL.g:21178:1: rule__XSynchronizedExpression__Group_0__0__Impl : ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) ;
+    // InternalDataDSL.g:22264:1: rule__XSynchronizedExpression__Group_0__0__Impl : ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) ;
     public final void rule__XSynchronizedExpression__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21182:1: ( ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) )
-            // InternalDataDSL.g:21183:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            // InternalDataDSL.g:22268:1: ( ( ( rule__XSynchronizedExpression__Group_0_0__0 ) ) )
+            // InternalDataDSL.g:22269:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
             {
-            // InternalDataDSL.g:21183:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
-            // InternalDataDSL.g:21184:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            // InternalDataDSL.g:22269:1: ( ( rule__XSynchronizedExpression__Group_0_0__0 ) )
+            // InternalDataDSL.g:22270:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getGroup_0_0()); 
             }
-            // InternalDataDSL.g:21185:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
-            // InternalDataDSL.g:21185:3: rule__XSynchronizedExpression__Group_0_0__0
+            // InternalDataDSL.g:22271:2: ( rule__XSynchronizedExpression__Group_0_0__0 )
+            // InternalDataDSL.g:22271:3: rule__XSynchronizedExpression__Group_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0_0__0();
@@ -69729,16 +73350,16 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0"
-    // InternalDataDSL.g:21194:1: rule__XSynchronizedExpression__Group_0_0__0 : rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 ;
+    // InternalDataDSL.g:22280:1: rule__XSynchronizedExpression__Group_0_0__0 : rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 ;
     public final void rule__XSynchronizedExpression__Group_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21198:1: ( rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 )
-            // InternalDataDSL.g:21199:2: rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1
+            // InternalDataDSL.g:22284:1: ( rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1 )
+            // InternalDataDSL.g:22285:2: rule__XSynchronizedExpression__Group_0_0__0__Impl rule__XSynchronizedExpression__Group_0_0__1
             {
-            pushFollow(FOLLOW_158);
+            pushFollow(FOLLOW_166);
             rule__XSynchronizedExpression__Group_0_0__0__Impl();
 
             state._fsp--;
@@ -69767,23 +73388,23 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__0__Impl"
-    // InternalDataDSL.g:21206:1: rule__XSynchronizedExpression__Group_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:22292:1: rule__XSynchronizedExpression__Group_0_0__0__Impl : ( () ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21210:1: ( ( () ) )
-            // InternalDataDSL.g:21211:1: ( () )
+            // InternalDataDSL.g:22296:1: ( ( () ) )
+            // InternalDataDSL.g:22297:1: ( () )
             {
-            // InternalDataDSL.g:21211:1: ( () )
-            // InternalDataDSL.g:21212:2: ()
+            // InternalDataDSL.g:22297:1: ( () )
+            // InternalDataDSL.g:22298:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getXSynchronizedExpressionAction_0_0_0()); 
             }
-            // InternalDataDSL.g:21213:2: ()
-            // InternalDataDSL.g:21213:3: 
+            // InternalDataDSL.g:22299:2: ()
+            // InternalDataDSL.g:22299:3: 
             {
             }
 
@@ -69808,16 +73429,16 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1"
-    // InternalDataDSL.g:21221:1: rule__XSynchronizedExpression__Group_0_0__1 : rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 ;
+    // InternalDataDSL.g:22307:1: rule__XSynchronizedExpression__Group_0_0__1 : rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 ;
     public final void rule__XSynchronizedExpression__Group_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21225:1: ( rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 )
-            // InternalDataDSL.g:21226:2: rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2
+            // InternalDataDSL.g:22311:1: ( rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2 )
+            // InternalDataDSL.g:22312:2: rule__XSynchronizedExpression__Group_0_0__1__Impl rule__XSynchronizedExpression__Group_0_0__2
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XSynchronizedExpression__Group_0_0__1__Impl();
 
             state._fsp--;
@@ -69846,22 +73467,22 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__1__Impl"
-    // InternalDataDSL.g:21233:1: rule__XSynchronizedExpression__Group_0_0__1__Impl : ( 'synchronized' ) ;
+    // InternalDataDSL.g:22319:1: rule__XSynchronizedExpression__Group_0_0__1__Impl : ( 'synchronized' ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21237:1: ( ( 'synchronized' ) )
-            // InternalDataDSL.g:21238:1: ( 'synchronized' )
+            // InternalDataDSL.g:22323:1: ( ( 'synchronized' ) )
+            // InternalDataDSL.g:22324:1: ( 'synchronized' )
             {
-            // InternalDataDSL.g:21238:1: ( 'synchronized' )
-            // InternalDataDSL.g:21239:2: 'synchronized'
+            // InternalDataDSL.g:22324:1: ( 'synchronized' )
+            // InternalDataDSL.g:22325:2: 'synchronized'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); 
             }
-            match(input,144,FOLLOW_2); if (state.failed) return ;
+            match(input,150,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1()); 
             }
@@ -69887,14 +73508,14 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2"
-    // InternalDataDSL.g:21248:1: rule__XSynchronizedExpression__Group_0_0__2 : rule__XSynchronizedExpression__Group_0_0__2__Impl ;
+    // InternalDataDSL.g:22334:1: rule__XSynchronizedExpression__Group_0_0__2 : rule__XSynchronizedExpression__Group_0_0__2__Impl ;
     public final void rule__XSynchronizedExpression__Group_0_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21252:1: ( rule__XSynchronizedExpression__Group_0_0__2__Impl )
-            // InternalDataDSL.g:21253:2: rule__XSynchronizedExpression__Group_0_0__2__Impl
+            // InternalDataDSL.g:22338:1: ( rule__XSynchronizedExpression__Group_0_0__2__Impl )
+            // InternalDataDSL.g:22339:2: rule__XSynchronizedExpression__Group_0_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XSynchronizedExpression__Group_0_0__2__Impl();
@@ -69920,22 +73541,22 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__Group_0_0__2__Impl"
-    // InternalDataDSL.g:21259:1: rule__XSynchronizedExpression__Group_0_0__2__Impl : ( '(' ) ;
+    // InternalDataDSL.g:22345:1: rule__XSynchronizedExpression__Group_0_0__2__Impl : ( '(' ) ;
     public final void rule__XSynchronizedExpression__Group_0_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21263:1: ( ( '(' ) )
-            // InternalDataDSL.g:21264:1: ( '(' )
+            // InternalDataDSL.g:22349:1: ( ( '(' ) )
+            // InternalDataDSL.g:22350:1: ( '(' )
             {
-            // InternalDataDSL.g:21264:1: ( '(' )
-            // InternalDataDSL.g:21265:2: '('
+            // InternalDataDSL.g:22350:1: ( '(' )
+            // InternalDataDSL.g:22351:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2()); 
             }
@@ -69961,16 +73582,16 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__0"
-    // InternalDataDSL.g:21275:1: rule__XCatchClause__Group__0 : rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 ;
+    // InternalDataDSL.g:22361:1: rule__XCatchClause__Group__0 : rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 ;
     public final void rule__XCatchClause__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21279:1: ( rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 )
-            // InternalDataDSL.g:21280:2: rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1
+            // InternalDataDSL.g:22365:1: ( rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1 )
+            // InternalDataDSL.g:22366:2: rule__XCatchClause__Group__0__Impl rule__XCatchClause__Group__1
             {
-            pushFollow(FOLLOW_80);
+            pushFollow(FOLLOW_88);
             rule__XCatchClause__Group__0__Impl();
 
             state._fsp--;
@@ -69999,25 +73620,25 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__0__Impl"
-    // InternalDataDSL.g:21287:1: rule__XCatchClause__Group__0__Impl : ( ( 'catch' ) ) ;
+    // InternalDataDSL.g:22373:1: rule__XCatchClause__Group__0__Impl : ( ( 'catch' ) ) ;
     public final void rule__XCatchClause__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21291:1: ( ( ( 'catch' ) ) )
-            // InternalDataDSL.g:21292:1: ( ( 'catch' ) )
+            // InternalDataDSL.g:22377:1: ( ( ( 'catch' ) ) )
+            // InternalDataDSL.g:22378:1: ( ( 'catch' ) )
             {
-            // InternalDataDSL.g:21292:1: ( ( 'catch' ) )
-            // InternalDataDSL.g:21293:2: ( 'catch' )
+            // InternalDataDSL.g:22378:1: ( ( 'catch' ) )
+            // InternalDataDSL.g:22379:2: ( 'catch' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getCatchKeyword_0()); 
             }
-            // InternalDataDSL.g:21294:2: ( 'catch' )
-            // InternalDataDSL.g:21294:3: 'catch'
+            // InternalDataDSL.g:22380:2: ( 'catch' )
+            // InternalDataDSL.g:22380:3: 'catch'
             {
-            match(input,145,FOLLOW_2); if (state.failed) return ;
+            match(input,151,FOLLOW_2); if (state.failed) return ;
 
             }
 
@@ -70046,16 +73667,16 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__1"
-    // InternalDataDSL.g:21302:1: rule__XCatchClause__Group__1 : rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 ;
+    // InternalDataDSL.g:22388:1: rule__XCatchClause__Group__1 : rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 ;
     public final void rule__XCatchClause__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21306:1: ( rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 )
-            // InternalDataDSL.g:21307:2: rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2
+            // InternalDataDSL.g:22392:1: ( rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2 )
+            // InternalDataDSL.g:22393:2: rule__XCatchClause__Group__1__Impl rule__XCatchClause__Group__2
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XCatchClause__Group__1__Impl();
 
             state._fsp--;
@@ -70084,22 +73705,22 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__1__Impl"
-    // InternalDataDSL.g:21314:1: rule__XCatchClause__Group__1__Impl : ( '(' ) ;
+    // InternalDataDSL.g:22400:1: rule__XCatchClause__Group__1__Impl : ( '(' ) ;
     public final void rule__XCatchClause__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21318:1: ( ( '(' ) )
-            // InternalDataDSL.g:21319:1: ( '(' )
+            // InternalDataDSL.g:22404:1: ( ( '(' ) )
+            // InternalDataDSL.g:22405:1: ( '(' )
             {
-            // InternalDataDSL.g:21319:1: ( '(' )
-            // InternalDataDSL.g:21320:2: '('
+            // InternalDataDSL.g:22405:1: ( '(' )
+            // InternalDataDSL.g:22406:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1()); 
             }
@@ -70125,16 +73746,16 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__2"
-    // InternalDataDSL.g:21329:1: rule__XCatchClause__Group__2 : rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 ;
+    // InternalDataDSL.g:22415:1: rule__XCatchClause__Group__2 : rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 ;
     public final void rule__XCatchClause__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21333:1: ( rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 )
-            // InternalDataDSL.g:21334:2: rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3
+            // InternalDataDSL.g:22419:1: ( rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3 )
+            // InternalDataDSL.g:22420:2: rule__XCatchClause__Group__2__Impl rule__XCatchClause__Group__3
             {
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_136);
             rule__XCatchClause__Group__2__Impl();
 
             state._fsp--;
@@ -70163,23 +73784,23 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__2__Impl"
-    // InternalDataDSL.g:21341:1: rule__XCatchClause__Group__2__Impl : ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) ;
+    // InternalDataDSL.g:22427:1: rule__XCatchClause__Group__2__Impl : ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) ;
     public final void rule__XCatchClause__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21345:1: ( ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) )
-            // InternalDataDSL.g:21346:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            // InternalDataDSL.g:22431:1: ( ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) ) )
+            // InternalDataDSL.g:22432:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
             {
-            // InternalDataDSL.g:21346:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
-            // InternalDataDSL.g:21347:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            // InternalDataDSL.g:22432:1: ( ( rule__XCatchClause__DeclaredParamAssignment_2 ) )
+            // InternalDataDSL.g:22433:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getDeclaredParamAssignment_2()); 
             }
-            // InternalDataDSL.g:21348:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
-            // InternalDataDSL.g:21348:3: rule__XCatchClause__DeclaredParamAssignment_2
+            // InternalDataDSL.g:22434:2: ( rule__XCatchClause__DeclaredParamAssignment_2 )
+            // InternalDataDSL.g:22434:3: rule__XCatchClause__DeclaredParamAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__DeclaredParamAssignment_2();
@@ -70214,16 +73835,16 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__3"
-    // InternalDataDSL.g:21356:1: rule__XCatchClause__Group__3 : rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 ;
+    // InternalDataDSL.g:22442:1: rule__XCatchClause__Group__3 : rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 ;
     public final void rule__XCatchClause__Group__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21360:1: ( rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 )
-            // InternalDataDSL.g:21361:2: rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4
+            // InternalDataDSL.g:22446:1: ( rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4 )
+            // InternalDataDSL.g:22447:2: rule__XCatchClause__Group__3__Impl rule__XCatchClause__Group__4
             {
-            pushFollow(FOLLOW_84);
+            pushFollow(FOLLOW_92);
             rule__XCatchClause__Group__3__Impl();
 
             state._fsp--;
@@ -70252,22 +73873,22 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__3__Impl"
-    // InternalDataDSL.g:21368:1: rule__XCatchClause__Group__3__Impl : ( ')' ) ;
+    // InternalDataDSL.g:22454:1: rule__XCatchClause__Group__3__Impl : ( ')' ) ;
     public final void rule__XCatchClause__Group__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21372:1: ( ( ')' ) )
-            // InternalDataDSL.g:21373:1: ( ')' )
+            // InternalDataDSL.g:22458:1: ( ( ')' ) )
+            // InternalDataDSL.g:22459:1: ( ')' )
             {
-            // InternalDataDSL.g:21373:1: ( ')' )
-            // InternalDataDSL.g:21374:2: ')'
+            // InternalDataDSL.g:22459:1: ( ')' )
+            // InternalDataDSL.g:22460:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3()); 
             }
@@ -70293,14 +73914,14 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__4"
-    // InternalDataDSL.g:21383:1: rule__XCatchClause__Group__4 : rule__XCatchClause__Group__4__Impl ;
+    // InternalDataDSL.g:22469:1: rule__XCatchClause__Group__4 : rule__XCatchClause__Group__4__Impl ;
     public final void rule__XCatchClause__Group__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21387:1: ( rule__XCatchClause__Group__4__Impl )
-            // InternalDataDSL.g:21388:2: rule__XCatchClause__Group__4__Impl
+            // InternalDataDSL.g:22473:1: ( rule__XCatchClause__Group__4__Impl )
+            // InternalDataDSL.g:22474:2: rule__XCatchClause__Group__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__Group__4__Impl();
@@ -70326,23 +73947,23 @@
 
 
     // $ANTLR start "rule__XCatchClause__Group__4__Impl"
-    // InternalDataDSL.g:21394:1: rule__XCatchClause__Group__4__Impl : ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) ;
+    // InternalDataDSL.g:22480:1: rule__XCatchClause__Group__4__Impl : ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) ;
     public final void rule__XCatchClause__Group__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21398:1: ( ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) )
-            // InternalDataDSL.g:21399:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            // InternalDataDSL.g:22484:1: ( ( ( rule__XCatchClause__ExpressionAssignment_4 ) ) )
+            // InternalDataDSL.g:22485:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
             {
-            // InternalDataDSL.g:21399:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
-            // InternalDataDSL.g:21400:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            // InternalDataDSL.g:22485:1: ( ( rule__XCatchClause__ExpressionAssignment_4 ) )
+            // InternalDataDSL.g:22486:2: ( rule__XCatchClause__ExpressionAssignment_4 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getExpressionAssignment_4()); 
             }
-            // InternalDataDSL.g:21401:2: ( rule__XCatchClause__ExpressionAssignment_4 )
-            // InternalDataDSL.g:21401:3: rule__XCatchClause__ExpressionAssignment_4
+            // InternalDataDSL.g:22487:2: ( rule__XCatchClause__ExpressionAssignment_4 )
+            // InternalDataDSL.g:22487:3: rule__XCatchClause__ExpressionAssignment_4
             {
             pushFollow(FOLLOW_2);
             rule__XCatchClause__ExpressionAssignment_4();
@@ -70377,16 +73998,16 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__0"
-    // InternalDataDSL.g:21410:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
+    // InternalDataDSL.g:22496:1: rule__QualifiedName__Group__0 : rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 ;
     public final void rule__QualifiedName__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21414:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
-            // InternalDataDSL.g:21415:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
+            // InternalDataDSL.g:22500:1: ( rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1 )
+            // InternalDataDSL.g:22501:2: rule__QualifiedName__Group__0__Impl rule__QualifiedName__Group__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__QualifiedName__Group__0__Impl();
 
             state._fsp--;
@@ -70415,17 +74036,17 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__0__Impl"
-    // InternalDataDSL.g:21422:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
+    // InternalDataDSL.g:22508:1: rule__QualifiedName__Group__0__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedName__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21426:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:21427:1: ( ruleValidID )
+            // InternalDataDSL.g:22512:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:22513:1: ( ruleValidID )
             {
-            // InternalDataDSL.g:21427:1: ( ruleValidID )
-            // InternalDataDSL.g:21428:2: ruleValidID
+            // InternalDataDSL.g:22513:1: ( ruleValidID )
+            // InternalDataDSL.g:22514:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0()); 
@@ -70460,14 +74081,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__1"
-    // InternalDataDSL.g:21437:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
+    // InternalDataDSL.g:22523:1: rule__QualifiedName__Group__1 : rule__QualifiedName__Group__1__Impl ;
     public final void rule__QualifiedName__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21441:1: ( rule__QualifiedName__Group__1__Impl )
-            // InternalDataDSL.g:21442:2: rule__QualifiedName__Group__1__Impl
+            // InternalDataDSL.g:22527:1: ( rule__QualifiedName__Group__1__Impl )
+            // InternalDataDSL.g:22528:2: rule__QualifiedName__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group__1__Impl();
@@ -70493,35 +74114,35 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group__1__Impl"
-    // InternalDataDSL.g:21448:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
+    // InternalDataDSL.g:22534:1: rule__QualifiedName__Group__1__Impl : ( ( rule__QualifiedName__Group_1__0 )* ) ;
     public final void rule__QualifiedName__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21452:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
-            // InternalDataDSL.g:21453:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalDataDSL.g:22538:1: ( ( ( rule__QualifiedName__Group_1__0 )* ) )
+            // InternalDataDSL.g:22539:1: ( ( rule__QualifiedName__Group_1__0 )* )
             {
-            // InternalDataDSL.g:21453:1: ( ( rule__QualifiedName__Group_1__0 )* )
-            // InternalDataDSL.g:21454:2: ( rule__QualifiedName__Group_1__0 )*
+            // InternalDataDSL.g:22539:1: ( ( rule__QualifiedName__Group_1__0 )* )
+            // InternalDataDSL.g:22540:2: ( rule__QualifiedName__Group_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:21455:2: ( rule__QualifiedName__Group_1__0 )*
-            loop170:
+            // InternalDataDSL.g:22541:2: ( rule__QualifiedName__Group_1__0 )*
+            loop175:
             do {
-                int alt170=2;
-                int LA170_0 = input.LA(1);
+                int alt175=2;
+                int LA175_0 = input.LA(1);
 
-                if ( (LA170_0==43) ) {
-                    int LA170_2 = input.LA(2);
+                if ( (LA175_0==43) ) {
+                    int LA175_2 = input.LA(2);
 
-                    if ( (LA170_2==RULE_ID) ) {
-                        int LA170_3 = input.LA(3);
+                    if ( (LA175_2==RULE_ID) ) {
+                        int LA175_3 = input.LA(3);
 
-                        if ( (synpred230_InternalDataDSL()) ) {
-                            alt170=1;
+                        if ( (synpred241_InternalDataDSL()) ) {
+                            alt175=1;
                         }
 
 
@@ -70531,11 +74152,11 @@
                 }
 
 
-                switch (alt170) {
+                switch (alt175) {
             	case 1 :
-            	    // InternalDataDSL.g:21455:3: rule__QualifiedName__Group_1__0
+            	    // InternalDataDSL.g:22541:3: rule__QualifiedName__Group_1__0
             	    {
-            	    pushFollow(FOLLOW_73);
+            	    pushFollow(FOLLOW_81);
             	    rule__QualifiedName__Group_1__0();
 
             	    state._fsp--;
@@ -70545,7 +74166,7 @@
             	    break;
 
             	default :
-            	    break loop170;
+            	    break loop175;
                 }
             } while (true);
 
@@ -70574,14 +74195,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__0"
-    // InternalDataDSL.g:21464:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
+    // InternalDataDSL.g:22550:1: rule__QualifiedName__Group_1__0 : rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 ;
     public final void rule__QualifiedName__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21468:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
-            // InternalDataDSL.g:21469:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
+            // InternalDataDSL.g:22554:1: ( rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1 )
+            // InternalDataDSL.g:22555:2: rule__QualifiedName__Group_1__0__Impl rule__QualifiedName__Group_1__1
             {
             pushFollow(FOLLOW_7);
             rule__QualifiedName__Group_1__0__Impl();
@@ -70612,23 +74233,23 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__0__Impl"
-    // InternalDataDSL.g:21476:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
+    // InternalDataDSL.g:22562:1: rule__QualifiedName__Group_1__0__Impl : ( ( '.' ) ) ;
     public final void rule__QualifiedName__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21480:1: ( ( ( '.' ) ) )
-            // InternalDataDSL.g:21481:1: ( ( '.' ) )
+            // InternalDataDSL.g:22566:1: ( ( ( '.' ) ) )
+            // InternalDataDSL.g:22567:1: ( ( '.' ) )
             {
-            // InternalDataDSL.g:21481:1: ( ( '.' ) )
-            // InternalDataDSL.g:21482:2: ( '.' )
+            // InternalDataDSL.g:22567:1: ( ( '.' ) )
+            // InternalDataDSL.g:22568:2: ( '.' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getFullStopKeyword_1_0()); 
             }
-            // InternalDataDSL.g:21483:2: ( '.' )
-            // InternalDataDSL.g:21483:3: '.'
+            // InternalDataDSL.g:22569:2: ( '.' )
+            // InternalDataDSL.g:22569:3: '.'
             {
             match(input,43,FOLLOW_2); if (state.failed) return ;
 
@@ -70659,14 +74280,14 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__1"
-    // InternalDataDSL.g:21491:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
+    // InternalDataDSL.g:22577:1: rule__QualifiedName__Group_1__1 : rule__QualifiedName__Group_1__1__Impl ;
     public final void rule__QualifiedName__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21495:1: ( rule__QualifiedName__Group_1__1__Impl )
-            // InternalDataDSL.g:21496:2: rule__QualifiedName__Group_1__1__Impl
+            // InternalDataDSL.g:22581:1: ( rule__QualifiedName__Group_1__1__Impl )
+            // InternalDataDSL.g:22582:2: rule__QualifiedName__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedName__Group_1__1__Impl();
@@ -70692,17 +74313,17 @@
 
 
     // $ANTLR start "rule__QualifiedName__Group_1__1__Impl"
-    // InternalDataDSL.g:21502:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
+    // InternalDataDSL.g:22588:1: rule__QualifiedName__Group_1__1__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedName__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21506:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:21507:1: ( ruleValidID )
+            // InternalDataDSL.g:22592:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:22593:1: ( ruleValidID )
             {
-            // InternalDataDSL.g:21507:1: ( ruleValidID )
-            // InternalDataDSL.g:21508:2: ruleValidID
+            // InternalDataDSL.g:22593:1: ( ruleValidID )
+            // InternalDataDSL.g:22594:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1()); 
@@ -70737,16 +74358,16 @@
 
 
     // $ANTLR start "rule__Number__Group_1__0"
-    // InternalDataDSL.g:21518:1: rule__Number__Group_1__0 : rule__Number__Group_1__0__Impl rule__Number__Group_1__1 ;
+    // InternalDataDSL.g:22604:1: rule__Number__Group_1__0 : rule__Number__Group_1__0__Impl rule__Number__Group_1__1 ;
     public final void rule__Number__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21522:1: ( rule__Number__Group_1__0__Impl rule__Number__Group_1__1 )
-            // InternalDataDSL.g:21523:2: rule__Number__Group_1__0__Impl rule__Number__Group_1__1
+            // InternalDataDSL.g:22608:1: ( rule__Number__Group_1__0__Impl rule__Number__Group_1__1 )
+            // InternalDataDSL.g:22609:2: rule__Number__Group_1__0__Impl rule__Number__Group_1__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__Number__Group_1__0__Impl();
 
             state._fsp--;
@@ -70775,23 +74396,23 @@
 
 
     // $ANTLR start "rule__Number__Group_1__0__Impl"
-    // InternalDataDSL.g:21530:1: rule__Number__Group_1__0__Impl : ( ( rule__Number__Alternatives_1_0 ) ) ;
+    // InternalDataDSL.g:22616:1: rule__Number__Group_1__0__Impl : ( ( rule__Number__Alternatives_1_0 ) ) ;
     public final void rule__Number__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21534:1: ( ( ( rule__Number__Alternatives_1_0 ) ) )
-            // InternalDataDSL.g:21535:1: ( ( rule__Number__Alternatives_1_0 ) )
+            // InternalDataDSL.g:22620:1: ( ( ( rule__Number__Alternatives_1_0 ) ) )
+            // InternalDataDSL.g:22621:1: ( ( rule__Number__Alternatives_1_0 ) )
             {
-            // InternalDataDSL.g:21535:1: ( ( rule__Number__Alternatives_1_0 ) )
-            // InternalDataDSL.g:21536:2: ( rule__Number__Alternatives_1_0 )
+            // InternalDataDSL.g:22621:1: ( ( rule__Number__Alternatives_1_0 ) )
+            // InternalDataDSL.g:22622:2: ( rule__Number__Alternatives_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives_1_0()); 
             }
-            // InternalDataDSL.g:21537:2: ( rule__Number__Alternatives_1_0 )
-            // InternalDataDSL.g:21537:3: rule__Number__Alternatives_1_0
+            // InternalDataDSL.g:22623:2: ( rule__Number__Alternatives_1_0 )
+            // InternalDataDSL.g:22623:3: rule__Number__Alternatives_1_0
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives_1_0();
@@ -70826,14 +74447,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1__1"
-    // InternalDataDSL.g:21545:1: rule__Number__Group_1__1 : rule__Number__Group_1__1__Impl ;
+    // InternalDataDSL.g:22631:1: rule__Number__Group_1__1 : rule__Number__Group_1__1__Impl ;
     public final void rule__Number__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21549:1: ( rule__Number__Group_1__1__Impl )
-            // InternalDataDSL.g:21550:2: rule__Number__Group_1__1__Impl
+            // InternalDataDSL.g:22635:1: ( rule__Number__Group_1__1__Impl )
+            // InternalDataDSL.g:22636:2: rule__Number__Group_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Number__Group_1__1__Impl();
@@ -70859,35 +74480,35 @@
 
 
     // $ANTLR start "rule__Number__Group_1__1__Impl"
-    // InternalDataDSL.g:21556:1: rule__Number__Group_1__1__Impl : ( ( rule__Number__Group_1_1__0 )? ) ;
+    // InternalDataDSL.g:22642:1: rule__Number__Group_1__1__Impl : ( ( rule__Number__Group_1_1__0 )? ) ;
     public final void rule__Number__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21560:1: ( ( ( rule__Number__Group_1_1__0 )? ) )
-            // InternalDataDSL.g:21561:1: ( ( rule__Number__Group_1_1__0 )? )
+            // InternalDataDSL.g:22646:1: ( ( ( rule__Number__Group_1_1__0 )? ) )
+            // InternalDataDSL.g:22647:1: ( ( rule__Number__Group_1_1__0 )? )
             {
-            // InternalDataDSL.g:21561:1: ( ( rule__Number__Group_1_1__0 )? )
-            // InternalDataDSL.g:21562:2: ( rule__Number__Group_1_1__0 )?
+            // InternalDataDSL.g:22647:1: ( ( rule__Number__Group_1_1__0 )? )
+            // InternalDataDSL.g:22648:2: ( rule__Number__Group_1_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getGroup_1_1()); 
             }
-            // InternalDataDSL.g:21563:2: ( rule__Number__Group_1_1__0 )?
-            int alt171=2;
-            int LA171_0 = input.LA(1);
+            // InternalDataDSL.g:22649:2: ( rule__Number__Group_1_1__0 )?
+            int alt176=2;
+            int LA176_0 = input.LA(1);
 
-            if ( (LA171_0==43) ) {
-                int LA171_1 = input.LA(2);
+            if ( (LA176_0==43) ) {
+                int LA176_1 = input.LA(2);
 
-                if ( ((LA171_1>=RULE_INT && LA171_1<=RULE_DECIMAL)) ) {
-                    alt171=1;
+                if ( ((LA176_1>=RULE_INT && LA176_1<=RULE_DECIMAL)) ) {
+                    alt176=1;
                 }
             }
-            switch (alt171) {
+            switch (alt176) {
                 case 1 :
-                    // InternalDataDSL.g:21563:3: rule__Number__Group_1_1__0
+                    // InternalDataDSL.g:22649:3: rule__Number__Group_1_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__Number__Group_1_1__0();
@@ -70925,16 +74546,16 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__0"
-    // InternalDataDSL.g:21572:1: rule__Number__Group_1_1__0 : rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 ;
+    // InternalDataDSL.g:22658:1: rule__Number__Group_1_1__0 : rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 ;
     public final void rule__Number__Group_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21576:1: ( rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 )
-            // InternalDataDSL.g:21577:2: rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1
+            // InternalDataDSL.g:22662:1: ( rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1 )
+            // InternalDataDSL.g:22663:2: rule__Number__Group_1_1__0__Impl rule__Number__Group_1_1__1
             {
-            pushFollow(FOLLOW_159);
+            pushFollow(FOLLOW_167);
             rule__Number__Group_1_1__0__Impl();
 
             state._fsp--;
@@ -70963,17 +74584,17 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__0__Impl"
-    // InternalDataDSL.g:21584:1: rule__Number__Group_1_1__0__Impl : ( '.' ) ;
+    // InternalDataDSL.g:22670:1: rule__Number__Group_1_1__0__Impl : ( '.' ) ;
     public final void rule__Number__Group_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21588:1: ( ( '.' ) )
-            // InternalDataDSL.g:21589:1: ( '.' )
+            // InternalDataDSL.g:22674:1: ( ( '.' ) )
+            // InternalDataDSL.g:22675:1: ( '.' )
             {
-            // InternalDataDSL.g:21589:1: ( '.' )
-            // InternalDataDSL.g:21590:2: '.'
+            // InternalDataDSL.g:22675:1: ( '.' )
+            // InternalDataDSL.g:22676:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0()); 
@@ -71004,14 +74625,14 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__1"
-    // InternalDataDSL.g:21599:1: rule__Number__Group_1_1__1 : rule__Number__Group_1_1__1__Impl ;
+    // InternalDataDSL.g:22685:1: rule__Number__Group_1_1__1 : rule__Number__Group_1_1__1__Impl ;
     public final void rule__Number__Group_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21603:1: ( rule__Number__Group_1_1__1__Impl )
-            // InternalDataDSL.g:21604:2: rule__Number__Group_1_1__1__Impl
+            // InternalDataDSL.g:22689:1: ( rule__Number__Group_1_1__1__Impl )
+            // InternalDataDSL.g:22690:2: rule__Number__Group_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__Number__Group_1_1__1__Impl();
@@ -71037,23 +74658,23 @@
 
 
     // $ANTLR start "rule__Number__Group_1_1__1__Impl"
-    // InternalDataDSL.g:21610:1: rule__Number__Group_1_1__1__Impl : ( ( rule__Number__Alternatives_1_1_1 ) ) ;
+    // InternalDataDSL.g:22696:1: rule__Number__Group_1_1__1__Impl : ( ( rule__Number__Alternatives_1_1_1 ) ) ;
     public final void rule__Number__Group_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21614:1: ( ( ( rule__Number__Alternatives_1_1_1 ) ) )
-            // InternalDataDSL.g:21615:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            // InternalDataDSL.g:22700:1: ( ( ( rule__Number__Alternatives_1_1_1 ) ) )
+            // InternalDataDSL.g:22701:1: ( ( rule__Number__Alternatives_1_1_1 ) )
             {
-            // InternalDataDSL.g:21615:1: ( ( rule__Number__Alternatives_1_1_1 ) )
-            // InternalDataDSL.g:21616:2: ( rule__Number__Alternatives_1_1_1 )
+            // InternalDataDSL.g:22701:1: ( ( rule__Number__Alternatives_1_1_1 ) )
+            // InternalDataDSL.g:22702:2: ( rule__Number__Alternatives_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getNumberAccess().getAlternatives_1_1_1()); 
             }
-            // InternalDataDSL.g:21617:2: ( rule__Number__Alternatives_1_1_1 )
-            // InternalDataDSL.g:21617:3: rule__Number__Alternatives_1_1_1
+            // InternalDataDSL.g:22703:2: ( rule__Number__Alternatives_1_1_1 )
+            // InternalDataDSL.g:22703:3: rule__Number__Alternatives_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__Number__Alternatives_1_1_1();
@@ -71088,16 +74709,16 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__0"
-    // InternalDataDSL.g:21626:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
+    // InternalDataDSL.g:22712:1: rule__JvmTypeReference__Group_0__0 : rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 ;
     public final void rule__JvmTypeReference__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21630:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
-            // InternalDataDSL.g:21631:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
+            // InternalDataDSL.g:22716:1: ( rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1 )
+            // InternalDataDSL.g:22717:2: rule__JvmTypeReference__Group_0__0__Impl rule__JvmTypeReference__Group_0__1
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__JvmTypeReference__Group_0__0__Impl();
 
             state._fsp--;
@@ -71126,17 +74747,17 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__0__Impl"
-    // InternalDataDSL.g:21638:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
+    // InternalDataDSL.g:22724:1: rule__JvmTypeReference__Group_0__0__Impl : ( ruleJvmParameterizedTypeReference ) ;
     public final void rule__JvmTypeReference__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21642:1: ( ( ruleJvmParameterizedTypeReference ) )
-            // InternalDataDSL.g:21643:1: ( ruleJvmParameterizedTypeReference )
+            // InternalDataDSL.g:22728:1: ( ( ruleJvmParameterizedTypeReference ) )
+            // InternalDataDSL.g:22729:1: ( ruleJvmParameterizedTypeReference )
             {
-            // InternalDataDSL.g:21643:1: ( ruleJvmParameterizedTypeReference )
-            // InternalDataDSL.g:21644:2: ruleJvmParameterizedTypeReference
+            // InternalDataDSL.g:22729:1: ( ruleJvmParameterizedTypeReference )
+            // InternalDataDSL.g:22730:2: ruleJvmParameterizedTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0()); 
@@ -71171,14 +74792,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__1"
-    // InternalDataDSL.g:21653:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
+    // InternalDataDSL.g:22739:1: rule__JvmTypeReference__Group_0__1 : rule__JvmTypeReference__Group_0__1__Impl ;
     public final void rule__JvmTypeReference__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21657:1: ( rule__JvmTypeReference__Group_0__1__Impl )
-            // InternalDataDSL.g:21658:2: rule__JvmTypeReference__Group_0__1__Impl
+            // InternalDataDSL.g:22743:1: ( rule__JvmTypeReference__Group_0__1__Impl )
+            // InternalDataDSL.g:22744:2: rule__JvmTypeReference__Group_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0__1__Impl();
@@ -71204,35 +74825,35 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0__1__Impl"
-    // InternalDataDSL.g:21664:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
+    // InternalDataDSL.g:22750:1: rule__JvmTypeReference__Group_0__1__Impl : ( ( rule__JvmTypeReference__Group_0_1__0 )* ) ;
     public final void rule__JvmTypeReference__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21668:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
-            // InternalDataDSL.g:21669:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalDataDSL.g:22754:1: ( ( ( rule__JvmTypeReference__Group_0_1__0 )* ) )
+            // InternalDataDSL.g:22755:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
             {
-            // InternalDataDSL.g:21669:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
-            // InternalDataDSL.g:21670:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            // InternalDataDSL.g:22755:1: ( ( rule__JvmTypeReference__Group_0_1__0 )* )
+            // InternalDataDSL.g:22756:2: ( rule__JvmTypeReference__Group_0_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1()); 
             }
-            // InternalDataDSL.g:21671:2: ( rule__JvmTypeReference__Group_0_1__0 )*
-            loop172:
+            // InternalDataDSL.g:22757:2: ( rule__JvmTypeReference__Group_0_1__0 )*
+            loop177:
             do {
-                int alt172=2;
-                int LA172_0 = input.LA(1);
+                int alt177=2;
+                int LA177_0 = input.LA(1);
 
-                if ( (LA172_0==127) ) {
-                    int LA172_2 = input.LA(2);
+                if ( (LA177_0==133) ) {
+                    int LA177_2 = input.LA(2);
 
-                    if ( (LA172_2==125) ) {
-                        int LA172_3 = input.LA(3);
+                    if ( (LA177_2==131) ) {
+                        int LA177_3 = input.LA(3);
 
-                        if ( (synpred232_InternalDataDSL()) ) {
-                            alt172=1;
+                        if ( (synpred243_InternalDataDSL()) ) {
+                            alt177=1;
                         }
 
 
@@ -71242,11 +74863,11 @@
                 }
 
 
-                switch (alt172) {
+                switch (alt177) {
             	case 1 :
-            	    // InternalDataDSL.g:21671:3: rule__JvmTypeReference__Group_0_1__0
+            	    // InternalDataDSL.g:22757:3: rule__JvmTypeReference__Group_0_1__0
             	    {
-            	    pushFollow(FOLLOW_151);
+            	    pushFollow(FOLLOW_159);
             	    rule__JvmTypeReference__Group_0_1__0();
 
             	    state._fsp--;
@@ -71256,7 +74877,7 @@
             	    break;
 
             	default :
-            	    break loop172;
+            	    break loop177;
                 }
             } while (true);
 
@@ -71285,14 +74906,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1__0"
-    // InternalDataDSL.g:21680:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
+    // InternalDataDSL.g:22766:1: rule__JvmTypeReference__Group_0_1__0 : rule__JvmTypeReference__Group_0_1__0__Impl ;
     public final void rule__JvmTypeReference__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21684:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
-            // InternalDataDSL.g:21685:2: rule__JvmTypeReference__Group_0_1__0__Impl
+            // InternalDataDSL.g:22770:1: ( rule__JvmTypeReference__Group_0_1__0__Impl )
+            // InternalDataDSL.g:22771:2: rule__JvmTypeReference__Group_0_1__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1__0__Impl();
@@ -71318,23 +74939,23 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1__0__Impl"
-    // InternalDataDSL.g:21691:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
+    // InternalDataDSL.g:22777:1: rule__JvmTypeReference__Group_0_1__0__Impl : ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) ;
     public final void rule__JvmTypeReference__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21695:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
-            // InternalDataDSL.g:21696:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalDataDSL.g:22781:1: ( ( ( rule__JvmTypeReference__Group_0_1_0__0 ) ) )
+            // InternalDataDSL.g:22782:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
             {
-            // InternalDataDSL.g:21696:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
-            // InternalDataDSL.g:21697:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalDataDSL.g:22782:1: ( ( rule__JvmTypeReference__Group_0_1_0__0 ) )
+            // InternalDataDSL.g:22783:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getGroup_0_1_0()); 
             }
-            // InternalDataDSL.g:21698:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
-            // InternalDataDSL.g:21698:3: rule__JvmTypeReference__Group_0_1_0__0
+            // InternalDataDSL.g:22784:2: ( rule__JvmTypeReference__Group_0_1_0__0 )
+            // InternalDataDSL.g:22784:3: rule__JvmTypeReference__Group_0_1_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1_0__0();
@@ -71369,16 +74990,16 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0"
-    // InternalDataDSL.g:21707:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
+    // InternalDataDSL.g:22793:1: rule__JvmTypeReference__Group_0_1_0__0 : rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 ;
     public final void rule__JvmTypeReference__Group_0_1_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21711:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
-            // InternalDataDSL.g:21712:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
+            // InternalDataDSL.g:22797:1: ( rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1 )
+            // InternalDataDSL.g:22798:2: rule__JvmTypeReference__Group_0_1_0__0__Impl rule__JvmTypeReference__Group_0_1_0__1
             {
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_96);
             rule__JvmTypeReference__Group_0_1_0__0__Impl();
 
             state._fsp--;
@@ -71407,23 +75028,23 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__0__Impl"
-    // InternalDataDSL.g:21719:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:22805:1: rule__JvmTypeReference__Group_0_1_0__0__Impl : ( () ) ;
     public final void rule__JvmTypeReference__Group_0_1_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21723:1: ( ( () ) )
-            // InternalDataDSL.g:21724:1: ( () )
+            // InternalDataDSL.g:22809:1: ( ( () ) )
+            // InternalDataDSL.g:22810:1: ( () )
             {
-            // InternalDataDSL.g:21724:1: ( () )
-            // InternalDataDSL.g:21725:2: ()
+            // InternalDataDSL.g:22810:1: ( () )
+            // InternalDataDSL.g:22811:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getJvmGenericArrayTypeReferenceComponentTypeAction_0_1_0_0()); 
             }
-            // InternalDataDSL.g:21726:2: ()
-            // InternalDataDSL.g:21726:3: 
+            // InternalDataDSL.g:22812:2: ()
+            // InternalDataDSL.g:22812:3: 
             {
             }
 
@@ -71448,14 +75069,14 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1"
-    // InternalDataDSL.g:21734:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
+    // InternalDataDSL.g:22820:1: rule__JvmTypeReference__Group_0_1_0__1 : rule__JvmTypeReference__Group_0_1_0__1__Impl ;
     public final void rule__JvmTypeReference__Group_0_1_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21738:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
-            // InternalDataDSL.g:21739:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
+            // InternalDataDSL.g:22824:1: ( rule__JvmTypeReference__Group_0_1_0__1__Impl )
+            // InternalDataDSL.g:22825:2: rule__JvmTypeReference__Group_0_1_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmTypeReference__Group_0_1_0__1__Impl();
@@ -71481,17 +75102,17 @@
 
 
     // $ANTLR start "rule__JvmTypeReference__Group_0_1_0__1__Impl"
-    // InternalDataDSL.g:21745:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
+    // InternalDataDSL.g:22831:1: rule__JvmTypeReference__Group_0_1_0__1__Impl : ( ruleArrayBrackets ) ;
     public final void rule__JvmTypeReference__Group_0_1_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21749:1: ( ( ruleArrayBrackets ) )
-            // InternalDataDSL.g:21750:1: ( ruleArrayBrackets )
+            // InternalDataDSL.g:22835:1: ( ( ruleArrayBrackets ) )
+            // InternalDataDSL.g:22836:1: ( ruleArrayBrackets )
             {
-            // InternalDataDSL.g:21750:1: ( ruleArrayBrackets )
-            // InternalDataDSL.g:21751:2: ruleArrayBrackets
+            // InternalDataDSL.g:22836:1: ( ruleArrayBrackets )
+            // InternalDataDSL.g:22837:2: ruleArrayBrackets
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1()); 
@@ -71526,16 +75147,16 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__0"
-    // InternalDataDSL.g:21761:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
+    // InternalDataDSL.g:22847:1: rule__ArrayBrackets__Group__0 : rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 ;
     public final void rule__ArrayBrackets__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21765:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
-            // InternalDataDSL.g:21766:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
+            // InternalDataDSL.g:22851:1: ( rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1 )
+            // InternalDataDSL.g:22852:2: rule__ArrayBrackets__Group__0__Impl rule__ArrayBrackets__Group__1
             {
-            pushFollow(FOLLOW_125);
+            pushFollow(FOLLOW_133);
             rule__ArrayBrackets__Group__0__Impl();
 
             state._fsp--;
@@ -71564,22 +75185,22 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__0__Impl"
-    // InternalDataDSL.g:21773:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
+    // InternalDataDSL.g:22859:1: rule__ArrayBrackets__Group__0__Impl : ( '[' ) ;
     public final void rule__ArrayBrackets__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21777:1: ( ( '[' ) )
-            // InternalDataDSL.g:21778:1: ( '[' )
+            // InternalDataDSL.g:22863:1: ( ( '[' ) )
+            // InternalDataDSL.g:22864:1: ( '[' )
             {
-            // InternalDataDSL.g:21778:1: ( '[' )
-            // InternalDataDSL.g:21779:2: '['
+            // InternalDataDSL.g:22864:1: ( '[' )
+            // InternalDataDSL.g:22865:2: '['
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
             }
-            match(input,127,FOLLOW_2); if (state.failed) return ;
+            match(input,133,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0()); 
             }
@@ -71605,14 +75226,14 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__1"
-    // InternalDataDSL.g:21788:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
+    // InternalDataDSL.g:22874:1: rule__ArrayBrackets__Group__1 : rule__ArrayBrackets__Group__1__Impl ;
     public final void rule__ArrayBrackets__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21792:1: ( rule__ArrayBrackets__Group__1__Impl )
-            // InternalDataDSL.g:21793:2: rule__ArrayBrackets__Group__1__Impl
+            // InternalDataDSL.g:22878:1: ( rule__ArrayBrackets__Group__1__Impl )
+            // InternalDataDSL.g:22879:2: rule__ArrayBrackets__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__ArrayBrackets__Group__1__Impl();
@@ -71638,22 +75259,22 @@
 
 
     // $ANTLR start "rule__ArrayBrackets__Group__1__Impl"
-    // InternalDataDSL.g:21799:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
+    // InternalDataDSL.g:22885:1: rule__ArrayBrackets__Group__1__Impl : ( ']' ) ;
     public final void rule__ArrayBrackets__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21803:1: ( ( ']' ) )
-            // InternalDataDSL.g:21804:1: ( ']' )
+            // InternalDataDSL.g:22889:1: ( ( ']' ) )
+            // InternalDataDSL.g:22890:1: ( ']' )
             {
-            // InternalDataDSL.g:21804:1: ( ']' )
-            // InternalDataDSL.g:21805:2: ']'
+            // InternalDataDSL.g:22890:1: ( ']' )
+            // InternalDataDSL.g:22891:2: ']'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
             }
-            match(input,125,FOLLOW_2); if (state.failed) return ;
+            match(input,131,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getArrayBracketsAccess().getRightSquareBracketKeyword_1()); 
             }
@@ -71679,16 +75300,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__0"
-    // InternalDataDSL.g:21815:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
+    // InternalDataDSL.g:22901:1: rule__XFunctionTypeRef__Group__0 : rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 ;
     public final void rule__XFunctionTypeRef__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21819:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
-            // InternalDataDSL.g:21820:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
+            // InternalDataDSL.g:22905:1: ( rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1 )
+            // InternalDataDSL.g:22906:2: rule__XFunctionTypeRef__Group__0__Impl rule__XFunctionTypeRef__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XFunctionTypeRef__Group__0__Impl();
 
             state._fsp--;
@@ -71717,31 +75338,31 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__0__Impl"
-    // InternalDataDSL.g:21827:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
+    // InternalDataDSL.g:22913:1: rule__XFunctionTypeRef__Group__0__Impl : ( ( rule__XFunctionTypeRef__Group_0__0 )? ) ;
     public final void rule__XFunctionTypeRef__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21831:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
-            // InternalDataDSL.g:21832:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalDataDSL.g:22917:1: ( ( ( rule__XFunctionTypeRef__Group_0__0 )? ) )
+            // InternalDataDSL.g:22918:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
             {
-            // InternalDataDSL.g:21832:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
-            // InternalDataDSL.g:21833:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            // InternalDataDSL.g:22918:1: ( ( rule__XFunctionTypeRef__Group_0__0 )? )
+            // InternalDataDSL.g:22919:2: ( rule__XFunctionTypeRef__Group_0__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0()); 
             }
-            // InternalDataDSL.g:21834:2: ( rule__XFunctionTypeRef__Group_0__0 )?
-            int alt173=2;
-            int LA173_0 = input.LA(1);
+            // InternalDataDSL.g:22920:2: ( rule__XFunctionTypeRef__Group_0__0 )?
+            int alt178=2;
+            int LA178_0 = input.LA(1);
 
-            if ( (LA173_0==122) ) {
-                alt173=1;
+            if ( (LA178_0==128) ) {
+                alt178=1;
             }
-            switch (alt173) {
+            switch (alt178) {
                 case 1 :
-                    // InternalDataDSL.g:21834:3: rule__XFunctionTypeRef__Group_0__0
+                    // InternalDataDSL.g:22920:3: rule__XFunctionTypeRef__Group_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFunctionTypeRef__Group_0__0();
@@ -71779,16 +75400,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__1"
-    // InternalDataDSL.g:21842:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
+    // InternalDataDSL.g:22928:1: rule__XFunctionTypeRef__Group__1 : rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 ;
     public final void rule__XFunctionTypeRef__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21846:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
-            // InternalDataDSL.g:21847:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
+            // InternalDataDSL.g:22932:1: ( rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2 )
+            // InternalDataDSL.g:22933:2: rule__XFunctionTypeRef__Group__1__Impl rule__XFunctionTypeRef__Group__2
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XFunctionTypeRef__Group__1__Impl();
 
             state._fsp--;
@@ -71817,17 +75438,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__1__Impl"
-    // InternalDataDSL.g:21854:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
+    // InternalDataDSL.g:22940:1: rule__XFunctionTypeRef__Group__1__Impl : ( '=>' ) ;
     public final void rule__XFunctionTypeRef__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21858:1: ( ( '=>' ) )
-            // InternalDataDSL.g:21859:1: ( '=>' )
+            // InternalDataDSL.g:22944:1: ( ( '=>' ) )
+            // InternalDataDSL.g:22945:1: ( '=>' )
             {
-            // InternalDataDSL.g:21859:1: ( '=>' )
-            // InternalDataDSL.g:21860:2: '=>'
+            // InternalDataDSL.g:22945:1: ( '=>' )
+            // InternalDataDSL.g:22946:2: '=>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1()); 
@@ -71858,14 +75479,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__2"
-    // InternalDataDSL.g:21869:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
+    // InternalDataDSL.g:22955:1: rule__XFunctionTypeRef__Group__2 : rule__XFunctionTypeRef__Group__2__Impl ;
     public final void rule__XFunctionTypeRef__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21873:1: ( rule__XFunctionTypeRef__Group__2__Impl )
-            // InternalDataDSL.g:21874:2: rule__XFunctionTypeRef__Group__2__Impl
+            // InternalDataDSL.g:22959:1: ( rule__XFunctionTypeRef__Group__2__Impl )
+            // InternalDataDSL.g:22960:2: rule__XFunctionTypeRef__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group__2__Impl();
@@ -71891,23 +75512,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group__2__Impl"
-    // InternalDataDSL.g:21880:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
+    // InternalDataDSL.g:22966:1: rule__XFunctionTypeRef__Group__2__Impl : ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) ;
     public final void rule__XFunctionTypeRef__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21884:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
-            // InternalDataDSL.g:21885:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalDataDSL.g:22970:1: ( ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) ) )
+            // InternalDataDSL.g:22971:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
             {
-            // InternalDataDSL.g:21885:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
-            // InternalDataDSL.g:21886:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalDataDSL.g:22971:1: ( ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 ) )
+            // InternalDataDSL.g:22972:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeAssignment_2()); 
             }
-            // InternalDataDSL.g:21887:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
-            // InternalDataDSL.g:21887:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
+            // InternalDataDSL.g:22973:2: ( rule__XFunctionTypeRef__ReturnTypeAssignment_2 )
+            // InternalDataDSL.g:22973:3: rule__XFunctionTypeRef__ReturnTypeAssignment_2
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ReturnTypeAssignment_2();
@@ -71942,16 +75563,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__0"
-    // InternalDataDSL.g:21896:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
+    // InternalDataDSL.g:22982:1: rule__XFunctionTypeRef__Group_0__0 : rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 ;
     public final void rule__XFunctionTypeRef__Group_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21900:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
-            // InternalDataDSL.g:21901:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
+            // InternalDataDSL.g:22986:1: ( rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1 )
+            // InternalDataDSL.g:22987:2: rule__XFunctionTypeRef__Group_0__0__Impl rule__XFunctionTypeRef__Group_0__1
             {
-            pushFollow(FOLLOW_160);
+            pushFollow(FOLLOW_168);
             rule__XFunctionTypeRef__Group_0__0__Impl();
 
             state._fsp--;
@@ -71980,22 +75601,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__0__Impl"
-    // InternalDataDSL.g:21908:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
+    // InternalDataDSL.g:22994:1: rule__XFunctionTypeRef__Group_0__0__Impl : ( '(' ) ;
     public final void rule__XFunctionTypeRef__Group_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21912:1: ( ( '(' ) )
-            // InternalDataDSL.g:21913:1: ( '(' )
+            // InternalDataDSL.g:22998:1: ( ( '(' ) )
+            // InternalDataDSL.g:22999:1: ( '(' )
             {
-            // InternalDataDSL.g:21913:1: ( '(' )
-            // InternalDataDSL.g:21914:2: '('
+            // InternalDataDSL.g:22999:1: ( '(' )
+            // InternalDataDSL.g:23000:2: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0()); 
             }
@@ -72021,16 +75642,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__1"
-    // InternalDataDSL.g:21923:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
+    // InternalDataDSL.g:23009:1: rule__XFunctionTypeRef__Group_0__1 : rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 ;
     public final void rule__XFunctionTypeRef__Group_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21927:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
-            // InternalDataDSL.g:21928:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
+            // InternalDataDSL.g:23013:1: ( rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2 )
+            // InternalDataDSL.g:23014:2: rule__XFunctionTypeRef__Group_0__1__Impl rule__XFunctionTypeRef__Group_0__2
             {
-            pushFollow(FOLLOW_160);
+            pushFollow(FOLLOW_168);
             rule__XFunctionTypeRef__Group_0__1__Impl();
 
             state._fsp--;
@@ -72059,31 +75680,31 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__1__Impl"
-    // InternalDataDSL.g:21935:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
+    // InternalDataDSL.g:23021:1: rule__XFunctionTypeRef__Group_0__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) ;
     public final void rule__XFunctionTypeRef__Group_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21939:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
-            // InternalDataDSL.g:21940:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalDataDSL.g:23025:1: ( ( ( rule__XFunctionTypeRef__Group_0_1__0 )? ) )
+            // InternalDataDSL.g:23026:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
             {
-            // InternalDataDSL.g:21940:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
-            // InternalDataDSL.g:21941:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            // InternalDataDSL.g:23026:1: ( ( rule__XFunctionTypeRef__Group_0_1__0 )? )
+            // InternalDataDSL.g:23027:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1()); 
             }
-            // InternalDataDSL.g:21942:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
-            int alt174=2;
-            int LA174_0 = input.LA(1);
+            // InternalDataDSL.g:23028:2: ( rule__XFunctionTypeRef__Group_0_1__0 )?
+            int alt179=2;
+            int LA179_0 = input.LA(1);
 
-            if ( (LA174_0==RULE_ID||LA174_0==31||LA174_0==122) ) {
-                alt174=1;
+            if ( (LA179_0==RULE_ID||LA179_0==31||LA179_0==128) ) {
+                alt179=1;
             }
-            switch (alt174) {
+            switch (alt179) {
                 case 1 :
-                    // InternalDataDSL.g:21942:3: rule__XFunctionTypeRef__Group_0_1__0
+                    // InternalDataDSL.g:23028:3: rule__XFunctionTypeRef__Group_0_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__XFunctionTypeRef__Group_0_1__0();
@@ -72121,14 +75742,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__2"
-    // InternalDataDSL.g:21950:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
+    // InternalDataDSL.g:23036:1: rule__XFunctionTypeRef__Group_0__2 : rule__XFunctionTypeRef__Group_0__2__Impl ;
     public final void rule__XFunctionTypeRef__Group_0__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21954:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
-            // InternalDataDSL.g:21955:2: rule__XFunctionTypeRef__Group_0__2__Impl
+            // InternalDataDSL.g:23040:1: ( rule__XFunctionTypeRef__Group_0__2__Impl )
+            // InternalDataDSL.g:23041:2: rule__XFunctionTypeRef__Group_0__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0__2__Impl();
@@ -72154,22 +75775,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0__2__Impl"
-    // InternalDataDSL.g:21961:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
+    // InternalDataDSL.g:23047:1: rule__XFunctionTypeRef__Group_0__2__Impl : ( ')' ) ;
     public final void rule__XFunctionTypeRef__Group_0__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21965:1: ( ( ')' ) )
-            // InternalDataDSL.g:21966:1: ( ')' )
+            // InternalDataDSL.g:23051:1: ( ( ')' ) )
+            // InternalDataDSL.g:23052:1: ( ')' )
             {
-            // InternalDataDSL.g:21966:1: ( ')' )
-            // InternalDataDSL.g:21967:2: ')'
+            // InternalDataDSL.g:23052:1: ( ')' )
+            // InternalDataDSL.g:23053:2: ')'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
             }
-            match(input,123,FOLLOW_2); if (state.failed) return ;
+            match(input,129,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2()); 
             }
@@ -72195,16 +75816,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0"
-    // InternalDataDSL.g:21977:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
+    // InternalDataDSL.g:23063:1: rule__XFunctionTypeRef__Group_0_1__0 : rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 ;
     public final void rule__XFunctionTypeRef__Group_0_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21981:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
-            // InternalDataDSL.g:21982:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
+            // InternalDataDSL.g:23067:1: ( rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1 )
+            // InternalDataDSL.g:23068:2: rule__XFunctionTypeRef__Group_0_1__0__Impl rule__XFunctionTypeRef__Group_0_1__1
             {
-            pushFollow(FOLLOW_82);
+            pushFollow(FOLLOW_90);
             rule__XFunctionTypeRef__Group_0_1__0__Impl();
 
             state._fsp--;
@@ -72233,23 +75854,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__0__Impl"
-    // InternalDataDSL.g:21989:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
+    // InternalDataDSL.g:23075:1: rule__XFunctionTypeRef__Group_0_1__0__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) ;
     public final void rule__XFunctionTypeRef__Group_0_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:21993:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
-            // InternalDataDSL.g:21994:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalDataDSL.g:23079:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) ) )
+            // InternalDataDSL.g:23080:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
             {
-            // InternalDataDSL.g:21994:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
-            // InternalDataDSL.g:21995:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalDataDSL.g:23080:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 ) )
+            // InternalDataDSL.g:23081:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_0()); 
             }
-            // InternalDataDSL.g:21996:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
-            // InternalDataDSL.g:21996:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
+            // InternalDataDSL.g:23082:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 )
+            // InternalDataDSL.g:23082:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0();
@@ -72284,14 +75905,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1"
-    // InternalDataDSL.g:22004:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
+    // InternalDataDSL.g:23090:1: rule__XFunctionTypeRef__Group_0_1__1 : rule__XFunctionTypeRef__Group_0_1__1__Impl ;
     public final void rule__XFunctionTypeRef__Group_0_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22008:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
-            // InternalDataDSL.g:22009:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
+            // InternalDataDSL.g:23094:1: ( rule__XFunctionTypeRef__Group_0_1__1__Impl )
+            // InternalDataDSL.g:23095:2: rule__XFunctionTypeRef__Group_0_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0_1__1__Impl();
@@ -72317,37 +75938,37 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1__1__Impl"
-    // InternalDataDSL.g:22015:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
+    // InternalDataDSL.g:23101:1: rule__XFunctionTypeRef__Group_0_1__1__Impl : ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) ;
     public final void rule__XFunctionTypeRef__Group_0_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22019:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
-            // InternalDataDSL.g:22020:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:23105:1: ( ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* ) )
+            // InternalDataDSL.g:23106:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
             {
-            // InternalDataDSL.g:22020:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
-            // InternalDataDSL.g:22021:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            // InternalDataDSL.g:23106:1: ( ( rule__XFunctionTypeRef__Group_0_1_1__0 )* )
+            // InternalDataDSL.g:23107:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getGroup_0_1_1()); 
             }
-            // InternalDataDSL.g:22022:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
-            loop175:
+            // InternalDataDSL.g:23108:2: ( rule__XFunctionTypeRef__Group_0_1_1__0 )*
+            loop180:
             do {
-                int alt175=2;
-                int LA175_0 = input.LA(1);
+                int alt180=2;
+                int LA180_0 = input.LA(1);
 
-                if ( (LA175_0==124) ) {
-                    alt175=1;
+                if ( (LA180_0==130) ) {
+                    alt180=1;
                 }
 
 
-                switch (alt175) {
+                switch (alt180) {
             	case 1 :
-            	    // InternalDataDSL.g:22022:3: rule__XFunctionTypeRef__Group_0_1_1__0
+            	    // InternalDataDSL.g:23108:3: rule__XFunctionTypeRef__Group_0_1_1__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__XFunctionTypeRef__Group_0_1_1__0();
 
             	    state._fsp--;
@@ -72357,7 +75978,7 @@
             	    break;
 
             	default :
-            	    break loop175;
+            	    break loop180;
                 }
             } while (true);
 
@@ -72386,16 +76007,16 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0"
-    // InternalDataDSL.g:22031:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
+    // InternalDataDSL.g:23117:1: rule__XFunctionTypeRef__Group_0_1_1__0 : rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22035:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
-            // InternalDataDSL.g:22036:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
+            // InternalDataDSL.g:23121:1: ( rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1 )
+            // InternalDataDSL.g:23122:2: rule__XFunctionTypeRef__Group_0_1_1__0__Impl rule__XFunctionTypeRef__Group_0_1_1__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__XFunctionTypeRef__Group_0_1_1__0__Impl();
 
             state._fsp--;
@@ -72424,22 +76045,22 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__0__Impl"
-    // InternalDataDSL.g:22043:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:23129:1: rule__XFunctionTypeRef__Group_0_1_1__0__Impl : ( ',' ) ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22047:1: ( ( ',' ) )
-            // InternalDataDSL.g:22048:1: ( ',' )
+            // InternalDataDSL.g:23133:1: ( ( ',' ) )
+            // InternalDataDSL.g:23134:1: ( ',' )
             {
-            // InternalDataDSL.g:22048:1: ( ',' )
-            // InternalDataDSL.g:22049:2: ','
+            // InternalDataDSL.g:23134:1: ( ',' )
+            // InternalDataDSL.g:23135:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0()); 
             }
@@ -72465,14 +76086,14 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1"
-    // InternalDataDSL.g:22058:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
+    // InternalDataDSL.g:23144:1: rule__XFunctionTypeRef__Group_0_1_1__1 : rule__XFunctionTypeRef__Group_0_1_1__1__Impl ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22062:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
-            // InternalDataDSL.g:22063:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
+            // InternalDataDSL.g:23148:1: ( rule__XFunctionTypeRef__Group_0_1_1__1__Impl )
+            // InternalDataDSL.g:23149:2: rule__XFunctionTypeRef__Group_0_1_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__Group_0_1_1__1__Impl();
@@ -72498,23 +76119,23 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__Group_0_1_1__1__Impl"
-    // InternalDataDSL.g:22069:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
+    // InternalDataDSL.g:23155:1: rule__XFunctionTypeRef__Group_0_1_1__1__Impl : ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) ;
     public final void rule__XFunctionTypeRef__Group_0_1_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22073:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
-            // InternalDataDSL.g:22074:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:23159:1: ( ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) ) )
+            // InternalDataDSL.g:23160:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
             {
-            // InternalDataDSL.g:22074:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
-            // InternalDataDSL.g:22075:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalDataDSL.g:23160:1: ( ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 ) )
+            // InternalDataDSL.g:23161:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesAssignment_0_1_1_1()); 
             }
-            // InternalDataDSL.g:22076:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
-            // InternalDataDSL.g:22076:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
+            // InternalDataDSL.g:23162:2: ( rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 )
+            // InternalDataDSL.g:23162:3: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1
             {
             pushFollow(FOLLOW_2);
             rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1();
@@ -72549,16 +76170,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0"
-    // InternalDataDSL.g:22085:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
+    // InternalDataDSL.g:23171:1: rule__JvmParameterizedTypeReference__Group__0 : rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 ;
     public final void rule__JvmParameterizedTypeReference__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22089:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
-            // InternalDataDSL.g:22090:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
+            // InternalDataDSL.g:23175:1: ( rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1 )
+            // InternalDataDSL.g:23176:2: rule__JvmParameterizedTypeReference__Group__0__Impl rule__JvmParameterizedTypeReference__Group__1
             {
-            pushFollow(FOLLOW_91);
+            pushFollow(FOLLOW_99);
             rule__JvmParameterizedTypeReference__Group__0__Impl();
 
             state._fsp--;
@@ -72587,23 +76208,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__0__Impl"
-    // InternalDataDSL.g:22097:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
+    // InternalDataDSL.g:23183:1: rule__JvmParameterizedTypeReference__Group__0__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22101:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
-            // InternalDataDSL.g:22102:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalDataDSL.g:23187:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) ) )
+            // InternalDataDSL.g:23188:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
             {
-            // InternalDataDSL.g:22102:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
-            // InternalDataDSL.g:22103:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalDataDSL.g:23188:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_0 ) )
+            // InternalDataDSL.g:23189:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_0()); 
             }
-            // InternalDataDSL.g:22104:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
-            // InternalDataDSL.g:22104:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
+            // InternalDataDSL.g:23190:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_0 )
+            // InternalDataDSL.g:23190:3: rule__JvmParameterizedTypeReference__TypeAssignment_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__TypeAssignment_0();
@@ -72638,14 +76259,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1"
-    // InternalDataDSL.g:22112:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
+    // InternalDataDSL.g:23198:1: rule__JvmParameterizedTypeReference__Group__1 : rule__JvmParameterizedTypeReference__Group__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22116:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
-            // InternalDataDSL.g:22117:2: rule__JvmParameterizedTypeReference__Group__1__Impl
+            // InternalDataDSL.g:23202:1: ( rule__JvmParameterizedTypeReference__Group__1__Impl )
+            // InternalDataDSL.g:23203:2: rule__JvmParameterizedTypeReference__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group__1__Impl();
@@ -72671,27 +76292,27 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group__1__Impl"
-    // InternalDataDSL.g:22123:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
+    // InternalDataDSL.g:23209:1: rule__JvmParameterizedTypeReference__Group__1__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) ;
     public final void rule__JvmParameterizedTypeReference__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22127:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
-            // InternalDataDSL.g:22128:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalDataDSL.g:23213:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? ) )
+            // InternalDataDSL.g:23214:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
             {
-            // InternalDataDSL.g:22128:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
-            // InternalDataDSL.g:22129:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            // InternalDataDSL.g:23214:1: ( ( rule__JvmParameterizedTypeReference__Group_1__0 )? )
+            // InternalDataDSL.g:23215:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1()); 
             }
-            // InternalDataDSL.g:22130:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
-            int alt176=2;
-            alt176 = dfa176.predict(input);
-            switch (alt176) {
+            // InternalDataDSL.g:23216:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?
+            int alt181=2;
+            alt181 = dfa181.predict(input);
+            switch (alt181) {
                 case 1 :
-                    // InternalDataDSL.g:22130:3: rule__JvmParameterizedTypeReference__Group_1__0
+                    // InternalDataDSL.g:23216:3: rule__JvmParameterizedTypeReference__Group_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmParameterizedTypeReference__Group_1__0();
@@ -72729,16 +76350,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0"
-    // InternalDataDSL.g:22139:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
+    // InternalDataDSL.g:23225:1: rule__JvmParameterizedTypeReference__Group_1__0 : rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22143:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
-            // InternalDataDSL.g:22144:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
+            // InternalDataDSL.g:23229:1: ( rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1 )
+            // InternalDataDSL.g:23230:2: rule__JvmParameterizedTypeReference__Group_1__0__Impl rule__JvmParameterizedTypeReference__Group_1__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__JvmParameterizedTypeReference__Group_1__0__Impl();
 
             state._fsp--;
@@ -72767,23 +76388,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__0__Impl"
-    // InternalDataDSL.g:22151:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
+    // InternalDataDSL.g:23237:1: rule__JvmParameterizedTypeReference__Group_1__0__Impl : ( ( '<' ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22155:1: ( ( ( '<' ) ) )
-            // InternalDataDSL.g:22156:1: ( ( '<' ) )
+            // InternalDataDSL.g:23241:1: ( ( ( '<' ) ) )
+            // InternalDataDSL.g:23242:1: ( ( '<' ) )
             {
-            // InternalDataDSL.g:22156:1: ( ( '<' ) )
-            // InternalDataDSL.g:22157:2: ( '<' )
+            // InternalDataDSL.g:23242:1: ( ( '<' ) )
+            // InternalDataDSL.g:23243:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0()); 
             }
-            // InternalDataDSL.g:22158:2: ( '<' )
-            // InternalDataDSL.g:22158:3: '<'
+            // InternalDataDSL.g:23244:2: ( '<' )
+            // InternalDataDSL.g:23244:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -72814,16 +76435,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1"
-    // InternalDataDSL.g:22166:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
+    // InternalDataDSL.g:23252:1: rule__JvmParameterizedTypeReference__Group_1__1 : rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22170:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
-            // InternalDataDSL.g:22171:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
+            // InternalDataDSL.g:23256:1: ( rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2 )
+            // InternalDataDSL.g:23257:2: rule__JvmParameterizedTypeReference__Group_1__1__Impl rule__JvmParameterizedTypeReference__Group_1__2
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__JvmParameterizedTypeReference__Group_1__1__Impl();
 
             state._fsp--;
@@ -72852,23 +76473,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__1__Impl"
-    // InternalDataDSL.g:22178:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
+    // InternalDataDSL.g:23264:1: rule__JvmParameterizedTypeReference__Group_1__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22182:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
-            // InternalDataDSL.g:22183:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalDataDSL.g:23268:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) ) )
+            // InternalDataDSL.g:23269:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
             {
-            // InternalDataDSL.g:22183:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
-            // InternalDataDSL.g:22184:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalDataDSL.g:23269:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 ) )
+            // InternalDataDSL.g:23270:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_1()); 
             }
-            // InternalDataDSL.g:22185:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
-            // InternalDataDSL.g:22185:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
+            // InternalDataDSL.g:23271:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 )
+            // InternalDataDSL.g:23271:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1();
@@ -72903,16 +76524,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2"
-    // InternalDataDSL.g:22193:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
+    // InternalDataDSL.g:23279:1: rule__JvmParameterizedTypeReference__Group_1__2 : rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22197:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
-            // InternalDataDSL.g:22198:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
+            // InternalDataDSL.g:23283:1: ( rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3 )
+            // InternalDataDSL.g:23284:2: rule__JvmParameterizedTypeReference__Group_1__2__Impl rule__JvmParameterizedTypeReference__Group_1__3
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__JvmParameterizedTypeReference__Group_1__2__Impl();
 
             state._fsp--;
@@ -72941,37 +76562,37 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__2__Impl"
-    // InternalDataDSL.g:22205:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
+    // InternalDataDSL.g:23291:1: rule__JvmParameterizedTypeReference__Group_1__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22209:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
-            // InternalDataDSL.g:22210:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalDataDSL.g:23295:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* ) )
+            // InternalDataDSL.g:23296:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
             {
-            // InternalDataDSL.g:22210:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
-            // InternalDataDSL.g:22211:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            // InternalDataDSL.g:23296:1: ( ( rule__JvmParameterizedTypeReference__Group_1_2__0 )* )
+            // InternalDataDSL.g:23297:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_2()); 
             }
-            // InternalDataDSL.g:22212:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
-            loop177:
+            // InternalDataDSL.g:23298:2: ( rule__JvmParameterizedTypeReference__Group_1_2__0 )*
+            loop182:
             do {
-                int alt177=2;
-                int LA177_0 = input.LA(1);
+                int alt182=2;
+                int LA182_0 = input.LA(1);
 
-                if ( (LA177_0==124) ) {
-                    alt177=1;
+                if ( (LA182_0==130) ) {
+                    alt182=1;
                 }
 
 
-                switch (alt177) {
+                switch (alt182) {
             	case 1 :
-            	    // InternalDataDSL.g:22212:3: rule__JvmParameterizedTypeReference__Group_1_2__0
+            	    // InternalDataDSL.g:23298:3: rule__JvmParameterizedTypeReference__Group_1_2__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__JvmParameterizedTypeReference__Group_1_2__0();
 
             	    state._fsp--;
@@ -72981,7 +76602,7 @@
             	    break;
 
             	default :
-            	    break loop177;
+            	    break loop182;
                 }
             } while (true);
 
@@ -73010,16 +76631,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3"
-    // InternalDataDSL.g:22220:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
+    // InternalDataDSL.g:23306:1: rule__JvmParameterizedTypeReference__Group_1__3 : rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 ;
     public final void rule__JvmParameterizedTypeReference__Group_1__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22224:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
-            // InternalDataDSL.g:22225:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
+            // InternalDataDSL.g:23310:1: ( rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4 )
+            // InternalDataDSL.g:23311:2: rule__JvmParameterizedTypeReference__Group_1__3__Impl rule__JvmParameterizedTypeReference__Group_1__4
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__JvmParameterizedTypeReference__Group_1__3__Impl();
 
             state._fsp--;
@@ -73048,17 +76669,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__3__Impl"
-    // InternalDataDSL.g:22232:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
+    // InternalDataDSL.g:23318:1: rule__JvmParameterizedTypeReference__Group_1__3__Impl : ( '>' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22236:1: ( ( '>' ) )
-            // InternalDataDSL.g:22237:1: ( '>' )
+            // InternalDataDSL.g:23322:1: ( ( '>' ) )
+            // InternalDataDSL.g:23323:1: ( '>' )
             {
-            // InternalDataDSL.g:22237:1: ( '>' )
-            // InternalDataDSL.g:22238:2: '>'
+            // InternalDataDSL.g:23323:1: ( '>' )
+            // InternalDataDSL.g:23324:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3()); 
@@ -73089,14 +76710,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4"
-    // InternalDataDSL.g:22247:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
+    // InternalDataDSL.g:23333:1: rule__JvmParameterizedTypeReference__Group_1__4 : rule__JvmParameterizedTypeReference__Group_1__4__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22251:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
-            // InternalDataDSL.g:22252:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
+            // InternalDataDSL.g:23337:1: ( rule__JvmParameterizedTypeReference__Group_1__4__Impl )
+            // InternalDataDSL.g:23338:2: rule__JvmParameterizedTypeReference__Group_1__4__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1__4__Impl();
@@ -73122,35 +76743,35 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1__4__Impl"
-    // InternalDataDSL.g:22258:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
+    // InternalDataDSL.g:23344:1: rule__JvmParameterizedTypeReference__Group_1__4__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1__4__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22262:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
-            // InternalDataDSL.g:22263:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalDataDSL.g:23348:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* ) )
+            // InternalDataDSL.g:23349:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
             {
-            // InternalDataDSL.g:22263:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
-            // InternalDataDSL.g:22264:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            // InternalDataDSL.g:23349:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4__0 )* )
+            // InternalDataDSL.g:23350:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4()); 
             }
-            // InternalDataDSL.g:22265:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
-            loop178:
+            // InternalDataDSL.g:23351:2: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )*
+            loop183:
             do {
-                int alt178=2;
-                int LA178_0 = input.LA(1);
+                int alt183=2;
+                int LA183_0 = input.LA(1);
 
-                if ( (LA178_0==43) ) {
-                    int LA178_2 = input.LA(2);
+                if ( (LA183_0==43) ) {
+                    int LA183_2 = input.LA(2);
 
-                    if ( (LA178_2==RULE_ID) ) {
-                        int LA178_3 = input.LA(3);
+                    if ( (LA183_2==RULE_ID) ) {
+                        int LA183_3 = input.LA(3);
 
-                        if ( (synpred238_InternalDataDSL()) ) {
-                            alt178=1;
+                        if ( (synpred249_InternalDataDSL()) ) {
+                            alt183=1;
                         }
 
 
@@ -73160,11 +76781,11 @@
                 }
 
 
-                switch (alt178) {
+                switch (alt183) {
             	case 1 :
-            	    // InternalDataDSL.g:22265:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+            	    // InternalDataDSL.g:23351:3: rule__JvmParameterizedTypeReference__Group_1_4__0
             	    {
-            	    pushFollow(FOLLOW_73);
+            	    pushFollow(FOLLOW_81);
             	    rule__JvmParameterizedTypeReference__Group_1_4__0();
 
             	    state._fsp--;
@@ -73174,7 +76795,7 @@
             	    break;
 
             	default :
-            	    break loop178;
+            	    break loop183;
                 }
             } while (true);
 
@@ -73203,16 +76824,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0"
-    // InternalDataDSL.g:22274:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
+    // InternalDataDSL.g:23360:1: rule__JvmParameterizedTypeReference__Group_1_2__0 : rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22278:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
-            // InternalDataDSL.g:22279:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
+            // InternalDataDSL.g:23364:1: ( rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1 )
+            // InternalDataDSL.g:23365:2: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__JvmParameterizedTypeReference__Group_1_2__0__Impl();
 
             state._fsp--;
@@ -73241,22 +76862,22 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__0__Impl"
-    // InternalDataDSL.g:22286:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:23372:1: rule__JvmParameterizedTypeReference__Group_1_2__0__Impl : ( ',' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22290:1: ( ( ',' ) )
-            // InternalDataDSL.g:22291:1: ( ',' )
+            // InternalDataDSL.g:23376:1: ( ( ',' ) )
+            // InternalDataDSL.g:23377:1: ( ',' )
             {
-            // InternalDataDSL.g:22291:1: ( ',' )
-            // InternalDataDSL.g:22292:2: ','
+            // InternalDataDSL.g:23377:1: ( ',' )
+            // InternalDataDSL.g:23378:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0()); 
             }
@@ -73282,14 +76903,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1"
-    // InternalDataDSL.g:22301:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
+    // InternalDataDSL.g:23387:1: rule__JvmParameterizedTypeReference__Group_1_2__1 : rule__JvmParameterizedTypeReference__Group_1_2__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22305:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
-            // InternalDataDSL.g:22306:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
+            // InternalDataDSL.g:23391:1: ( rule__JvmParameterizedTypeReference__Group_1_2__1__Impl )
+            // InternalDataDSL.g:23392:2: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_2__1__Impl();
@@ -73315,23 +76936,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_2__1__Impl"
-    // InternalDataDSL.g:22312:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
+    // InternalDataDSL.g:23398:1: rule__JvmParameterizedTypeReference__Group_1_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22316:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
-            // InternalDataDSL.g:22317:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalDataDSL.g:23402:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) ) )
+            // InternalDataDSL.g:23403:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
             {
-            // InternalDataDSL.g:22317:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
-            // InternalDataDSL.g:22318:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalDataDSL.g:23403:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 ) )
+            // InternalDataDSL.g:23404:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_2_1()); 
             }
-            // InternalDataDSL.g:22319:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
-            // InternalDataDSL.g:22319:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
+            // InternalDataDSL.g:23405:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 )
+            // InternalDataDSL.g:23405:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1();
@@ -73366,14 +76987,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0"
-    // InternalDataDSL.g:22328:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
+    // InternalDataDSL.g:23414:1: rule__JvmParameterizedTypeReference__Group_1_4__0 : rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22332:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
-            // InternalDataDSL.g:22333:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
+            // InternalDataDSL.g:23418:1: ( rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1 )
+            // InternalDataDSL.g:23419:2: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl rule__JvmParameterizedTypeReference__Group_1_4__1
             {
             pushFollow(FOLLOW_7);
             rule__JvmParameterizedTypeReference__Group_1_4__0__Impl();
@@ -73404,23 +77025,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__0__Impl"
-    // InternalDataDSL.g:22340:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
+    // InternalDataDSL.g:23426:1: rule__JvmParameterizedTypeReference__Group_1_4__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22344:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
-            // InternalDataDSL.g:22345:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalDataDSL.g:23430:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) ) )
+            // InternalDataDSL.g:23431:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
             {
-            // InternalDataDSL.g:22345:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
-            // InternalDataDSL.g:22346:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalDataDSL.g:23431:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 ) )
+            // InternalDataDSL.g:23432:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0()); 
             }
-            // InternalDataDSL.g:22347:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
-            // InternalDataDSL.g:22347:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
+            // InternalDataDSL.g:23433:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0 )
+            // InternalDataDSL.g:23433:3: rule__JvmParameterizedTypeReference__Group_1_4_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0__0();
@@ -73455,16 +77076,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1"
-    // InternalDataDSL.g:22355:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
+    // InternalDataDSL.g:23441:1: rule__JvmParameterizedTypeReference__Group_1_4__1 : rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22359:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
-            // InternalDataDSL.g:22360:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
+            // InternalDataDSL.g:23445:1: ( rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2 )
+            // InternalDataDSL.g:23446:2: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl rule__JvmParameterizedTypeReference__Group_1_4__2
             {
-            pushFollow(FOLLOW_91);
+            pushFollow(FOLLOW_99);
             rule__JvmParameterizedTypeReference__Group_1_4__1__Impl();
 
             state._fsp--;
@@ -73493,23 +77114,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__1__Impl"
-    // InternalDataDSL.g:22367:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
+    // InternalDataDSL.g:23453:1: rule__JvmParameterizedTypeReference__Group_1_4__1__Impl : ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22371:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
-            // InternalDataDSL.g:22372:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalDataDSL.g:23457:1: ( ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) ) )
+            // InternalDataDSL.g:23458:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
             {
-            // InternalDataDSL.g:22372:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
-            // InternalDataDSL.g:22373:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalDataDSL.g:23458:1: ( ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 ) )
+            // InternalDataDSL.g:23459:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeAssignment_1_4_1()); 
             }
-            // InternalDataDSL.g:22374:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
-            // InternalDataDSL.g:22374:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
+            // InternalDataDSL.g:23460:2: ( rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 )
+            // InternalDataDSL.g:23460:3: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1();
@@ -73544,14 +77165,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2"
-    // InternalDataDSL.g:22382:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
+    // InternalDataDSL.g:23468:1: rule__JvmParameterizedTypeReference__Group_1_4__2 : rule__JvmParameterizedTypeReference__Group_1_4__2__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22386:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
-            // InternalDataDSL.g:22387:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
+            // InternalDataDSL.g:23472:1: ( rule__JvmParameterizedTypeReference__Group_1_4__2__Impl )
+            // InternalDataDSL.g:23473:2: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4__2__Impl();
@@ -73577,27 +77198,27 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4__2__Impl"
-    // InternalDataDSL.g:22393:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
+    // InternalDataDSL.g:23479:1: rule__JvmParameterizedTypeReference__Group_1_4__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22397:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
-            // InternalDataDSL.g:22398:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalDataDSL.g:23483:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? ) )
+            // InternalDataDSL.g:23484:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
             {
-            // InternalDataDSL.g:22398:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
-            // InternalDataDSL.g:22399:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            // InternalDataDSL.g:23484:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )? )
+            // InternalDataDSL.g:23485:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2()); 
             }
-            // InternalDataDSL.g:22400:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
-            int alt179=2;
-            alt179 = dfa179.predict(input);
-            switch (alt179) {
+            // InternalDataDSL.g:23486:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?
+            int alt184=2;
+            alt184 = dfa184.predict(input);
+            switch (alt184) {
                 case 1 :
-                    // InternalDataDSL.g:22400:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+                    // InternalDataDSL.g:23486:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmParameterizedTypeReference__Group_1_4_2__0();
@@ -73635,14 +77256,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0"
-    // InternalDataDSL.g:22409:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
+    // InternalDataDSL.g:23495:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22413:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
-            // InternalDataDSL.g:22414:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
+            // InternalDataDSL.g:23499:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl )
+            // InternalDataDSL.g:23500:2: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl();
@@ -73668,23 +77289,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl"
-    // InternalDataDSL.g:22420:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
+    // InternalDataDSL.g:23506:1: rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22424:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
-            // InternalDataDSL.g:22425:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalDataDSL.g:23510:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) ) )
+            // InternalDataDSL.g:23511:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
             {
-            // InternalDataDSL.g:22425:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
-            // InternalDataDSL.g:22426:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalDataDSL.g:23511:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 ) )
+            // InternalDataDSL.g:23512:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_0_0()); 
             }
-            // InternalDataDSL.g:22427:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
-            // InternalDataDSL.g:22427:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
+            // InternalDataDSL.g:23513:2: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 )
+            // InternalDataDSL.g:23513:3: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__0();
@@ -73719,16 +77340,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0"
-    // InternalDataDSL.g:22436:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
+    // InternalDataDSL.g:23522:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22440:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
-            // InternalDataDSL.g:22441:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
+            // InternalDataDSL.g:23526:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 )
+            // InternalDataDSL.g:23527:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_0_0__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl();
 
             state._fsp--;
@@ -73757,23 +77378,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl"
-    // InternalDataDSL.g:22448:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
+    // InternalDataDSL.g:23534:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl : ( () ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22452:1: ( ( () ) )
-            // InternalDataDSL.g:22453:1: ( () )
+            // InternalDataDSL.g:23538:1: ( ( () ) )
+            // InternalDataDSL.g:23539:1: ( () )
             {
-            // InternalDataDSL.g:22453:1: ( () )
-            // InternalDataDSL.g:22454:2: ()
+            // InternalDataDSL.g:23539:1: ( () )
+            // InternalDataDSL.g:23540:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getJvmInnerTypeReferenceOuterAction_1_4_0_0_0()); 
             }
-            // InternalDataDSL.g:22455:2: ()
-            // InternalDataDSL.g:22455:3: 
+            // InternalDataDSL.g:23541:2: ()
+            // InternalDataDSL.g:23541:3: 
             {
             }
 
@@ -73798,14 +77419,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1"
-    // InternalDataDSL.g:22463:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
+    // InternalDataDSL.g:23549:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1 : rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22467:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
-            // InternalDataDSL.g:22468:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
+            // InternalDataDSL.g:23553:1: ( rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl )
+            // InternalDataDSL.g:23554:2: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl();
@@ -73831,17 +77452,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl"
-    // InternalDataDSL.g:22474:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
+    // InternalDataDSL.g:23560:1: rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl : ( '.' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_0_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22478:1: ( ( '.' ) )
-            // InternalDataDSL.g:22479:1: ( '.' )
+            // InternalDataDSL.g:23564:1: ( ( '.' ) )
+            // InternalDataDSL.g:23565:1: ( '.' )
             {
-            // InternalDataDSL.g:22479:1: ( '.' )
-            // InternalDataDSL.g:22480:2: '.'
+            // InternalDataDSL.g:23565:1: ( '.' )
+            // InternalDataDSL.g:23566:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1()); 
@@ -73872,16 +77493,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0"
-    // InternalDataDSL.g:22490:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
+    // InternalDataDSL.g:23576:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22494:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
-            // InternalDataDSL.g:22495:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
+            // InternalDataDSL.g:23580:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1 )
+            // InternalDataDSL.g:23581:2: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl();
 
             state._fsp--;
@@ -73910,23 +77531,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl"
-    // InternalDataDSL.g:22502:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
+    // InternalDataDSL.g:23588:1: rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl : ( ( '<' ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22506:1: ( ( ( '<' ) ) )
-            // InternalDataDSL.g:22507:1: ( ( '<' ) )
+            // InternalDataDSL.g:23592:1: ( ( ( '<' ) ) )
+            // InternalDataDSL.g:23593:1: ( ( '<' ) )
             {
-            // InternalDataDSL.g:22507:1: ( ( '<' ) )
-            // InternalDataDSL.g:22508:2: ( '<' )
+            // InternalDataDSL.g:23593:1: ( ( '<' ) )
+            // InternalDataDSL.g:23594:2: ( '<' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0()); 
             }
-            // InternalDataDSL.g:22509:2: ( '<' )
-            // InternalDataDSL.g:22509:3: '<'
+            // InternalDataDSL.g:23595:2: ( '<' )
+            // InternalDataDSL.g:23595:3: '<'
             {
             match(input,27,FOLLOW_2); if (state.failed) return ;
 
@@ -73957,16 +77578,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1"
-    // InternalDataDSL.g:22517:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
+    // InternalDataDSL.g:23603:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22521:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
-            // InternalDataDSL.g:22522:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
+            // InternalDataDSL.g:23607:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2 )
+            // InternalDataDSL.g:23608:2: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__2
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl();
 
             state._fsp--;
@@ -73995,23 +77616,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl"
-    // InternalDataDSL.g:22529:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
+    // InternalDataDSL.g:23615:1: rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22533:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
-            // InternalDataDSL.g:22534:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalDataDSL.g:23619:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) ) )
+            // InternalDataDSL.g:23620:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
             {
-            // InternalDataDSL.g:22534:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
-            // InternalDataDSL.g:22535:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalDataDSL.g:23620:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 ) )
+            // InternalDataDSL.g:23621:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_1()); 
             }
-            // InternalDataDSL.g:22536:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
-            // InternalDataDSL.g:22536:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
+            // InternalDataDSL.g:23622:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 )
+            // InternalDataDSL.g:23622:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1();
@@ -74046,16 +77667,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2"
-    // InternalDataDSL.g:22544:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
+    // InternalDataDSL.g:23630:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2 : rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22548:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
-            // InternalDataDSL.g:22549:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
+            // InternalDataDSL.g:23634:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3 )
+            // InternalDataDSL.g:23635:2: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl rule__JvmParameterizedTypeReference__Group_1_4_2__3
             {
-            pushFollow(FOLLOW_121);
+            pushFollow(FOLLOW_129);
             rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl();
 
             state._fsp--;
@@ -74084,37 +77705,37 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl"
-    // InternalDataDSL.g:22556:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
+    // InternalDataDSL.g:23642:1: rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl : ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22560:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
-            // InternalDataDSL.g:22561:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalDataDSL.g:23646:1: ( ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* ) )
+            // InternalDataDSL.g:23647:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
             {
-            // InternalDataDSL.g:22561:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
-            // InternalDataDSL.g:22562:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            // InternalDataDSL.g:23647:1: ( ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )* )
+            // InternalDataDSL.g:23648:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGroup_1_4_2_2()); 
             }
-            // InternalDataDSL.g:22563:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
-            loop180:
+            // InternalDataDSL.g:23649:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 )*
+            loop185:
             do {
-                int alt180=2;
-                int LA180_0 = input.LA(1);
+                int alt185=2;
+                int LA185_0 = input.LA(1);
 
-                if ( (LA180_0==124) ) {
-                    alt180=1;
+                if ( (LA185_0==130) ) {
+                    alt185=1;
                 }
 
 
-                switch (alt180) {
+                switch (alt185) {
             	case 1 :
-            	    // InternalDataDSL.g:22563:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
+            	    // InternalDataDSL.g:23649:3: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0
             	    {
-            	    pushFollow(FOLLOW_83);
+            	    pushFollow(FOLLOW_91);
             	    rule__JvmParameterizedTypeReference__Group_1_4_2_2__0();
 
             	    state._fsp--;
@@ -74124,7 +77745,7 @@
             	    break;
 
             	default :
-            	    break loop180;
+            	    break loop185;
                 }
             } while (true);
 
@@ -74153,14 +77774,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3"
-    // InternalDataDSL.g:22571:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
+    // InternalDataDSL.g:23657:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3 : rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22575:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
-            // InternalDataDSL.g:22576:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
+            // InternalDataDSL.g:23661:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl )
+            // InternalDataDSL.g:23662:2: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl();
@@ -74186,17 +77807,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl"
-    // InternalDataDSL.g:22582:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
+    // InternalDataDSL.g:23668:1: rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl : ( '>' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2__3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22586:1: ( ( '>' ) )
-            // InternalDataDSL.g:22587:1: ( '>' )
+            // InternalDataDSL.g:23672:1: ( ( '>' ) )
+            // InternalDataDSL.g:23673:1: ( '>' )
             {
-            // InternalDataDSL.g:22587:1: ( '>' )
-            // InternalDataDSL.g:22588:2: '>'
+            // InternalDataDSL.g:23673:1: ( '>' )
+            // InternalDataDSL.g:23674:2: '>'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3()); 
@@ -74227,16 +77848,16 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0"
-    // InternalDataDSL.g:22598:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
+    // InternalDataDSL.g:23684:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22602:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
-            // InternalDataDSL.g:22603:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
+            // InternalDataDSL.g:23688:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 )
+            // InternalDataDSL.g:23689:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl rule__JvmParameterizedTypeReference__Group_1_4_2_2__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl();
 
             state._fsp--;
@@ -74265,22 +77886,22 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl"
-    // InternalDataDSL.g:22610:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
+    // InternalDataDSL.g:23696:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl : ( ',' ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22614:1: ( ( ',' ) )
-            // InternalDataDSL.g:22615:1: ( ',' )
+            // InternalDataDSL.g:23700:1: ( ( ',' ) )
+            // InternalDataDSL.g:23701:1: ( ',' )
             {
-            // InternalDataDSL.g:22615:1: ( ',' )
-            // InternalDataDSL.g:22616:2: ','
+            // InternalDataDSL.g:23701:1: ( ',' )
+            // InternalDataDSL.g:23702:2: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0()); 
             }
@@ -74306,14 +77927,14 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1"
-    // InternalDataDSL.g:22625:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
+    // InternalDataDSL.g:23711:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1 : rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22629:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
-            // InternalDataDSL.g:22630:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
+            // InternalDataDSL.g:23715:1: ( rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl )
+            // InternalDataDSL.g:23716:2: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl();
@@ -74339,23 +77960,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl"
-    // InternalDataDSL.g:22636:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
+    // InternalDataDSL.g:23722:1: rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl : ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) ;
     public final void rule__JvmParameterizedTypeReference__Group_1_4_2_2__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22640:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
-            // InternalDataDSL.g:22641:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalDataDSL.g:23726:1: ( ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) ) )
+            // InternalDataDSL.g:23727:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
             {
-            // InternalDataDSL.g:22641:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
-            // InternalDataDSL.g:22642:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalDataDSL.g:23727:1: ( ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 ) )
+            // InternalDataDSL.g:23728:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsAssignment_1_4_2_2_1()); 
             }
-            // InternalDataDSL.g:22643:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
-            // InternalDataDSL.g:22643:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
+            // InternalDataDSL.g:23729:2: ( rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 )
+            // InternalDataDSL.g:23729:3: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1();
@@ -74390,16 +78011,16 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__0"
-    // InternalDataDSL.g:22652:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
+    // InternalDataDSL.g:23738:1: rule__JvmWildcardTypeReference__Group__0 : rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 ;
     public final void rule__JvmWildcardTypeReference__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22656:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
-            // InternalDataDSL.g:22657:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
+            // InternalDataDSL.g:23742:1: ( rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1 )
+            // InternalDataDSL.g:23743:2: rule__JvmWildcardTypeReference__Group__0__Impl rule__JvmWildcardTypeReference__Group__1
             {
-            pushFollow(FOLLOW_120);
+            pushFollow(FOLLOW_128);
             rule__JvmWildcardTypeReference__Group__0__Impl();
 
             state._fsp--;
@@ -74428,23 +78049,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__0__Impl"
-    // InternalDataDSL.g:22664:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
+    // InternalDataDSL.g:23750:1: rule__JvmWildcardTypeReference__Group__0__Impl : ( () ) ;
     public final void rule__JvmWildcardTypeReference__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22668:1: ( ( () ) )
-            // InternalDataDSL.g:22669:1: ( () )
+            // InternalDataDSL.g:23754:1: ( ( () ) )
+            // InternalDataDSL.g:23755:1: ( () )
             {
-            // InternalDataDSL.g:22669:1: ( () )
-            // InternalDataDSL.g:22670:2: ()
+            // InternalDataDSL.g:23755:1: ( () )
+            // InternalDataDSL.g:23756:2: ()
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getJvmWildcardTypeReferenceAction_0()); 
             }
-            // InternalDataDSL.g:22671:2: ()
-            // InternalDataDSL.g:22671:3: 
+            // InternalDataDSL.g:23757:2: ()
+            // InternalDataDSL.g:23757:3: 
             {
             }
 
@@ -74469,16 +78090,16 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__1"
-    // InternalDataDSL.g:22679:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
+    // InternalDataDSL.g:23765:1: rule__JvmWildcardTypeReference__Group__1 : rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 ;
     public final void rule__JvmWildcardTypeReference__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22683:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
-            // InternalDataDSL.g:22684:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
+            // InternalDataDSL.g:23769:1: ( rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2 )
+            // InternalDataDSL.g:23770:2: rule__JvmWildcardTypeReference__Group__1__Impl rule__JvmWildcardTypeReference__Group__2
             {
-            pushFollow(FOLLOW_161);
+            pushFollow(FOLLOW_169);
             rule__JvmWildcardTypeReference__Group__1__Impl();
 
             state._fsp--;
@@ -74507,22 +78128,22 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__1__Impl"
-    // InternalDataDSL.g:22691:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
+    // InternalDataDSL.g:23777:1: rule__JvmWildcardTypeReference__Group__1__Impl : ( '?' ) ;
     public final void rule__JvmWildcardTypeReference__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22695:1: ( ( '?' ) )
-            // InternalDataDSL.g:22696:1: ( '?' )
+            // InternalDataDSL.g:23781:1: ( ( '?' ) )
+            // InternalDataDSL.g:23782:1: ( '?' )
             {
-            // InternalDataDSL.g:22696:1: ( '?' )
-            // InternalDataDSL.g:22697:2: '?'
+            // InternalDataDSL.g:23782:1: ( '?' )
+            // InternalDataDSL.g:23783:2: '?'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
             }
-            match(input,146,FOLLOW_2); if (state.failed) return ;
+            match(input,152,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1()); 
             }
@@ -74548,14 +78169,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__2"
-    // InternalDataDSL.g:22706:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
+    // InternalDataDSL.g:23792:1: rule__JvmWildcardTypeReference__Group__2 : rule__JvmWildcardTypeReference__Group__2__Impl ;
     public final void rule__JvmWildcardTypeReference__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22710:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
-            // InternalDataDSL.g:22711:2: rule__JvmWildcardTypeReference__Group__2__Impl
+            // InternalDataDSL.g:23796:1: ( rule__JvmWildcardTypeReference__Group__2__Impl )
+            // InternalDataDSL.g:23797:2: rule__JvmWildcardTypeReference__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group__2__Impl();
@@ -74581,31 +78202,31 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group__2__Impl"
-    // InternalDataDSL.g:22717:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
+    // InternalDataDSL.g:23803:1: rule__JvmWildcardTypeReference__Group__2__Impl : ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) ;
     public final void rule__JvmWildcardTypeReference__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22721:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
-            // InternalDataDSL.g:22722:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalDataDSL.g:23807:1: ( ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? ) )
+            // InternalDataDSL.g:23808:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
             {
-            // InternalDataDSL.g:22722:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
-            // InternalDataDSL.g:22723:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            // InternalDataDSL.g:23808:1: ( ( rule__JvmWildcardTypeReference__Alternatives_2 )? )
+            // InternalDataDSL.g:23809:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getAlternatives_2()); 
             }
-            // InternalDataDSL.g:22724:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
-            int alt181=2;
-            int LA181_0 = input.LA(1);
+            // InternalDataDSL.g:23810:2: ( rule__JvmWildcardTypeReference__Alternatives_2 )?
+            int alt186=2;
+            int LA186_0 = input.LA(1);
 
-            if ( (LA181_0==45||LA181_0==49) ) {
-                alt181=1;
+            if ( (LA186_0==45||LA186_0==49) ) {
+                alt186=1;
             }
-            switch (alt181) {
+            switch (alt186) {
                 case 1 :
-                    // InternalDataDSL.g:22724:3: rule__JvmWildcardTypeReference__Alternatives_2
+                    // InternalDataDSL.g:23810:3: rule__JvmWildcardTypeReference__Alternatives_2
                     {
                     pushFollow(FOLLOW_2);
                     rule__JvmWildcardTypeReference__Alternatives_2();
@@ -74643,16 +78264,16 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0"
-    // InternalDataDSL.g:22733:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
+    // InternalDataDSL.g:23819:1: rule__JvmWildcardTypeReference__Group_2_0__0 : rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22737:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
-            // InternalDataDSL.g:22738:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
+            // InternalDataDSL.g:23823:1: ( rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1 )
+            // InternalDataDSL.g:23824:2: rule__JvmWildcardTypeReference__Group_2_0__0__Impl rule__JvmWildcardTypeReference__Group_2_0__1
             {
-            pushFollow(FOLLOW_162);
+            pushFollow(FOLLOW_170);
             rule__JvmWildcardTypeReference__Group_2_0__0__Impl();
 
             state._fsp--;
@@ -74681,23 +78302,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__0__Impl"
-    // InternalDataDSL.g:22745:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
+    // InternalDataDSL.g:23831:1: rule__JvmWildcardTypeReference__Group_2_0__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22749:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
-            // InternalDataDSL.g:22750:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalDataDSL.g:23835:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) ) )
+            // InternalDataDSL.g:23836:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
             {
-            // InternalDataDSL.g:22750:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
-            // InternalDataDSL.g:22751:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalDataDSL.g:23836:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 ) )
+            // InternalDataDSL.g:23837:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_0()); 
             }
-            // InternalDataDSL.g:22752:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
-            // InternalDataDSL.g:22752:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
+            // InternalDataDSL.g:23838:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 )
+            // InternalDataDSL.g:23838:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0();
@@ -74732,14 +78353,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1"
-    // InternalDataDSL.g:22760:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
+    // InternalDataDSL.g:23846:1: rule__JvmWildcardTypeReference__Group_2_0__1 : rule__JvmWildcardTypeReference__Group_2_0__1__Impl ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22764:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
-            // InternalDataDSL.g:22765:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
+            // InternalDataDSL.g:23850:1: ( rule__JvmWildcardTypeReference__Group_2_0__1__Impl )
+            // InternalDataDSL.g:23851:2: rule__JvmWildcardTypeReference__Group_2_0__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group_2_0__1__Impl();
@@ -74765,37 +78386,37 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_0__1__Impl"
-    // InternalDataDSL.g:22771:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
+    // InternalDataDSL.g:23857:1: rule__JvmWildcardTypeReference__Group_2_0__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_0__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22775:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
-            // InternalDataDSL.g:22776:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalDataDSL.g:23861:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* ) )
+            // InternalDataDSL.g:23862:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
             {
-            // InternalDataDSL.g:22776:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
-            // InternalDataDSL.g:22777:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            // InternalDataDSL.g:23862:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )* )
+            // InternalDataDSL.g:23863:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_0_1()); 
             }
-            // InternalDataDSL.g:22778:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
-            loop182:
+            // InternalDataDSL.g:23864:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 )*
+            loop187:
             do {
-                int alt182=2;
-                int LA182_0 = input.LA(1);
+                int alt187=2;
+                int LA187_0 = input.LA(1);
 
-                if ( (LA182_0==147) ) {
-                    alt182=1;
+                if ( (LA187_0==153) ) {
+                    alt187=1;
                 }
 
 
-                switch (alt182) {
+                switch (alt187) {
             	case 1 :
-            	    // InternalDataDSL.g:22778:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
+            	    // InternalDataDSL.g:23864:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1
             	    {
-            	    pushFollow(FOLLOW_163);
+            	    pushFollow(FOLLOW_171);
             	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1();
 
             	    state._fsp--;
@@ -74805,7 +78426,7 @@
             	    break;
 
             	default :
-            	    break loop182;
+            	    break loop187;
                 }
             } while (true);
 
@@ -74834,16 +78455,16 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0"
-    // InternalDataDSL.g:22787:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
+    // InternalDataDSL.g:23873:1: rule__JvmWildcardTypeReference__Group_2_1__0 : rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22791:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
-            // InternalDataDSL.g:22792:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
+            // InternalDataDSL.g:23877:1: ( rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1 )
+            // InternalDataDSL.g:23878:2: rule__JvmWildcardTypeReference__Group_2_1__0__Impl rule__JvmWildcardTypeReference__Group_2_1__1
             {
-            pushFollow(FOLLOW_162);
+            pushFollow(FOLLOW_170);
             rule__JvmWildcardTypeReference__Group_2_1__0__Impl();
 
             state._fsp--;
@@ -74872,23 +78493,23 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__0__Impl"
-    // InternalDataDSL.g:22799:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
+    // InternalDataDSL.g:23885:1: rule__JvmWildcardTypeReference__Group_2_1__0__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22803:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
-            // InternalDataDSL.g:22804:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalDataDSL.g:23889:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) ) )
+            // InternalDataDSL.g:23890:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
             {
-            // InternalDataDSL.g:22804:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
-            // InternalDataDSL.g:22805:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalDataDSL.g:23890:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 ) )
+            // InternalDataDSL.g:23891:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_0()); 
             }
-            // InternalDataDSL.g:22806:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
-            // InternalDataDSL.g:22806:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
+            // InternalDataDSL.g:23892:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 )
+            // InternalDataDSL.g:23892:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0();
@@ -74923,14 +78544,14 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1"
-    // InternalDataDSL.g:22814:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
+    // InternalDataDSL.g:23900:1: rule__JvmWildcardTypeReference__Group_2_1__1 : rule__JvmWildcardTypeReference__Group_2_1__1__Impl ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22818:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
-            // InternalDataDSL.g:22819:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
+            // InternalDataDSL.g:23904:1: ( rule__JvmWildcardTypeReference__Group_2_1__1__Impl )
+            // InternalDataDSL.g:23905:2: rule__JvmWildcardTypeReference__Group_2_1__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmWildcardTypeReference__Group_2_1__1__Impl();
@@ -74956,37 +78577,37 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__Group_2_1__1__Impl"
-    // InternalDataDSL.g:22825:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
+    // InternalDataDSL.g:23911:1: rule__JvmWildcardTypeReference__Group_2_1__1__Impl : ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) ;
     public final void rule__JvmWildcardTypeReference__Group_2_1__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22829:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
-            // InternalDataDSL.g:22830:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalDataDSL.g:23915:1: ( ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* ) )
+            // InternalDataDSL.g:23916:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
             {
-            // InternalDataDSL.g:22830:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
-            // InternalDataDSL.g:22831:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            // InternalDataDSL.g:23916:1: ( ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )* )
+            // InternalDataDSL.g:23917:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsAssignment_2_1_1()); 
             }
-            // InternalDataDSL.g:22832:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
-            loop183:
+            // InternalDataDSL.g:23918:2: ( rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 )*
+            loop188:
             do {
-                int alt183=2;
-                int LA183_0 = input.LA(1);
+                int alt188=2;
+                int LA188_0 = input.LA(1);
 
-                if ( (LA183_0==147) ) {
-                    alt183=1;
+                if ( (LA188_0==153) ) {
+                    alt188=1;
                 }
 
 
-                switch (alt183) {
+                switch (alt188) {
             	case 1 :
-            	    // InternalDataDSL.g:22832:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
+            	    // InternalDataDSL.g:23918:3: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1
             	    {
-            	    pushFollow(FOLLOW_163);
+            	    pushFollow(FOLLOW_171);
             	    rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1();
 
             	    state._fsp--;
@@ -74996,7 +78617,7 @@
             	    break;
 
             	default :
-            	    break loop183;
+            	    break loop188;
                 }
             } while (true);
 
@@ -75025,16 +78646,16 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__0"
-    // InternalDataDSL.g:22841:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
+    // InternalDataDSL.g:23927:1: rule__JvmUpperBound__Group__0 : rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 ;
     public final void rule__JvmUpperBound__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22845:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
-            // InternalDataDSL.g:22846:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
+            // InternalDataDSL.g:23931:1: ( rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1 )
+            // InternalDataDSL.g:23932:2: rule__JvmUpperBound__Group__0__Impl rule__JvmUpperBound__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__JvmUpperBound__Group__0__Impl();
 
             state._fsp--;
@@ -75063,17 +78684,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__0__Impl"
-    // InternalDataDSL.g:22853:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
+    // InternalDataDSL.g:23939:1: rule__JvmUpperBound__Group__0__Impl : ( 'extends' ) ;
     public final void rule__JvmUpperBound__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22857:1: ( ( 'extends' ) )
-            // InternalDataDSL.g:22858:1: ( 'extends' )
+            // InternalDataDSL.g:23943:1: ( ( 'extends' ) )
+            // InternalDataDSL.g:23944:1: ( 'extends' )
             {
-            // InternalDataDSL.g:22858:1: ( 'extends' )
-            // InternalDataDSL.g:22859:2: 'extends'
+            // InternalDataDSL.g:23944:1: ( 'extends' )
+            // InternalDataDSL.g:23945:2: 'extends'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0()); 
@@ -75104,14 +78725,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__1"
-    // InternalDataDSL.g:22868:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
+    // InternalDataDSL.g:23954:1: rule__JvmUpperBound__Group__1 : rule__JvmUpperBound__Group__1__Impl ;
     public final void rule__JvmUpperBound__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22872:1: ( rule__JvmUpperBound__Group__1__Impl )
-            // InternalDataDSL.g:22873:2: rule__JvmUpperBound__Group__1__Impl
+            // InternalDataDSL.g:23958:1: ( rule__JvmUpperBound__Group__1__Impl )
+            // InternalDataDSL.g:23959:2: rule__JvmUpperBound__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__Group__1__Impl();
@@ -75137,23 +78758,23 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__Group__1__Impl"
-    // InternalDataDSL.g:22879:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
+    // InternalDataDSL.g:23965:1: rule__JvmUpperBound__Group__1__Impl : ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmUpperBound__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22883:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
-            // InternalDataDSL.g:22884:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:23969:1: ( ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) ) )
+            // InternalDataDSL.g:23970:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
             {
-            // InternalDataDSL.g:22884:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
-            // InternalDataDSL.g:22885:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:23970:1: ( ( rule__JvmUpperBound__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:23971:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalDataDSL.g:22886:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
-            // InternalDataDSL.g:22886:3: rule__JvmUpperBound__TypeReferenceAssignment_1
+            // InternalDataDSL.g:23972:2: ( rule__JvmUpperBound__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:23972:3: rule__JvmUpperBound__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBound__TypeReferenceAssignment_1();
@@ -75188,16 +78809,16 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__0"
-    // InternalDataDSL.g:22895:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
+    // InternalDataDSL.g:23981:1: rule__JvmUpperBoundAnded__Group__0 : rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 ;
     public final void rule__JvmUpperBoundAnded__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22899:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
-            // InternalDataDSL.g:22900:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
+            // InternalDataDSL.g:23985:1: ( rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1 )
+            // InternalDataDSL.g:23986:2: rule__JvmUpperBoundAnded__Group__0__Impl rule__JvmUpperBoundAnded__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__JvmUpperBoundAnded__Group__0__Impl();
 
             state._fsp--;
@@ -75226,22 +78847,22 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__0__Impl"
-    // InternalDataDSL.g:22907:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
+    // InternalDataDSL.g:23993:1: rule__JvmUpperBoundAnded__Group__0__Impl : ( '&' ) ;
     public final void rule__JvmUpperBoundAnded__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22911:1: ( ( '&' ) )
-            // InternalDataDSL.g:22912:1: ( '&' )
+            // InternalDataDSL.g:23997:1: ( ( '&' ) )
+            // InternalDataDSL.g:23998:1: ( '&' )
             {
-            // InternalDataDSL.g:22912:1: ( '&' )
-            // InternalDataDSL.g:22913:2: '&'
+            // InternalDataDSL.g:23998:1: ( '&' )
+            // InternalDataDSL.g:23999:2: '&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
             }
-            match(input,147,FOLLOW_2); if (state.failed) return ;
+            match(input,153,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0()); 
             }
@@ -75267,14 +78888,14 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__1"
-    // InternalDataDSL.g:22922:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
+    // InternalDataDSL.g:24008:1: rule__JvmUpperBoundAnded__Group__1 : rule__JvmUpperBoundAnded__Group__1__Impl ;
     public final void rule__JvmUpperBoundAnded__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22926:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
-            // InternalDataDSL.g:22927:2: rule__JvmUpperBoundAnded__Group__1__Impl
+            // InternalDataDSL.g:24012:1: ( rule__JvmUpperBoundAnded__Group__1__Impl )
+            // InternalDataDSL.g:24013:2: rule__JvmUpperBoundAnded__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__Group__1__Impl();
@@ -75300,23 +78921,23 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__Group__1__Impl"
-    // InternalDataDSL.g:22933:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    // InternalDataDSL.g:24019:1: rule__JvmUpperBoundAnded__Group__1__Impl : ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmUpperBoundAnded__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22937:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
-            // InternalDataDSL.g:22938:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24023:1: ( ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalDataDSL.g:24024:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
             {
-            // InternalDataDSL.g:22938:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
-            // InternalDataDSL.g:22939:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24024:1: ( ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24025:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalDataDSL.g:22940:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
-            // InternalDataDSL.g:22940:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
+            // InternalDataDSL.g:24026:2: ( rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24026:3: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmUpperBoundAnded__TypeReferenceAssignment_1();
@@ -75351,16 +78972,16 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__0"
-    // InternalDataDSL.g:22949:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
+    // InternalDataDSL.g:24035:1: rule__JvmLowerBound__Group__0 : rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 ;
     public final void rule__JvmLowerBound__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22953:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
-            // InternalDataDSL.g:22954:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
+            // InternalDataDSL.g:24039:1: ( rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1 )
+            // InternalDataDSL.g:24040:2: rule__JvmLowerBound__Group__0__Impl rule__JvmLowerBound__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__JvmLowerBound__Group__0__Impl();
 
             state._fsp--;
@@ -75389,17 +79010,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__0__Impl"
-    // InternalDataDSL.g:22961:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
+    // InternalDataDSL.g:24047:1: rule__JvmLowerBound__Group__0__Impl : ( 'super' ) ;
     public final void rule__JvmLowerBound__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22965:1: ( ( 'super' ) )
-            // InternalDataDSL.g:22966:1: ( 'super' )
+            // InternalDataDSL.g:24051:1: ( ( 'super' ) )
+            // InternalDataDSL.g:24052:1: ( 'super' )
             {
-            // InternalDataDSL.g:22966:1: ( 'super' )
-            // InternalDataDSL.g:22967:2: 'super'
+            // InternalDataDSL.g:24052:1: ( 'super' )
+            // InternalDataDSL.g:24053:2: 'super'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0()); 
@@ -75430,14 +79051,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__1"
-    // InternalDataDSL.g:22976:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
+    // InternalDataDSL.g:24062:1: rule__JvmLowerBound__Group__1 : rule__JvmLowerBound__Group__1__Impl ;
     public final void rule__JvmLowerBound__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22980:1: ( rule__JvmLowerBound__Group__1__Impl )
-            // InternalDataDSL.g:22981:2: rule__JvmLowerBound__Group__1__Impl
+            // InternalDataDSL.g:24066:1: ( rule__JvmLowerBound__Group__1__Impl )
+            // InternalDataDSL.g:24067:2: rule__JvmLowerBound__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__Group__1__Impl();
@@ -75463,23 +79084,23 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__Group__1__Impl"
-    // InternalDataDSL.g:22987:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
+    // InternalDataDSL.g:24073:1: rule__JvmLowerBound__Group__1__Impl : ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmLowerBound__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:22991:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
-            // InternalDataDSL.g:22992:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24077:1: ( ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) ) )
+            // InternalDataDSL.g:24078:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
             {
-            // InternalDataDSL.g:22992:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
-            // InternalDataDSL.g:22993:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24078:1: ( ( rule__JvmLowerBound__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24079:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalDataDSL.g:22994:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
-            // InternalDataDSL.g:22994:3: rule__JvmLowerBound__TypeReferenceAssignment_1
+            // InternalDataDSL.g:24080:2: ( rule__JvmLowerBound__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24080:3: rule__JvmLowerBound__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBound__TypeReferenceAssignment_1();
@@ -75514,16 +79135,16 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__0"
-    // InternalDataDSL.g:23003:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
+    // InternalDataDSL.g:24089:1: rule__JvmLowerBoundAnded__Group__0 : rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 ;
     public final void rule__JvmLowerBoundAnded__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23007:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
-            // InternalDataDSL.g:23008:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
+            // InternalDataDSL.g:24093:1: ( rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1 )
+            // InternalDataDSL.g:24094:2: rule__JvmLowerBoundAnded__Group__0__Impl rule__JvmLowerBoundAnded__Group__1
             {
-            pushFollow(FOLLOW_101);
+            pushFollow(FOLLOW_109);
             rule__JvmLowerBoundAnded__Group__0__Impl();
 
             state._fsp--;
@@ -75552,22 +79173,22 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__0__Impl"
-    // InternalDataDSL.g:23015:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
+    // InternalDataDSL.g:24101:1: rule__JvmLowerBoundAnded__Group__0__Impl : ( '&' ) ;
     public final void rule__JvmLowerBoundAnded__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23019:1: ( ( '&' ) )
-            // InternalDataDSL.g:23020:1: ( '&' )
+            // InternalDataDSL.g:24105:1: ( ( '&' ) )
+            // InternalDataDSL.g:24106:1: ( '&' )
             {
-            // InternalDataDSL.g:23020:1: ( '&' )
-            // InternalDataDSL.g:23021:2: '&'
+            // InternalDataDSL.g:24106:1: ( '&' )
+            // InternalDataDSL.g:24107:2: '&'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
             }
-            match(input,147,FOLLOW_2); if (state.failed) return ;
+            match(input,153,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0()); 
             }
@@ -75593,14 +79214,14 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__1"
-    // InternalDataDSL.g:23030:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
+    // InternalDataDSL.g:24116:1: rule__JvmLowerBoundAnded__Group__1 : rule__JvmLowerBoundAnded__Group__1__Impl ;
     public final void rule__JvmLowerBoundAnded__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23034:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
-            // InternalDataDSL.g:23035:2: rule__JvmLowerBoundAnded__Group__1__Impl
+            // InternalDataDSL.g:24120:1: ( rule__JvmLowerBoundAnded__Group__1__Impl )
+            // InternalDataDSL.g:24121:2: rule__JvmLowerBoundAnded__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__Group__1__Impl();
@@ -75626,23 +79247,23 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__Group__1__Impl"
-    // InternalDataDSL.g:23041:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
+    // InternalDataDSL.g:24127:1: rule__JvmLowerBoundAnded__Group__1__Impl : ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) ;
     public final void rule__JvmLowerBoundAnded__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23045:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
-            // InternalDataDSL.g:23046:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24131:1: ( ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) ) )
+            // InternalDataDSL.g:24132:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
             {
-            // InternalDataDSL.g:23046:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
-            // InternalDataDSL.g:23047:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24132:1: ( ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 ) )
+            // InternalDataDSL.g:24133:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceAssignment_1()); 
             }
-            // InternalDataDSL.g:23048:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
-            // InternalDataDSL.g:23048:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
+            // InternalDataDSL.g:24134:2: ( rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 )
+            // InternalDataDSL.g:24134:3: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1
             {
             pushFollow(FOLLOW_2);
             rule__JvmLowerBoundAnded__TypeReferenceAssignment_1();
@@ -75677,16 +79298,16 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0"
-    // InternalDataDSL.g:23057:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
+    // InternalDataDSL.g:24143:1: rule__QualifiedNameWithWildcard__Group__0 : rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 ;
     public final void rule__QualifiedNameWithWildcard__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23061:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
-            // InternalDataDSL.g:23062:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
+            // InternalDataDSL.g:24147:1: ( rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1 )
+            // InternalDataDSL.g:24148:2: rule__QualifiedNameWithWildcard__Group__0__Impl rule__QualifiedNameWithWildcard__Group__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__QualifiedNameWithWildcard__Group__0__Impl();
 
             state._fsp--;
@@ -75715,17 +79336,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__0__Impl"
-    // InternalDataDSL.g:23069:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
+    // InternalDataDSL.g:24155:1: rule__QualifiedNameWithWildcard__Group__0__Impl : ( ruleQualifiedName ) ;
     public final void rule__QualifiedNameWithWildcard__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23073:1: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:23074:1: ( ruleQualifiedName )
+            // InternalDataDSL.g:24159:1: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:24160:1: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:23074:1: ( ruleQualifiedName )
-            // InternalDataDSL.g:23075:2: ruleQualifiedName
+            // InternalDataDSL.g:24160:1: ( ruleQualifiedName )
+            // InternalDataDSL.g:24161:2: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0()); 
@@ -75760,16 +79381,16 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1"
-    // InternalDataDSL.g:23084:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
+    // InternalDataDSL.g:24170:1: rule__QualifiedNameWithWildcard__Group__1 : rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 ;
     public final void rule__QualifiedNameWithWildcard__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23088:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
-            // InternalDataDSL.g:23089:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
+            // InternalDataDSL.g:24174:1: ( rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2 )
+            // InternalDataDSL.g:24175:2: rule__QualifiedNameWithWildcard__Group__1__Impl rule__QualifiedNameWithWildcard__Group__2
             {
-            pushFollow(FOLLOW_164);
+            pushFollow(FOLLOW_172);
             rule__QualifiedNameWithWildcard__Group__1__Impl();
 
             state._fsp--;
@@ -75798,17 +79419,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__1__Impl"
-    // InternalDataDSL.g:23096:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
+    // InternalDataDSL.g:24182:1: rule__QualifiedNameWithWildcard__Group__1__Impl : ( '.' ) ;
     public final void rule__QualifiedNameWithWildcard__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23100:1: ( ( '.' ) )
-            // InternalDataDSL.g:23101:1: ( '.' )
+            // InternalDataDSL.g:24186:1: ( ( '.' ) )
+            // InternalDataDSL.g:24187:1: ( '.' )
             {
-            // InternalDataDSL.g:23101:1: ( '.' )
-            // InternalDataDSL.g:23102:2: '.'
+            // InternalDataDSL.g:24187:1: ( '.' )
+            // InternalDataDSL.g:24188:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1()); 
@@ -75839,14 +79460,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2"
-    // InternalDataDSL.g:23111:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
+    // InternalDataDSL.g:24197:1: rule__QualifiedNameWithWildcard__Group__2 : rule__QualifiedNameWithWildcard__Group__2__Impl ;
     public final void rule__QualifiedNameWithWildcard__Group__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23115:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
-            // InternalDataDSL.g:23116:2: rule__QualifiedNameWithWildcard__Group__2__Impl
+            // InternalDataDSL.g:24201:1: ( rule__QualifiedNameWithWildcard__Group__2__Impl )
+            // InternalDataDSL.g:24202:2: rule__QualifiedNameWithWildcard__Group__2__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameWithWildcard__Group__2__Impl();
@@ -75872,17 +79493,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameWithWildcard__Group__2__Impl"
-    // InternalDataDSL.g:23122:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
+    // InternalDataDSL.g:24208:1: rule__QualifiedNameWithWildcard__Group__2__Impl : ( '*' ) ;
     public final void rule__QualifiedNameWithWildcard__Group__2__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23126:1: ( ( '*' ) )
-            // InternalDataDSL.g:23127:1: ( '*' )
+            // InternalDataDSL.g:24212:1: ( ( '*' ) )
+            // InternalDataDSL.g:24213:1: ( '*' )
             {
-            // InternalDataDSL.g:23127:1: ( '*' )
-            // InternalDataDSL.g:23128:2: '*'
+            // InternalDataDSL.g:24213:1: ( '*' )
+            // InternalDataDSL.g:24214:2: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameWithWildcardAccess().getAsteriskKeyword_2()); 
@@ -75913,16 +79534,16 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0"
-    // InternalDataDSL.g:23138:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
+    // InternalDataDSL.g:24224:1: rule__QualifiedNameInStaticImport__Group__0 : rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 ;
     public final void rule__QualifiedNameInStaticImport__Group__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23142:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
-            // InternalDataDSL.g:23143:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
+            // InternalDataDSL.g:24228:1: ( rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1 )
+            // InternalDataDSL.g:24229:2: rule__QualifiedNameInStaticImport__Group__0__Impl rule__QualifiedNameInStaticImport__Group__1
             {
-            pushFollow(FOLLOW_72);
+            pushFollow(FOLLOW_80);
             rule__QualifiedNameInStaticImport__Group__0__Impl();
 
             state._fsp--;
@@ -75951,17 +79572,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__0__Impl"
-    // InternalDataDSL.g:23150:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
+    // InternalDataDSL.g:24236:1: rule__QualifiedNameInStaticImport__Group__0__Impl : ( ruleValidID ) ;
     public final void rule__QualifiedNameInStaticImport__Group__0__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23154:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:23155:1: ( ruleValidID )
+            // InternalDataDSL.g:24240:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:24241:1: ( ruleValidID )
             {
-            // InternalDataDSL.g:23155:1: ( ruleValidID )
-            // InternalDataDSL.g:23156:2: ruleValidID
+            // InternalDataDSL.g:24241:1: ( ruleValidID )
+            // InternalDataDSL.g:24242:2: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0()); 
@@ -75996,14 +79617,14 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1"
-    // InternalDataDSL.g:23165:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
+    // InternalDataDSL.g:24251:1: rule__QualifiedNameInStaticImport__Group__1 : rule__QualifiedNameInStaticImport__Group__1__Impl ;
     public final void rule__QualifiedNameInStaticImport__Group__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23169:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
-            // InternalDataDSL.g:23170:2: rule__QualifiedNameInStaticImport__Group__1__Impl
+            // InternalDataDSL.g:24255:1: ( rule__QualifiedNameInStaticImport__Group__1__Impl )
+            // InternalDataDSL.g:24256:2: rule__QualifiedNameInStaticImport__Group__1__Impl
             {
             pushFollow(FOLLOW_2);
             rule__QualifiedNameInStaticImport__Group__1__Impl();
@@ -76029,17 +79650,17 @@
 
 
     // $ANTLR start "rule__QualifiedNameInStaticImport__Group__1__Impl"
-    // InternalDataDSL.g:23176:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
+    // InternalDataDSL.g:24262:1: rule__QualifiedNameInStaticImport__Group__1__Impl : ( '.' ) ;
     public final void rule__QualifiedNameInStaticImport__Group__1__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23180:1: ( ( '.' ) )
-            // InternalDataDSL.g:23181:1: ( '.' )
+            // InternalDataDSL.g:24266:1: ( ( '.' ) )
+            // InternalDataDSL.g:24267:1: ( '.' )
             {
-            // InternalDataDSL.g:23181:1: ( '.' )
-            // InternalDataDSL.g:23182:2: '.'
+            // InternalDataDSL.g:24267:1: ( '.' )
+            // InternalDataDSL.g:24268:2: '.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getQualifiedNameInStaticImportAccess().getFullStopKeyword_1()); 
@@ -76070,30 +79691,30 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__UnorderedGroup_3"
-    // InternalDataDSL.g:23192:1: rule__DataInterchangeFileXML__UnorderedGroup_3 : ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )? ;
+    // InternalDataDSL.g:24278:1: rule__DataInterchangeFileXML__UnorderedGroup_3 : ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )? ;
     public final void rule__DataInterchangeFileXML__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalDataDSL.g:23197:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )? )
-            // InternalDataDSL.g:23198:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )?
+            // InternalDataDSL.g:24283:1: ( ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )? )
+            // InternalDataDSL.g:24284:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )?
             {
-            // InternalDataDSL.g:23198:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )?
-            int alt184=2;
-            int LA184_0 = input.LA(1);
+            // InternalDataDSL.g:24284:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )?
+            int alt189=2;
+            int LA189_0 = input.LA(1);
 
-            if ( LA184_0 == 152 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
-                alt184=1;
+            if ( LA189_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
+                alt189=1;
             }
-            else if ( LA184_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
-                alt184=1;
+            else if ( LA189_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
+                alt189=1;
             }
-            else if ( LA184_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
-                alt184=1;
+            else if ( LA189_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
+                alt189=1;
             }
-            switch (alt184) {
+            switch (alt189) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileXML__UnorderedGroup_3__0
                     {
@@ -76128,60 +79749,60 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__UnorderedGroup_3__Impl"
-    // InternalDataDSL.g:23206:1: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) ) ;
+    // InternalDataDSL.g:24292:1: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) ) ;
     public final void rule__DataInterchangeFileXML__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalDataDSL.g:23211:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) ) )
-            // InternalDataDSL.g:23212:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) )
+            // InternalDataDSL.g:24297:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) ) )
+            // InternalDataDSL.g:24298:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) )
             {
-            // InternalDataDSL.g:23212:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) )
-            int alt185=3;
-            int LA185_0 = input.LA(1);
+            // InternalDataDSL.g:24298:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) ) )
+            int alt190=3;
+            int LA190_0 = input.LA(1);
 
-            if ( LA185_0 == 152 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
-                alt185=1;
+            if ( LA190_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
+                alt190=1;
             }
-            else if ( LA185_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
-                alt185=2;
+            else if ( LA190_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
+                alt190=2;
             }
-            else if ( LA185_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
-                alt185=3;
+            else if ( LA190_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
+                alt190=3;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 185, 0, input);
+                    new NoViableAltException("", 190, 0, input);
 
                 throw nvae;
             }
-            switch (alt185) {
+            switch (alt190) {
                 case 1 :
-                    // InternalDataDSL.g:23213:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
+                    // InternalDataDSL.g:24299:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23213:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
-                    // InternalDataDSL.g:23214:4: {...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
+                    // InternalDataDSL.g:24299:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
+                    // InternalDataDSL.g:24300:4: {...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileXML__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalDataDSL.g:23214:118: ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
-                    // InternalDataDSL.g:23215:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
+                    // InternalDataDSL.g:24300:118: ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
+                    // InternalDataDSL.g:24301:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalDataDSL.g:23221:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
-                    // InternalDataDSL.g:23222:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
+                    // InternalDataDSL.g:24307:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
+                    // InternalDataDSL.g:24308:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileXMLAccess().getByAttributeAssignment_3_0()); 
                     }
-                    // InternalDataDSL.g:23223:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
-                    // InternalDataDSL.g:23223:7: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0
+                    // InternalDataDSL.g:24309:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
+                    // InternalDataDSL.g:24309:7: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileXML__ByAttributeAssignment_3_0();
@@ -76207,28 +79828,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:23228:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24314:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23228:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
-                    // InternalDataDSL.g:23229:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24314:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24315:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileXML__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalDataDSL.g:23229:118: ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
-                    // InternalDataDSL.g:23230:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24315:118: ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24316:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalDataDSL.g:23236:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
-                    // InternalDataDSL.g:23237:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
+                    // InternalDataDSL.g:24322:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24323:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileXMLAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:23238:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
-                    // InternalDataDSL.g:23238:7: rule__DataInterchangeFileXML__Group_3_1__0
+                    // InternalDataDSL.g:24324:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
+                    // InternalDataDSL.g:24324:7: rule__DataInterchangeFileXML__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileXML__Group_3_1__0();
@@ -76254,28 +79875,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:23243:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) )
+                    // InternalDataDSL.g:24329:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23243:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) )
-                    // InternalDataDSL.g:23244:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) )
+                    // InternalDataDSL.g:24329:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) ) )
+                    // InternalDataDSL.g:24330:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileXML__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2)");
                     }
-                    // InternalDataDSL.g:23244:118: ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) )
-                    // InternalDataDSL.g:23245:5: ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) )
+                    // InternalDataDSL.g:24330:118: ( ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) ) )
+                    // InternalDataDSL.g:24331:5: ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2);
                     selected = true;
-                    // InternalDataDSL.g:23251:5: ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) )
-                    // InternalDataDSL.g:23252:6: ( rule__DataInterchangeFileXML__Group_3_2__0 )
+                    // InternalDataDSL.g:24337:5: ( ( rule__DataInterchangeFileXML__Group_3_2__0 ) )
+                    // InternalDataDSL.g:24338:6: ( rule__DataInterchangeFileXML__Group_3_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileXMLAccess().getGroup_3_2()); 
                     }
-                    // InternalDataDSL.g:23253:6: ( rule__DataInterchangeFileXML__Group_3_2__0 )
-                    // InternalDataDSL.g:23253:7: rule__DataInterchangeFileXML__Group_3_2__0
+                    // InternalDataDSL.g:24339:6: ( rule__DataInterchangeFileXML__Group_3_2__0 )
+                    // InternalDataDSL.g:24339:7: rule__DataInterchangeFileXML__Group_3_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileXML__Group_3_2__0();
@@ -76324,34 +79945,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__UnorderedGroup_3__0"
-    // InternalDataDSL.g:23266:1: rule__DataInterchangeFileXML__UnorderedGroup_3__0 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )? ;
+    // InternalDataDSL.g:24352:1: rule__DataInterchangeFileXML__UnorderedGroup_3__0 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )? ;
     public final void rule__DataInterchangeFileXML__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23270:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )? )
-            // InternalDataDSL.g:23271:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )?
+            // InternalDataDSL.g:24356:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )? )
+            // InternalDataDSL.g:24357:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )?
             {
-            pushFollow(FOLLOW_165);
+            pushFollow(FOLLOW_173);
             rule__DataInterchangeFileXML__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23272:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )?
-            int alt186=2;
-            int LA186_0 = input.LA(1);
+            // InternalDataDSL.g:24358:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )?
+            int alt191=2;
+            int LA191_0 = input.LA(1);
 
-            if ( LA186_0 == 152 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
-                alt186=1;
+            if ( LA191_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
+                alt191=1;
             }
-            else if ( LA186_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
-                alt186=1;
+            else if ( LA191_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
+                alt191=1;
             }
-            else if ( LA186_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
-                alt186=1;
+            else if ( LA191_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
+                alt191=1;
             }
-            switch (alt186) {
+            switch (alt191) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileXML__UnorderedGroup_3__1
                     {
@@ -76385,34 +80006,34 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__UnorderedGroup_3__1"
-    // InternalDataDSL.g:23278:1: rule__DataInterchangeFileXML__UnorderedGroup_3__1 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )? ;
+    // InternalDataDSL.g:24364:1: rule__DataInterchangeFileXML__UnorderedGroup_3__1 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )? ;
     public final void rule__DataInterchangeFileXML__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23282:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )? )
-            // InternalDataDSL.g:23283:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )?
+            // InternalDataDSL.g:24368:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )? )
+            // InternalDataDSL.g:24369:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )?
             {
-            pushFollow(FOLLOW_165);
+            pushFollow(FOLLOW_173);
             rule__DataInterchangeFileXML__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23284:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )?
-            int alt187=2;
-            int LA187_0 = input.LA(1);
+            // InternalDataDSL.g:24370:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )?
+            int alt192=2;
+            int LA192_0 = input.LA(1);
 
-            if ( LA187_0 == 152 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
-                alt187=1;
+            if ( LA192_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
+                alt192=1;
             }
-            else if ( LA187_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
-                alt187=1;
+            else if ( LA192_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
+                alt192=1;
             }
-            else if ( LA187_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
-                alt187=1;
+            else if ( LA192_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
+                alt192=1;
             }
-            switch (alt187) {
+            switch (alt192) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileXML__UnorderedGroup_3__2
                     {
@@ -76446,14 +80067,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__UnorderedGroup_3__2"
-    // InternalDataDSL.g:23290:1: rule__DataInterchangeFileXML__UnorderedGroup_3__2 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ;
+    // InternalDataDSL.g:24376:1: rule__DataInterchangeFileXML__UnorderedGroup_3__2 : rule__DataInterchangeFileXML__UnorderedGroup_3__Impl ;
     public final void rule__DataInterchangeFileXML__UnorderedGroup_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23294:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl )
-            // InternalDataDSL.g:23295:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl
+            // InternalDataDSL.g:24380:1: ( rule__DataInterchangeFileXML__UnorderedGroup_3__Impl )
+            // InternalDataDSL.g:24381:2: rule__DataInterchangeFileXML__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileXML__UnorderedGroup_3__Impl();
@@ -76479,39 +80100,39 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3"
-    // InternalDataDSL.g:23302:1: rule__DataInterchangeFileCSV__UnorderedGroup_3 : ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )? ;
+    // InternalDataDSL.g:24388:1: rule__DataInterchangeFileCSV__UnorderedGroup_3 : ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalDataDSL.g:23307:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )? )
-            // InternalDataDSL.g:23308:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )?
+            // InternalDataDSL.g:24393:1: ( ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )? )
+            // InternalDataDSL.g:24394:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )?
             {
-            // InternalDataDSL.g:23308:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )?
-            int alt188=2;
-            int LA188_0 = input.LA(1);
+            // InternalDataDSL.g:24394:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )?
+            int alt193=2;
+            int LA193_0 = input.LA(1);
 
-            if ( LA188_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt188=1;
+            if ( LA193_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt193=1;
             }
-            else if ( LA188_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt188=1;
+            else if ( LA193_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt193=1;
             }
-            else if ( LA188_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt188=1;
+            else if ( LA193_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt193=1;
             }
-            else if ( LA188_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt188=1;
+            else if ( LA193_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt193=1;
             }
-            else if ( LA188_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt188=1;
+            else if ( LA193_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt193=1;
             }
-            else if ( LA188_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt188=1;
+            else if ( LA193_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt193=1;
             }
-            switch (alt188) {
+            switch (alt193) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__0
                     {
@@ -76546,69 +80167,69 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl"
-    // InternalDataDSL.g:23316:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) ) ;
+    // InternalDataDSL.g:24402:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) ) ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalDataDSL.g:23321:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) ) )
-            // InternalDataDSL.g:23322:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) )
+            // InternalDataDSL.g:24407:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) ) )
+            // InternalDataDSL.g:24408:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) )
             {
-            // InternalDataDSL.g:23322:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) )
-            int alt189=6;
-            int LA189_0 = input.LA(1);
+            // InternalDataDSL.g:24408:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) ) )
+            int alt194=6;
+            int LA194_0 = input.LA(1);
 
-            if ( LA189_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt189=1;
+            if ( LA194_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt194=1;
             }
-            else if ( LA189_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt189=2;
+            else if ( LA194_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt194=2;
             }
-            else if ( LA189_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt189=3;
+            else if ( LA194_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt194=3;
             }
-            else if ( LA189_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt189=4;
+            else if ( LA194_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt194=4;
             }
-            else if ( LA189_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt189=5;
+            else if ( LA194_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt194=5;
             }
-            else if ( LA189_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt189=6;
+            else if ( LA194_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt194=6;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 189, 0, input);
+                    new NoViableAltException("", 194, 0, input);
 
                 throw nvae;
             }
-            switch (alt189) {
+            switch (alt194) {
                 case 1 :
-                    // InternalDataDSL.g:23323:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
+                    // InternalDataDSL.g:24409:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23323:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
-                    // InternalDataDSL.g:23324:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
+                    // InternalDataDSL.g:24409:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
+                    // InternalDataDSL.g:24410:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalDataDSL.g:23324:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
-                    // InternalDataDSL.g:23325:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
+                    // InternalDataDSL.g:24410:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
+                    // InternalDataDSL.g:24411:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalDataDSL.g:23331:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
-                    // InternalDataDSL.g:23332:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
+                    // InternalDataDSL.g:24417:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
+                    // InternalDataDSL.g:24418:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:23333:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
-                    // InternalDataDSL.g:23333:7: rule__DataInterchangeFileCSV__Group_3_0__0
+                    // InternalDataDSL.g:24419:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
+                    // InternalDataDSL.g:24419:7: rule__DataInterchangeFileCSV__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__Group_3_0__0();
@@ -76634,28 +80255,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:23338:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24424:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23338:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
-                    // InternalDataDSL.g:23339:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24424:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24425:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalDataDSL.g:23339:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
-                    // InternalDataDSL.g:23340:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24425:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24426:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalDataDSL.g:23346:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
-                    // InternalDataDSL.g:23347:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
+                    // InternalDataDSL.g:24432:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24433:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:23348:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
-                    // InternalDataDSL.g:23348:7: rule__DataInterchangeFileCSV__Group_3_1__0
+                    // InternalDataDSL.g:24434:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
+                    // InternalDataDSL.g:24434:7: rule__DataInterchangeFileCSV__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__Group_3_1__0();
@@ -76681,28 +80302,28 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:23353:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
+                    // InternalDataDSL.g:24439:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23353:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
-                    // InternalDataDSL.g:23354:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
+                    // InternalDataDSL.g:24439:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
+                    // InternalDataDSL.g:24440:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2)");
                     }
-                    // InternalDataDSL.g:23354:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
-                    // InternalDataDSL.g:23355:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
+                    // InternalDataDSL.g:24440:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
+                    // InternalDataDSL.g:24441:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2);
                     selected = true;
-                    // InternalDataDSL.g:23361:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
-                    // InternalDataDSL.g:23362:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
+                    // InternalDataDSL.g:24447:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
+                    // InternalDataDSL.g:24448:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_2()); 
                     }
-                    // InternalDataDSL.g:23363:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
-                    // InternalDataDSL.g:23363:7: rule__DataInterchangeFileCSV__Group_3_2__0
+                    // InternalDataDSL.g:24449:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
+                    // InternalDataDSL.g:24449:7: rule__DataInterchangeFileCSV__Group_3_2__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__Group_3_2__0();
@@ -76728,28 +80349,28 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:23368:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
+                    // InternalDataDSL.g:24454:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
                     {
-                    // InternalDataDSL.g:23368:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
-                    // InternalDataDSL.g:23369:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
+                    // InternalDataDSL.g:24454:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
+                    // InternalDataDSL.g:24455:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3)");
                     }
-                    // InternalDataDSL.g:23369:118: ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
-                    // InternalDataDSL.g:23370:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
+                    // InternalDataDSL.g:24455:118: ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
+                    // InternalDataDSL.g:24456:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3);
                     selected = true;
-                    // InternalDataDSL.g:23376:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
-                    // InternalDataDSL.g:23377:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
+                    // InternalDataDSL.g:24462:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
+                    // InternalDataDSL.g:24463:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getIndentAssignment_3_3()); 
                     }
-                    // InternalDataDSL.g:23378:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
-                    // InternalDataDSL.g:23378:7: rule__DataInterchangeFileCSV__IndentAssignment_3_3
+                    // InternalDataDSL.g:24464:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
+                    // InternalDataDSL.g:24464:7: rule__DataInterchangeFileCSV__IndentAssignment_3_3
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__IndentAssignment_3_3();
@@ -76775,28 +80396,28 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:23383:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
+                    // InternalDataDSL.g:24469:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23383:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
-                    // InternalDataDSL.g:23384:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
+                    // InternalDataDSL.g:24469:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
+                    // InternalDataDSL.g:24470:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4)");
                     }
-                    // InternalDataDSL.g:23384:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
-                    // InternalDataDSL.g:23385:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
+                    // InternalDataDSL.g:24470:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
+                    // InternalDataDSL.g:24471:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4);
                     selected = true;
-                    // InternalDataDSL.g:23391:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
-                    // InternalDataDSL.g:23392:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
+                    // InternalDataDSL.g:24477:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
+                    // InternalDataDSL.g:24478:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_4()); 
                     }
-                    // InternalDataDSL.g:23393:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
-                    // InternalDataDSL.g:23393:7: rule__DataInterchangeFileCSV__Group_3_4__0
+                    // InternalDataDSL.g:24479:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
+                    // InternalDataDSL.g:24479:7: rule__DataInterchangeFileCSV__Group_3_4__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__Group_3_4__0();
@@ -76822,28 +80443,28 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:23398:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) )
+                    // InternalDataDSL.g:24484:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23398:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) )
-                    // InternalDataDSL.g:23399:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) )
+                    // InternalDataDSL.g:24484:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) ) )
+                    // InternalDataDSL.g:24485:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5)");
                     }
-                    // InternalDataDSL.g:23399:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) )
-                    // InternalDataDSL.g:23400:5: ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) )
+                    // InternalDataDSL.g:24485:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) ) )
+                    // InternalDataDSL.g:24486:5: ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5);
                     selected = true;
-                    // InternalDataDSL.g:23406:5: ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) )
-                    // InternalDataDSL.g:23407:6: ( rule__DataInterchangeFileCSV__Group_3_5__0 )
+                    // InternalDataDSL.g:24492:5: ( ( rule__DataInterchangeFileCSV__Group_3_5__0 ) )
+                    // InternalDataDSL.g:24493:6: ( rule__DataInterchangeFileCSV__Group_3_5__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_5()); 
                     }
-                    // InternalDataDSL.g:23408:6: ( rule__DataInterchangeFileCSV__Group_3_5__0 )
-                    // InternalDataDSL.g:23408:7: rule__DataInterchangeFileCSV__Group_3_5__0
+                    // InternalDataDSL.g:24494:6: ( rule__DataInterchangeFileCSV__Group_3_5__0 )
+                    // InternalDataDSL.g:24494:7: rule__DataInterchangeFileCSV__Group_3_5__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileCSV__Group_3_5__0();
@@ -76892,43 +80513,43 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__0"
-    // InternalDataDSL.g:23421:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__0 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )? ;
+    // InternalDataDSL.g:24507:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__0 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23425:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )? )
-            // InternalDataDSL.g:23426:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )?
+            // InternalDataDSL.g:24511:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )? )
+            // InternalDataDSL.g:24512:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )?
             {
-            pushFollow(FOLLOW_166);
+            pushFollow(FOLLOW_174);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23427:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )?
-            int alt190=2;
-            int LA190_0 = input.LA(1);
+            // InternalDataDSL.g:24513:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )?
+            int alt195=2;
+            int LA195_0 = input.LA(1);
 
-            if ( LA190_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt190=1;
+            if ( LA195_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt195=1;
             }
-            else if ( LA190_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt190=1;
+            else if ( LA195_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt195=1;
             }
-            else if ( LA190_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt190=1;
+            else if ( LA195_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt195=1;
             }
-            else if ( LA190_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt190=1;
+            else if ( LA195_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt195=1;
             }
-            else if ( LA190_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt190=1;
+            else if ( LA195_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt195=1;
             }
-            else if ( LA190_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt190=1;
+            else if ( LA195_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt195=1;
             }
-            switch (alt190) {
+            switch (alt195) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__1
                     {
@@ -76962,43 +80583,43 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__1"
-    // InternalDataDSL.g:23433:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__1 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )? ;
+    // InternalDataDSL.g:24519:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__1 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23437:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )? )
-            // InternalDataDSL.g:23438:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )?
+            // InternalDataDSL.g:24523:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )? )
+            // InternalDataDSL.g:24524:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )?
             {
-            pushFollow(FOLLOW_166);
+            pushFollow(FOLLOW_174);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23439:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )?
-            int alt191=2;
-            int LA191_0 = input.LA(1);
+            // InternalDataDSL.g:24525:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )?
+            int alt196=2;
+            int LA196_0 = input.LA(1);
 
-            if ( LA191_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt191=1;
+            if ( LA196_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt196=1;
             }
-            else if ( LA191_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt191=1;
+            else if ( LA196_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt196=1;
             }
-            else if ( LA191_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt191=1;
+            else if ( LA196_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt196=1;
             }
-            else if ( LA191_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt191=1;
+            else if ( LA196_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt196=1;
             }
-            else if ( LA191_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt191=1;
+            else if ( LA196_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt196=1;
             }
-            else if ( LA191_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt191=1;
+            else if ( LA196_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt196=1;
             }
-            switch (alt191) {
+            switch (alt196) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__2
                     {
@@ -77032,43 +80653,43 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__2"
-    // InternalDataDSL.g:23445:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__2 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )? ;
+    // InternalDataDSL.g:24531:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__2 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23449:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )? )
-            // InternalDataDSL.g:23450:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )?
+            // InternalDataDSL.g:24535:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )? )
+            // InternalDataDSL.g:24536:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )?
             {
-            pushFollow(FOLLOW_166);
+            pushFollow(FOLLOW_174);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23451:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )?
-            int alt192=2;
-            int LA192_0 = input.LA(1);
+            // InternalDataDSL.g:24537:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )?
+            int alt197=2;
+            int LA197_0 = input.LA(1);
 
-            if ( LA192_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt192=1;
+            if ( LA197_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt197=1;
             }
-            else if ( LA192_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt192=1;
+            else if ( LA197_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt197=1;
             }
-            else if ( LA192_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt192=1;
+            else if ( LA197_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt197=1;
             }
-            else if ( LA192_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt192=1;
+            else if ( LA197_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt197=1;
             }
-            else if ( LA192_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt192=1;
+            else if ( LA197_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt197=1;
             }
-            else if ( LA192_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt192=1;
+            else if ( LA197_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt197=1;
             }
-            switch (alt192) {
+            switch (alt197) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__3
                     {
@@ -77102,43 +80723,43 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__3"
-    // InternalDataDSL.g:23457:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__3 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )? ;
+    // InternalDataDSL.g:24543:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__3 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23461:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )? )
-            // InternalDataDSL.g:23462:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )?
+            // InternalDataDSL.g:24547:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )? )
+            // InternalDataDSL.g:24548:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )?
             {
-            pushFollow(FOLLOW_166);
+            pushFollow(FOLLOW_174);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23463:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )?
-            int alt193=2;
-            int LA193_0 = input.LA(1);
+            // InternalDataDSL.g:24549:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )?
+            int alt198=2;
+            int LA198_0 = input.LA(1);
 
-            if ( LA193_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt193=1;
+            if ( LA198_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt198=1;
             }
-            else if ( LA193_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt193=1;
+            else if ( LA198_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt198=1;
             }
-            else if ( LA193_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt193=1;
+            else if ( LA198_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt198=1;
             }
-            else if ( LA193_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt193=1;
+            else if ( LA198_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt198=1;
             }
-            else if ( LA193_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt193=1;
+            else if ( LA198_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt198=1;
             }
-            else if ( LA193_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt193=1;
+            else if ( LA198_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt198=1;
             }
-            switch (alt193) {
+            switch (alt198) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__4
                     {
@@ -77172,43 +80793,43 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__4"
-    // InternalDataDSL.g:23469:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__4 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )? ;
+    // InternalDataDSL.g:24555:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__4 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )? ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23473:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )? )
-            // InternalDataDSL.g:23474:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )?
+            // InternalDataDSL.g:24559:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )? )
+            // InternalDataDSL.g:24560:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )?
             {
-            pushFollow(FOLLOW_166);
+            pushFollow(FOLLOW_174);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23475:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )?
-            int alt194=2;
-            int LA194_0 = input.LA(1);
+            // InternalDataDSL.g:24561:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )?
+            int alt199=2;
+            int LA199_0 = input.LA(1);
 
-            if ( LA194_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-                alt194=1;
+            if ( LA199_0 == 85 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
+                alt199=1;
             }
-            else if ( LA194_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-                alt194=1;
+            else if ( LA199_0 == 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+                alt199=1;
             }
-            else if ( LA194_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-                alt194=1;
+            else if ( LA199_0 == 87 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+                alt199=1;
             }
-            else if ( LA194_0 == 153 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-                alt194=1;
+            else if ( LA199_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
+                alt199=1;
             }
-            else if ( LA194_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-                alt194=1;
+            else if ( LA199_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
+                alt199=1;
             }
-            else if ( LA194_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
-                alt194=1;
+            else if ( LA199_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
+                alt199=1;
             }
-            switch (alt194) {
+            switch (alt199) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileCSV__UnorderedGroup_3__5
                     {
@@ -77242,14 +80863,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__UnorderedGroup_3__5"
-    // InternalDataDSL.g:23481:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__5 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ;
+    // InternalDataDSL.g:24567:1: rule__DataInterchangeFileCSV__UnorderedGroup_3__5 : rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl ;
     public final void rule__DataInterchangeFileCSV__UnorderedGroup_3__5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23485:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl )
-            // InternalDataDSL.g:23486:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl
+            // InternalDataDSL.g:24571:1: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl )
+            // InternalDataDSL.g:24572:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileCSV__UnorderedGroup_3__Impl();
@@ -77275,27 +80896,27 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__UnorderedGroup_3"
-    // InternalDataDSL.g:23493:1: rule__DataInterchangeFileEDI__UnorderedGroup_3 : ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )? ;
+    // InternalDataDSL.g:24579:1: rule__DataInterchangeFileEDI__UnorderedGroup_3 : ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )? ;
     public final void rule__DataInterchangeFileEDI__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalDataDSL.g:23498:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )? )
-            // InternalDataDSL.g:23499:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )?
+            // InternalDataDSL.g:24584:1: ( ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )? )
+            // InternalDataDSL.g:24585:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )?
             {
-            // InternalDataDSL.g:23499:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )?
-            int alt195=2;
-            int LA195_0 = input.LA(1);
+            // InternalDataDSL.g:24585:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )?
+            int alt200=2;
+            int LA200_0 = input.LA(1);
 
-            if ( LA195_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
-                alt195=1;
+            if ( LA200_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
+                alt200=1;
             }
-            else if ( LA195_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
-                alt195=1;
+            else if ( LA200_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
+                alt200=1;
             }
-            switch (alt195) {
+            switch (alt200) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileEDI__UnorderedGroup_3__0
                     {
@@ -77330,57 +80951,57 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl"
-    // InternalDataDSL.g:23507:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) ) ;
+    // InternalDataDSL.g:24593:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) ) ;
     public final void rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalDataDSL.g:23512:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) ) )
-            // InternalDataDSL.g:23513:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) )
+            // InternalDataDSL.g:24598:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) ) )
+            // InternalDataDSL.g:24599:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) )
             {
-            // InternalDataDSL.g:23513:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) )
-            int alt196=2;
-            int LA196_0 = input.LA(1);
+            // InternalDataDSL.g:24599:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) ) )
+            int alt201=2;
+            int LA201_0 = input.LA(1);
 
-            if ( LA196_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
-                alt196=1;
+            if ( LA201_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
+                alt201=1;
             }
-            else if ( LA196_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
-                alt196=2;
+            else if ( LA201_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
+                alt201=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 196, 0, input);
+                    new NoViableAltException("", 201, 0, input);
 
                 throw nvae;
             }
-            switch (alt196) {
+            switch (alt201) {
                 case 1 :
-                    // InternalDataDSL.g:23514:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
+                    // InternalDataDSL.g:24600:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23514:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
-                    // InternalDataDSL.g:23515:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
+                    // InternalDataDSL.g:24600:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
+                    // InternalDataDSL.g:24601:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalDataDSL.g:23515:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
-                    // InternalDataDSL.g:23516:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
+                    // InternalDataDSL.g:24601:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
+                    // InternalDataDSL.g:24602:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalDataDSL.g:23522:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
-                    // InternalDataDSL.g:23523:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
+                    // InternalDataDSL.g:24608:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
+                    // InternalDataDSL.g:24609:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:23524:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
-                    // InternalDataDSL.g:23524:7: rule__DataInterchangeFileEDI__Group_3_0__0
+                    // InternalDataDSL.g:24610:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
+                    // InternalDataDSL.g:24610:7: rule__DataInterchangeFileEDI__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileEDI__Group_3_0__0();
@@ -77406,28 +81027,28 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:23529:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24615:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23529:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) )
-                    // InternalDataDSL.g:23530:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24615:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24616:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) )
                     {
                     if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
                         throw new FailedPredicateException(input, "rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalDataDSL.g:23530:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) )
-                    // InternalDataDSL.g:23531:5: ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24616:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24617:5: ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) )
                     {
                     getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalDataDSL.g:23537:5: ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) )
-                    // InternalDataDSL.g:23538:6: ( rule__DataInterchangeFileEDI__Group_3_1__0 )
+                    // InternalDataDSL.g:24623:5: ( ( rule__DataInterchangeFileEDI__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24624:6: ( rule__DataInterchangeFileEDI__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
                        before(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:23539:6: ( rule__DataInterchangeFileEDI__Group_3_1__0 )
-                    // InternalDataDSL.g:23539:7: rule__DataInterchangeFileEDI__Group_3_1__0
+                    // InternalDataDSL.g:24625:6: ( rule__DataInterchangeFileEDI__Group_3_1__0 )
+                    // InternalDataDSL.g:24625:7: rule__DataInterchangeFileEDI__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
                     rule__DataInterchangeFileEDI__Group_3_1__0();
@@ -77476,31 +81097,31 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__UnorderedGroup_3__0"
-    // InternalDataDSL.g:23552:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__0 : rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )? ;
+    // InternalDataDSL.g:24638:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__0 : rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )? ;
     public final void rule__DataInterchangeFileEDI__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23556:1: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )? )
-            // InternalDataDSL.g:23557:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )?
+            // InternalDataDSL.g:24642:1: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )? )
+            // InternalDataDSL.g:24643:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )?
             {
-            pushFollow(FOLLOW_167);
+            pushFollow(FOLLOW_175);
             rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23558:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )?
-            int alt197=2;
-            int LA197_0 = input.LA(1);
+            // InternalDataDSL.g:24644:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )?
+            int alt202=2;
+            int LA202_0 = input.LA(1);
 
-            if ( LA197_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
-                alt197=1;
+            if ( LA202_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
+                alt202=1;
             }
-            else if ( LA197_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
-                alt197=1;
+            else if ( LA202_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
+                alt202=1;
             }
-            switch (alt197) {
+            switch (alt202) {
                 case 1 :
                     // InternalDataDSL.g:0:0: rule__DataInterchangeFileEDI__UnorderedGroup_3__1
                     {
@@ -77534,14 +81155,14 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__UnorderedGroup_3__1"
-    // InternalDataDSL.g:23564:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__1 : rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ;
+    // InternalDataDSL.g:24650:1: rule__DataInterchangeFileEDI__UnorderedGroup_3__1 : rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl ;
     public final void rule__DataInterchangeFileEDI__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23568:1: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl )
-            // InternalDataDSL.g:23569:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl
+            // InternalDataDSL.g:24654:1: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl )
+            // InternalDataDSL.g:24655:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
             rule__DataInterchangeFileEDI__UnorderedGroup_3__Impl();
@@ -77566,36 +81187,33 @@
     // $ANTLR end "rule__DataInterchangeFileEDI__UnorderedGroup_3__1"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_10"
-    // InternalDataDSL.g:23576:1: rule__DataInterchangeLookup__UnorderedGroup_10 : ( rule__DataInterchangeLookup__UnorderedGroup_10__0 )? ;
-    public final void rule__DataInterchangeLookup__UnorderedGroup_10() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeFileFixed__UnorderedGroup_3"
+    // InternalDataDSL.g:24662:1: rule__DataInterchangeFileFixed__UnorderedGroup_3 : ( rule__DataInterchangeFileFixed__UnorderedGroup_3__0 )? ;
+    public final void rule__DataInterchangeFileFixed__UnorderedGroup_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
-        		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+        		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
         	
         try {
-            // InternalDataDSL.g:23581:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_10__0 )? )
-            // InternalDataDSL.g:23582:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__0 )?
+            // InternalDataDSL.g:24667:1: ( ( rule__DataInterchangeFileFixed__UnorderedGroup_3__0 )? )
+            // InternalDataDSL.g:24668:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__0 )?
             {
-            // InternalDataDSL.g:23582:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__0 )?
-            int alt198=2;
-            int LA198_0 = input.LA(1);
+            // InternalDataDSL.g:24668:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__0 )?
+            int alt203=2;
+            int LA203_0 = input.LA(1);
 
-            if ( LA198_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
-                alt198=1;
+            if ( LA203_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+                alt203=1;
             }
-            else if ( LA198_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
-                alt198=1;
+            else if ( LA203_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
+                alt203=1;
             }
-            else if ( LA198_0 == 105 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                alt198=1;
-            }
-            switch (alt198) {
+            switch (alt203) {
                 case 1 :
-                    // InternalDataDSL.g:0:0: rule__DataInterchangeLookup__UnorderedGroup_10__0
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeFileFixed__UnorderedGroup_3__0
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__UnorderedGroup_10__0();
+                    rule__DataInterchangeFileFixed__UnorderedGroup_3__0();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -77615,73 +81233,70 @@
         }
         finally {
 
-            	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+            	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
             	restoreStackSize(stackSize);
 
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_10"
+    // $ANTLR end "rule__DataInterchangeFileFixed__UnorderedGroup_3"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_10__Impl"
-    // InternalDataDSL.g:23590:1: rule__DataInterchangeLookup__UnorderedGroup_10__Impl : ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) ) ) ;
-    public final void rule__DataInterchangeLookup__UnorderedGroup_10__Impl() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl"
+    // InternalDataDSL.g:24676:1: rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) ) ) ;
+    public final void rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         		boolean selected = false;
         	
         try {
-            // InternalDataDSL.g:23595:1: ( ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) ) ) )
-            // InternalDataDSL.g:23596:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) ) )
+            // InternalDataDSL.g:24681:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) ) ) )
+            // InternalDataDSL.g:24682:3: ( ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) ) )
             {
-            // InternalDataDSL.g:23596:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) ) )
-            int alt199=3;
-            int LA199_0 = input.LA(1);
+            // InternalDataDSL.g:24682:3: ( ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) ) )
+            int alt204=2;
+            int LA204_0 = input.LA(1);
 
-            if ( LA199_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
-                alt199=1;
+            if ( LA204_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+                alt204=1;
             }
-            else if ( LA199_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
-                alt199=2;
-            }
-            else if ( LA199_0 == 105 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                alt199=3;
+            else if ( LA204_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
+                alt204=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return ;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 199, 0, input);
+                    new NoViableAltException("", 204, 0, input);
 
                 throw nvae;
             }
-            switch (alt199) {
+            switch (alt204) {
                 case 1 :
-                    // InternalDataDSL.g:23597:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) )
+                    // InternalDataDSL.g:24683:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23597:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) )
-                    // InternalDataDSL.g:23598:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) )
+                    // InternalDataDSL.g:24683:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) )
+                    // InternalDataDSL.g:24684:4: {...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) )
                     {
-                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
-                        throw new FailedPredicateException(input, "rule__DataInterchangeLookup__UnorderedGroup_10__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0)");
+                        throw new FailedPredicateException(input, "rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0)");
                     }
-                    // InternalDataDSL.g:23598:118: ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) )
-                    // InternalDataDSL.g:23599:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) )
+                    // InternalDataDSL.g:24684:120: ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) )
+                    // InternalDataDSL.g:24685:5: ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) )
                     {
-                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0);
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0);
                     selected = true;
-                    // InternalDataDSL.g:23605:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) )
-                    // InternalDataDSL.g:23606:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 )
+                    // InternalDataDSL.g:24691:5: ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) )
+                    // InternalDataDSL.g:24692:6: ( rule__DataInterchangeFileFixed__Group_3_0__0 )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0()); 
+                       before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0()); 
                     }
-                    // InternalDataDSL.g:23607:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 )
-                    // InternalDataDSL.g:23607:7: rule__DataInterchangeLookup__AllowNoResultAssignment_10_0
+                    // InternalDataDSL.g:24693:6: ( rule__DataInterchangeFileFixed__Group_3_0__0 )
+                    // InternalDataDSL.g:24693:7: rule__DataInterchangeFileFixed__Group_3_0__0
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__AllowNoResultAssignment_10_0();
+                    rule__DataInterchangeFileFixed__Group_3_0__0();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -77689,7 +81304,7 @@
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0()); 
+                       after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0()); 
                     }
 
                     }
@@ -77704,31 +81319,31 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:23612:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) )
+                    // InternalDataDSL.g:24698:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) )
                     {
-                    // InternalDataDSL.g:23612:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) )
-                    // InternalDataDSL.g:23613:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) )
+                    // InternalDataDSL.g:24698:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) ) )
+                    // InternalDataDSL.g:24699:4: {...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) )
                     {
-                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
                         if (state.backtracking>0) {state.failed=true; return ;}
-                        throw new FailedPredicateException(input, "rule__DataInterchangeLookup__UnorderedGroup_10__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1)");
+                        throw new FailedPredicateException(input, "rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1)");
                     }
-                    // InternalDataDSL.g:23613:118: ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) )
-                    // InternalDataDSL.g:23614:5: ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) )
+                    // InternalDataDSL.g:24699:120: ( ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) ) )
+                    // InternalDataDSL.g:24700:5: ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) )
                     {
-                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1);
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1);
                     selected = true;
-                    // InternalDataDSL.g:23620:5: ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) )
-                    // InternalDataDSL.g:23621:6: ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 )
+                    // InternalDataDSL.g:24706:5: ( ( rule__DataInterchangeFileFixed__Group_3_1__0 ) )
+                    // InternalDataDSL.g:24707:6: ( rule__DataInterchangeFileFixed__Group_3_1__0 )
                     {
                     if ( state.backtracking==0 ) {
-                       before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1()); 
+                       before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_1()); 
                     }
-                    // InternalDataDSL.g:23622:6: ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 )
-                    // InternalDataDSL.g:23622:7: rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1
+                    // InternalDataDSL.g:24708:6: ( rule__DataInterchangeFileFixed__Group_3_1__0 )
+                    // InternalDataDSL.g:24708:7: rule__DataInterchangeFileFixed__Group_3_1__0
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1();
+                    rule__DataInterchangeFileFixed__Group_3_1__0();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -77736,54 +81351,7 @@
                     }
 
                     if ( state.backtracking==0 ) {
-                       after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1()); 
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-                case 3 :
-                    // InternalDataDSL.g:23627:3: ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) )
-                    {
-                    // InternalDataDSL.g:23627:3: ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) ) )
-                    // InternalDataDSL.g:23628:4: {...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) )
-                    {
-                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                        if (state.backtracking>0) {state.failed=true; return ;}
-                        throw new FailedPredicateException(input, "rule__DataInterchangeLookup__UnorderedGroup_10__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2)");
-                    }
-                    // InternalDataDSL.g:23628:118: ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) ) )
-                    // InternalDataDSL.g:23629:5: ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) )
-                    {
-                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2);
-                    selected = true;
-                    // InternalDataDSL.g:23635:5: ( ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 ) )
-                    // InternalDataDSL.g:23636:6: ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 )
-                    {
-                    if ( state.backtracking==0 ) {
-                       before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_10_2()); 
-                    }
-                    // InternalDataDSL.g:23637:6: ( rule__DataInterchangeLookup__MarkerPathAssignment_10_2 )
-                    // InternalDataDSL.g:23637:7: rule__DataInterchangeLookup__MarkerPathAssignment_10_2
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__MarkerPathAssignment_10_2();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-
-                    if ( state.backtracking==0 ) {
-                       after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_10_2()); 
+                       after(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_1()); 
                     }
 
                     }
@@ -77811,49 +81379,46 @@
         finally {
 
             	if (selected)
-            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
             	restoreStackSize(stackSize);
 
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_10__Impl"
+    // $ANTLR end "rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_10__0"
-    // InternalDataDSL.g:23650:1: rule__DataInterchangeLookup__UnorderedGroup_10__0 : rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__1 )? ;
-    public final void rule__DataInterchangeLookup__UnorderedGroup_10__0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeFileFixed__UnorderedGroup_3__0"
+    // InternalDataDSL.g:24721:1: rule__DataInterchangeFileFixed__UnorderedGroup_3__0 : rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl ( rule__DataInterchangeFileFixed__UnorderedGroup_3__1 )? ;
+    public final void rule__DataInterchangeFileFixed__UnorderedGroup_3__0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23654:1: ( rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__1 )? )
-            // InternalDataDSL.g:23655:2: rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__1 )?
+            // InternalDataDSL.g:24725:1: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl ( rule__DataInterchangeFileFixed__UnorderedGroup_3__1 )? )
+            // InternalDataDSL.g:24726:2: rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl ( rule__DataInterchangeFileFixed__UnorderedGroup_3__1 )?
             {
-            pushFollow(FOLLOW_168);
-            rule__DataInterchangeLookup__UnorderedGroup_10__Impl();
+            pushFollow(FOLLOW_175);
+            rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
-            // InternalDataDSL.g:23656:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__1 )?
-            int alt200=2;
-            int LA200_0 = input.LA(1);
+            // InternalDataDSL.g:24727:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__1 )?
+            int alt205=2;
+            int LA205_0 = input.LA(1);
 
-            if ( LA200_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
-                alt200=1;
+            if ( LA205_0 == 82 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+                alt205=1;
             }
-            else if ( LA200_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
-                alt200=1;
+            else if ( LA205_0 == 83 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
+                alt205=1;
             }
-            else if ( LA200_0 == 105 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                alt200=1;
-            }
-            switch (alt200) {
+            switch (alt205) {
                 case 1 :
-                    // InternalDataDSL.g:0:0: rule__DataInterchangeLookup__UnorderedGroup_10__1
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeFileFixed__UnorderedGroup_3__1
                     {
                     pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__UnorderedGroup_10__1();
+                    rule__DataInterchangeFileFixed__UnorderedGroup_3__1();
 
                     state._fsp--;
                     if (state.failed) return ;
@@ -77878,82 +81443,21 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_10__0"
+    // $ANTLR end "rule__DataInterchangeFileFixed__UnorderedGroup_3__0"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_10__1"
-    // InternalDataDSL.g:23662:1: rule__DataInterchangeLookup__UnorderedGroup_10__1 : rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__2 )? ;
-    public final void rule__DataInterchangeLookup__UnorderedGroup_10__1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeFileFixed__UnorderedGroup_3__1"
+    // InternalDataDSL.g:24733:1: rule__DataInterchangeFileFixed__UnorderedGroup_3__1 : rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl ;
+    public final void rule__DataInterchangeFileFixed__UnorderedGroup_3__1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23666:1: ( rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__2 )? )
-            // InternalDataDSL.g:23667:2: rule__DataInterchangeLookup__UnorderedGroup_10__Impl ( rule__DataInterchangeLookup__UnorderedGroup_10__2 )?
-            {
-            pushFollow(FOLLOW_168);
-            rule__DataInterchangeLookup__UnorderedGroup_10__Impl();
-
-            state._fsp--;
-            if (state.failed) return ;
-            // InternalDataDSL.g:23668:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__2 )?
-            int alt201=2;
-            int LA201_0 = input.LA(1);
-
-            if ( LA201_0 == 158 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
-                alt201=1;
-            }
-            else if ( LA201_0 == 159 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
-                alt201=1;
-            }
-            else if ( LA201_0 == 105 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                alt201=1;
-            }
-            switch (alt201) {
-                case 1 :
-                    // InternalDataDSL.g:0:0: rule__DataInterchangeLookup__UnorderedGroup_10__2
-                    {
-                    pushFollow(FOLLOW_2);
-                    rule__DataInterchangeLookup__UnorderedGroup_10__2();
-
-                    state._fsp--;
-                    if (state.failed) return ;
-
-                    }
-                    break;
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_10__1"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_10__2"
-    // InternalDataDSL.g:23674:1: rule__DataInterchangeLookup__UnorderedGroup_10__2 : rule__DataInterchangeLookup__UnorderedGroup_10__Impl ;
-    public final void rule__DataInterchangeLookup__UnorderedGroup_10__2() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:23678:1: ( rule__DataInterchangeLookup__UnorderedGroup_10__Impl )
-            // InternalDataDSL.g:23679:2: rule__DataInterchangeLookup__UnorderedGroup_10__Impl
+            // InternalDataDSL.g:24737:1: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl )
+            // InternalDataDSL.g:24738:2: rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl
             {
             pushFollow(FOLLOW_2);
-            rule__DataInterchangeLookup__UnorderedGroup_10__Impl();
+            rule__DataInterchangeFileFixed__UnorderedGroup_3__Impl();
 
             state._fsp--;
             if (state.failed) return ;
@@ -77972,21 +81476,597 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_10__2"
+    // $ANTLR end "rule__DataInterchangeFileFixed__UnorderedGroup_3__1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_9"
+    // InternalDataDSL.g:24745:1: rule__DataInterchangeLookup__UnorderedGroup_9 : ( rule__DataInterchangeLookup__UnorderedGroup_9__0 )? ;
+    public final void rule__DataInterchangeLookup__UnorderedGroup_9() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+        	
+        try {
+            // InternalDataDSL.g:24750:1: ( ( rule__DataInterchangeLookup__UnorderedGroup_9__0 )? )
+            // InternalDataDSL.g:24751:2: ( rule__DataInterchangeLookup__UnorderedGroup_9__0 )?
+            {
+            // InternalDataDSL.g:24751:2: ( rule__DataInterchangeLookup__UnorderedGroup_9__0 )?
+            int alt206=2;
+            int LA206_0 = input.LA(1);
+
+            if ( LA206_0 == 163 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+                alt206=1;
+            }
+            else if ( LA206_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
+                alt206=1;
+            }
+            switch (alt206) {
+                case 1 :
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeLookup__UnorderedGroup_9__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__UnorderedGroup_9__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_9"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_9__Impl"
+    // InternalDataDSL.g:24759:1: rule__DataInterchangeLookup__UnorderedGroup_9__Impl : ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) ) ) ;
+    public final void rule__DataInterchangeLookup__UnorderedGroup_9__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalDataDSL.g:24764:1: ( ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) ) ) )
+            // InternalDataDSL.g:24765:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) ) )
+            {
+            // InternalDataDSL.g:24765:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) ) )
+            int alt207=2;
+            int LA207_0 = input.LA(1);
+
+            if ( LA207_0 == 163 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+                alt207=1;
+            }
+            else if ( LA207_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
+                alt207=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 207, 0, input);
+
+                throw nvae;
+            }
+            switch (alt207) {
+                case 1 :
+                    // InternalDataDSL.g:24766:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) )
+                    {
+                    // InternalDataDSL.g:24766:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) )
+                    // InternalDataDSL.g:24767:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__DataInterchangeLookup__UnorderedGroup_9__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0)");
+                    }
+                    // InternalDataDSL.g:24767:117: ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) )
+                    // InternalDataDSL.g:24768:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0);
+                    selected = true;
+                    // InternalDataDSL.g:24774:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) )
+                    // InternalDataDSL.g:24775:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0()); 
+                    }
+                    // InternalDataDSL.g:24776:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 )
+                    // InternalDataDSL.g:24776:7: rule__DataInterchangeLookup__AllowNoResultAssignment_9_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__AllowNoResultAssignment_9_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:24781:3: ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) )
+                    {
+                    // InternalDataDSL.g:24781:3: ({...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) ) )
+                    // InternalDataDSL.g:24782:4: {...}? => ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__DataInterchangeLookup__UnorderedGroup_9__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1)");
+                    }
+                    // InternalDataDSL.g:24782:117: ( ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) ) )
+                    // InternalDataDSL.g:24783:5: ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1);
+                    selected = true;
+                    // InternalDataDSL.g:24789:5: ( ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 ) )
+                    // InternalDataDSL.g:24790:6: ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_9_1()); 
+                    }
+                    // InternalDataDSL.g:24791:6: ( rule__DataInterchangeLookup__MarkerPathAssignment_9_1 )
+                    // InternalDataDSL.g:24791:7: rule__DataInterchangeLookup__MarkerPathAssignment_9_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__MarkerPathAssignment_9_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathAssignment_9_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_9__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_9__0"
+    // InternalDataDSL.g:24804:1: rule__DataInterchangeLookup__UnorderedGroup_9__0 : rule__DataInterchangeLookup__UnorderedGroup_9__Impl ( rule__DataInterchangeLookup__UnorderedGroup_9__1 )? ;
+    public final void rule__DataInterchangeLookup__UnorderedGroup_9__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:24808:1: ( rule__DataInterchangeLookup__UnorderedGroup_9__Impl ( rule__DataInterchangeLookup__UnorderedGroup_9__1 )? )
+            // InternalDataDSL.g:24809:2: rule__DataInterchangeLookup__UnorderedGroup_9__Impl ( rule__DataInterchangeLookup__UnorderedGroup_9__1 )?
+            {
+            pushFollow(FOLLOW_176);
+            rule__DataInterchangeLookup__UnorderedGroup_9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalDataDSL.g:24810:2: ( rule__DataInterchangeLookup__UnorderedGroup_9__1 )?
+            int alt208=2;
+            int LA208_0 = input.LA(1);
+
+            if ( LA208_0 == 163 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+                alt208=1;
+            }
+            else if ( LA208_0 == 108 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
+                alt208=1;
+            }
+            switch (alt208) {
+                case 1 :
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeLookup__UnorderedGroup_9__1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeLookup__UnorderedGroup_9__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_9__0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__UnorderedGroup_9__1"
+    // InternalDataDSL.g:24816:1: rule__DataInterchangeLookup__UnorderedGroup_9__1 : rule__DataInterchangeLookup__UnorderedGroup_9__Impl ;
+    public final void rule__DataInterchangeLookup__UnorderedGroup_9__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:24820:1: ( rule__DataInterchangeLookup__UnorderedGroup_9__Impl )
+            // InternalDataDSL.g:24821:2: rule__DataInterchangeLookup__UnorderedGroup_9__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeLookup__UnorderedGroup_9__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__UnorderedGroup_9__1"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5"
+    // InternalDataDSL.g:24828:1: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5 : ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )? ;
+    public final void rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+        	
+        try {
+            // InternalDataDSL.g:24833:1: ( ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )? )
+            // InternalDataDSL.g:24834:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )?
+            {
+            // InternalDataDSL.g:24834:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )?
+            int alt209=2;
+            alt209 = dfa209.predict(input);
+            switch (alt209) {
+                case 1 :
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl"
+    // InternalDataDSL.g:24842:1: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl : ( ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        		boolean selected = false;
+        	
+        try {
+            // InternalDataDSL.g:24847:1: ( ( ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) ) ) )
+            // InternalDataDSL.g:24848:3: ( ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) ) )
+            {
+            // InternalDataDSL.g:24848:3: ( ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) ) | ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) ) )
+            int alt210=2;
+            int LA210_0 = input.LA(1);
+
+            if ( LA210_0 == 166 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+                alt210=1;
+            }
+            else if ( LA210_0 == 167 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+                alt210=1;
+            }
+            else if ( LA210_0 == 168 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+                alt210=1;
+            }
+            else if ( LA210_0 >= 169 && LA210_0 <= 173 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {
+                alt210=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return ;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 210, 0, input);
+
+                throw nvae;
+            }
+            switch (alt210) {
+                case 1 :
+                    // InternalDataDSL.g:24849:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) )
+                    {
+                    // InternalDataDSL.g:24849:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) )
+                    // InternalDataDSL.g:24850:4: {...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0)");
+                    }
+                    // InternalDataDSL.g:24850:129: ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) )
+                    // InternalDataDSL.g:24851:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0);
+                    selected = true;
+                    // InternalDataDSL.g:24857:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) )
+                    // InternalDataDSL.g:24858:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0()); 
+                    }
+                    // InternalDataDSL.g:24859:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 )
+                    // InternalDataDSL.g:24859:7: rule__DataInterchangeFixedColumnMapping__Alternatives_5_0
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__Alternatives_5_0();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:24864:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) )
+                    {
+                    // InternalDataDSL.g:24864:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) ) )
+                    // InternalDataDSL.g:24865:4: {...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) )
+                    {
+                    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {
+                        if (state.backtracking>0) {state.failed=true; return ;}
+                        throw new FailedPredicateException(input, "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1)");
+                    }
+                    // InternalDataDSL.g:24865:129: ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) ) )
+                    // InternalDataDSL.g:24866:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) )
+                    {
+                    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1);
+                    selected = true;
+                    // InternalDataDSL.g:24872:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 ) )
+                    // InternalDataDSL.g:24873:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 )
+                    {
+                    if ( state.backtracking==0 ) {
+                       before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_1()); 
+                    }
+                    // InternalDataDSL.g:24874:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_1 )
+                    // InternalDataDSL.g:24874:7: rule__DataInterchangeFixedColumnMapping__Alternatives_5_1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__Alternatives_5_1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+
+                    if ( state.backtracking==0 ) {
+                       after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_1()); 
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	if (selected)
+            		getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0"
+    // InternalDataDSL.g:24887:1: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 : rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )? ;
+    public final void rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:24891:1: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )? )
+            // InternalDataDSL.g:24892:2: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )?
+            {
+            pushFollow(FOLLOW_177);
+            rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+            // InternalDataDSL.g:24893:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )?
+            int alt211=2;
+            alt211 = dfa211.predict(input);
+            switch (alt211) {
+                case 1 :
+                    // InternalDataDSL.g:0:0: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1
+                    {
+                    pushFollow(FOLLOW_2);
+                    rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1();
+
+                    state._fsp--;
+                    if (state.failed) return ;
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1"
+    // InternalDataDSL.g:24899:1: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 : rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl ;
+    public final void rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:24903:1: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl )
+            // InternalDataDSL.g:24904:2: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl
+            {
+            pushFollow(FOLLOW_2);
+            rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__Impl();
+
+            state._fsp--;
+            if (state.failed) return ;
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1"
 
 
     // $ANTLR start "rule__DataInterchangeModel__ImportSectionAssignment_0"
-    // InternalDataDSL.g:23686:1: rule__DataInterchangeModel__ImportSectionAssignment_0 : ( ruleXImportSection ) ;
+    // InternalDataDSL.g:24911:1: rule__DataInterchangeModel__ImportSectionAssignment_0 : ( ruleXImportSection ) ;
     public final void rule__DataInterchangeModel__ImportSectionAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23690:1: ( ( ruleXImportSection ) )
-            // InternalDataDSL.g:23691:2: ( ruleXImportSection )
+            // InternalDataDSL.g:24915:1: ( ( ruleXImportSection ) )
+            // InternalDataDSL.g:24916:2: ( ruleXImportSection )
             {
-            // InternalDataDSL.g:23691:2: ( ruleXImportSection )
-            // InternalDataDSL.g:23692:3: ruleXImportSection
+            // InternalDataDSL.g:24916:2: ( ruleXImportSection )
+            // InternalDataDSL.g:24917:3: ruleXImportSection
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeModelAccess().getImportSectionXImportSectionParserRuleCall_0_0()); 
@@ -78021,17 +82101,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeModel__PackagesAssignment_1"
-    // InternalDataDSL.g:23701:1: rule__DataInterchangeModel__PackagesAssignment_1 : ( ruleDataInterchangePackage ) ;
+    // InternalDataDSL.g:24926:1: rule__DataInterchangeModel__PackagesAssignment_1 : ( ruleDataInterchangePackage ) ;
     public final void rule__DataInterchangeModel__PackagesAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23705:1: ( ( ruleDataInterchangePackage ) )
-            // InternalDataDSL.g:23706:2: ( ruleDataInterchangePackage )
+            // InternalDataDSL.g:24930:1: ( ( ruleDataInterchangePackage ) )
+            // InternalDataDSL.g:24931:2: ( ruleDataInterchangePackage )
             {
-            // InternalDataDSL.g:23706:2: ( ruleDataInterchangePackage )
-            // InternalDataDSL.g:23707:3: ruleDataInterchangePackage
+            // InternalDataDSL.g:24931:2: ( ruleDataInterchangePackage )
+            // InternalDataDSL.g:24932:3: ruleDataInterchangePackage
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeModelAccess().getPackagesDataInterchangePackageParserRuleCall_1_0()); 
@@ -78066,17 +82146,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__NameAssignment_2"
-    // InternalDataDSL.g:23716:1: rule__DataInterchangePackage__NameAssignment_2 : ( ruleQualifiedName ) ;
+    // InternalDataDSL.g:24941:1: rule__DataInterchangePackage__NameAssignment_2 : ( ruleQualifiedName ) ;
     public final void rule__DataInterchangePackage__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23720:1: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:23721:2: ( ruleQualifiedName )
+            // InternalDataDSL.g:24945:1: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:24946:2: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:23721:2: ( ruleQualifiedName )
-            // InternalDataDSL.g:23722:3: ruleQualifiedName
+            // InternalDataDSL.g:24946:2: ( ruleQualifiedName )
+            // InternalDataDSL.g:24947:3: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getNameQualifiedNameParserRuleCall_2_0()); 
@@ -78111,17 +82191,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePackage__GroupsAssignment_3_1"
-    // InternalDataDSL.g:23731:1: rule__DataInterchangePackage__GroupsAssignment_3_1 : ( ruleDataInterchangeGroup ) ;
+    // InternalDataDSL.g:24956:1: rule__DataInterchangePackage__GroupsAssignment_3_1 : ( ruleDataInterchangeGroup ) ;
     public final void rule__DataInterchangePackage__GroupsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23735:1: ( ( ruleDataInterchangeGroup ) )
-            // InternalDataDSL.g:23736:2: ( ruleDataInterchangeGroup )
+            // InternalDataDSL.g:24960:1: ( ( ruleDataInterchangeGroup ) )
+            // InternalDataDSL.g:24961:2: ( ruleDataInterchangeGroup )
             {
-            // InternalDataDSL.g:23736:2: ( ruleDataInterchangeGroup )
-            // InternalDataDSL.g:23737:3: ruleDataInterchangeGroup
+            // InternalDataDSL.g:24961:2: ( ruleDataInterchangeGroup )
+            // InternalDataDSL.g:24962:3: ruleDataInterchangeGroup
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePackageAccess().getGroupsDataInterchangeGroupParserRuleCall_3_1_0()); 
@@ -78156,17 +82236,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__NameAssignment_2"
-    // InternalDataDSL.g:23746:1: rule__DataInterchangeGroup__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
+    // InternalDataDSL.g:24971:1: rule__DataInterchangeGroup__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
     public final void rule__DataInterchangeGroup__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23750:1: ( ( ruleTRANSLATABLEID ) )
-            // InternalDataDSL.g:23751:2: ( ruleTRANSLATABLEID )
+            // InternalDataDSL.g:24975:1: ( ( ruleTRANSLATABLEID ) )
+            // InternalDataDSL.g:24976:2: ( ruleTRANSLATABLEID )
             {
-            // InternalDataDSL.g:23751:2: ( ruleTRANSLATABLEID )
-            // InternalDataDSL.g:23752:3: ruleTRANSLATABLEID
+            // InternalDataDSL.g:24976:2: ( ruleTRANSLATABLEID )
+            // InternalDataDSL.g:24977:3: ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getNameTRANSLATABLEIDParserRuleCall_2_0()); 
@@ -78201,17 +82281,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeGroup__DatIntsAssignment_3_1"
-    // InternalDataDSL.g:23761:1: rule__DataInterchangeGroup__DatIntsAssignment_3_1 : ( ruleDataInterchange ) ;
+    // InternalDataDSL.g:24986:1: rule__DataInterchangeGroup__DatIntsAssignment_3_1 : ( ruleDataInterchange ) ;
     public final void rule__DataInterchangeGroup__DatIntsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23765:1: ( ( ruleDataInterchange ) )
-            // InternalDataDSL.g:23766:2: ( ruleDataInterchange )
+            // InternalDataDSL.g:24990:1: ( ( ruleDataInterchange ) )
+            // InternalDataDSL.g:24991:2: ( ruleDataInterchange )
             {
-            // InternalDataDSL.g:23766:2: ( ruleDataInterchange )
-            // InternalDataDSL.g:23767:3: ruleDataInterchange
+            // InternalDataDSL.g:24991:2: ( ruleDataInterchange )
+            // InternalDataDSL.g:24992:3: ruleDataInterchange
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeGroupAccess().getDatIntsDataInterchangeParserRuleCall_3_1_0()); 
@@ -78246,17 +82326,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__NameAssignment_2"
-    // InternalDataDSL.g:23776:1: rule__DataInterchange__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
+    // InternalDataDSL.g:25001:1: rule__DataInterchange__NameAssignment_2 : ( ruleTRANSLATABLEID ) ;
     public final void rule__DataInterchange__NameAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23780:1: ( ( ruleTRANSLATABLEID ) )
-            // InternalDataDSL.g:23781:2: ( ruleTRANSLATABLEID )
+            // InternalDataDSL.g:25005:1: ( ( ruleTRANSLATABLEID ) )
+            // InternalDataDSL.g:25006:2: ( ruleTRANSLATABLEID )
             {
-            // InternalDataDSL.g:23781:2: ( ruleTRANSLATABLEID )
-            // InternalDataDSL.g:23782:3: ruleTRANSLATABLEID
+            // InternalDataDSL.g:25006:2: ( ruleTRANSLATABLEID )
+            // InternalDataDSL.g:25007:3: ruleTRANSLATABLEID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getNameTRANSLATABLEIDParserRuleCall_2_0()); 
@@ -78291,28 +82371,28 @@
 
 
     // $ANTLR start "rule__DataInterchange__DescriptionAssignment_3_0"
-    // InternalDataDSL.g:23791:1: rule__DataInterchange__DescriptionAssignment_3_0 : ( ( 'describedBy' ) ) ;
+    // InternalDataDSL.g:25016:1: rule__DataInterchange__DescriptionAssignment_3_0 : ( ( 'describedBy' ) ) ;
     public final void rule__DataInterchange__DescriptionAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23795:1: ( ( ( 'describedBy' ) ) )
-            // InternalDataDSL.g:23796:2: ( ( 'describedBy' ) )
+            // InternalDataDSL.g:25020:1: ( ( ( 'describedBy' ) ) )
+            // InternalDataDSL.g:25021:2: ( ( 'describedBy' ) )
             {
-            // InternalDataDSL.g:23796:2: ( ( 'describedBy' ) )
-            // InternalDataDSL.g:23797:3: ( 'describedBy' )
+            // InternalDataDSL.g:25021:2: ( ( 'describedBy' ) )
+            // InternalDataDSL.g:25022:3: ( 'describedBy' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDescriptionDescribedByKeyword_3_0_0()); 
             }
-            // InternalDataDSL.g:23798:3: ( 'describedBy' )
-            // InternalDataDSL.g:23799:4: 'describedBy'
+            // InternalDataDSL.g:25023:3: ( 'describedBy' )
+            // InternalDataDSL.g:25024:4: 'describedBy'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDescriptionDescribedByKeyword_3_0_0()); 
             }
-            match(input,148,FOLLOW_2); if (state.failed) return ;
+            match(input,154,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeAccess().getDescriptionDescribedByKeyword_3_0_0()); 
             }
@@ -78344,17 +82424,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__DescriptionValueAssignment_3_1"
-    // InternalDataDSL.g:23810:1: rule__DataInterchange__DescriptionValueAssignment_3_1 : ( ruleTRANSLATABLESTRING ) ;
+    // InternalDataDSL.g:25035:1: rule__DataInterchange__DescriptionValueAssignment_3_1 : ( ruleTRANSLATABLESTRING ) ;
     public final void rule__DataInterchange__DescriptionValueAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23814:1: ( ( ruleTRANSLATABLESTRING ) )
-            // InternalDataDSL.g:23815:2: ( ruleTRANSLATABLESTRING )
+            // InternalDataDSL.g:25039:1: ( ( ruleTRANSLATABLESTRING ) )
+            // InternalDataDSL.g:25040:2: ( ruleTRANSLATABLESTRING )
             {
-            // InternalDataDSL.g:23815:2: ( ruleTRANSLATABLESTRING )
-            // InternalDataDSL.g:23816:3: ruleTRANSLATABLESTRING
+            // InternalDataDSL.g:25040:2: ( ruleTRANSLATABLESTRING )
+            // InternalDataDSL.g:25041:3: ruleTRANSLATABLESTRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDescriptionValueTRANSLATABLESTRINGParserRuleCall_3_1_0()); 
@@ -78389,17 +82469,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__ModeAssignment_4"
-    // InternalDataDSL.g:23825:1: rule__DataInterchange__ModeAssignment_4 : ( ruleEntityManagerMode ) ;
+    // InternalDataDSL.g:25050:1: rule__DataInterchange__ModeAssignment_4 : ( ruleEntityManagerMode ) ;
     public final void rule__DataInterchange__ModeAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23829:1: ( ( ruleEntityManagerMode ) )
-            // InternalDataDSL.g:23830:2: ( ruleEntityManagerMode )
+            // InternalDataDSL.g:25054:1: ( ( ruleEntityManagerMode ) )
+            // InternalDataDSL.g:25055:2: ( ruleEntityManagerMode )
             {
-            // InternalDataDSL.g:23830:2: ( ruleEntityManagerMode )
-            // InternalDataDSL.g:23831:3: ruleEntityManagerMode
+            // InternalDataDSL.g:25055:2: ( ruleEntityManagerMode )
+            // InternalDataDSL.g:25056:3: ruleEntityManagerMode
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getModeEntityManagerModeEnumRuleCall_4_0()); 
@@ -78434,28 +82514,28 @@
 
 
     // $ANTLR start "rule__DataInterchange__HasVectorNameAssignment_5_0"
-    // InternalDataDSL.g:23840:1: rule__DataInterchange__HasVectorNameAssignment_5_0 : ( ( 'vectorName' ) ) ;
+    // InternalDataDSL.g:25065:1: rule__DataInterchange__HasVectorNameAssignment_5_0 : ( ( 'vectorName' ) ) ;
     public final void rule__DataInterchange__HasVectorNameAssignment_5_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23844:1: ( ( ( 'vectorName' ) ) )
-            // InternalDataDSL.g:23845:2: ( ( 'vectorName' ) )
+            // InternalDataDSL.g:25069:1: ( ( ( 'vectorName' ) ) )
+            // InternalDataDSL.g:25070:2: ( ( 'vectorName' ) )
             {
-            // InternalDataDSL.g:23845:2: ( ( 'vectorName' ) )
-            // InternalDataDSL.g:23846:3: ( 'vectorName' )
+            // InternalDataDSL.g:25070:2: ( ( 'vectorName' ) )
+            // InternalDataDSL.g:25071:3: ( 'vectorName' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getHasVectorNameVectorNameKeyword_5_0_0()); 
             }
-            // InternalDataDSL.g:23847:3: ( 'vectorName' )
-            // InternalDataDSL.g:23848:4: 'vectorName'
+            // InternalDataDSL.g:25072:3: ( 'vectorName' )
+            // InternalDataDSL.g:25073:4: 'vectorName'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getHasVectorNameVectorNameKeyword_5_0_0()); 
             }
-            match(input,149,FOLLOW_2); if (state.failed) return ;
+            match(input,155,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeAccess().getHasVectorNameVectorNameKeyword_5_0_0()); 
             }
@@ -78487,17 +82567,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__VectorNameAssignment_5_1"
-    // InternalDataDSL.g:23859:1: rule__DataInterchange__VectorNameAssignment_5_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25084:1: rule__DataInterchange__VectorNameAssignment_5_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchange__VectorNameAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23863:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:23864:2: ( RULE_STRING )
+            // InternalDataDSL.g:25088:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25089:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:23864:2: ( RULE_STRING )
-            // InternalDataDSL.g:23865:3: RULE_STRING
+            // InternalDataDSL.g:25089:2: ( RULE_STRING )
+            // InternalDataDSL.g:25090:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getVectorNameSTRINGTerminalRuleCall_5_1_0()); 
@@ -78528,28 +82608,28 @@
 
 
     // $ANTLR start "rule__DataInterchange__CreateReportAssignment_6"
-    // InternalDataDSL.g:23874:1: rule__DataInterchange__CreateReportAssignment_6 : ( ( 'report' ) ) ;
+    // InternalDataDSL.g:25099:1: rule__DataInterchange__CreateReportAssignment_6 : ( ( 'report' ) ) ;
     public final void rule__DataInterchange__CreateReportAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23878:1: ( ( ( 'report' ) ) )
-            // InternalDataDSL.g:23879:2: ( ( 'report' ) )
+            // InternalDataDSL.g:25103:1: ( ( ( 'report' ) ) )
+            // InternalDataDSL.g:25104:2: ( ( 'report' ) )
             {
-            // InternalDataDSL.g:23879:2: ( ( 'report' ) )
-            // InternalDataDSL.g:23880:3: ( 'report' )
+            // InternalDataDSL.g:25104:2: ( ( 'report' ) )
+            // InternalDataDSL.g:25105:3: ( 'report' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getCreateReportReportKeyword_6_0()); 
             }
-            // InternalDataDSL.g:23881:3: ( 'report' )
-            // InternalDataDSL.g:23882:4: 'report'
+            // InternalDataDSL.g:25106:3: ( 'report' )
+            // InternalDataDSL.g:25107:4: 'report'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getCreateReportReportKeyword_6_0()); 
             }
-            match(input,150,FOLLOW_2); if (state.failed) return ;
+            match(input,156,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeAccess().getCreateReportReportKeyword_6_0()); 
             }
@@ -78581,17 +82661,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__ElementSizeAssignment_7_1"
-    // InternalDataDSL.g:23893:1: rule__DataInterchange__ElementSizeAssignment_7_1 : ( RULE_INT ) ;
+    // InternalDataDSL.g:25118:1: rule__DataInterchange__ElementSizeAssignment_7_1 : ( RULE_INT ) ;
     public final void rule__DataInterchange__ElementSizeAssignment_7_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23897:1: ( ( RULE_INT ) )
-            // InternalDataDSL.g:23898:2: ( RULE_INT )
+            // InternalDataDSL.g:25122:1: ( ( RULE_INT ) )
+            // InternalDataDSL.g:25123:2: ( RULE_INT )
             {
-            // InternalDataDSL.g:23898:2: ( RULE_INT )
-            // InternalDataDSL.g:23899:3: RULE_INT
+            // InternalDataDSL.g:25123:2: ( RULE_INT )
+            // InternalDataDSL.g:25124:3: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getElementSizeINTTerminalRuleCall_7_1_0()); 
@@ -78622,28 +82702,28 @@
 
 
     // $ANTLR start "rule__DataInterchange__DeleteFileAfterImportAssignment_8"
-    // InternalDataDSL.g:23908:1: rule__DataInterchange__DeleteFileAfterImportAssignment_8 : ( ( 'deleteFileAfterImport' ) ) ;
+    // InternalDataDSL.g:25133:1: rule__DataInterchange__DeleteFileAfterImportAssignment_8 : ( ( 'deleteFileAfterImport' ) ) ;
     public final void rule__DataInterchange__DeleteFileAfterImportAssignment_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23912:1: ( ( ( 'deleteFileAfterImport' ) ) )
-            // InternalDataDSL.g:23913:2: ( ( 'deleteFileAfterImport' ) )
+            // InternalDataDSL.g:25137:1: ( ( ( 'deleteFileAfterImport' ) ) )
+            // InternalDataDSL.g:25138:2: ( ( 'deleteFileAfterImport' ) )
             {
-            // InternalDataDSL.g:23913:2: ( ( 'deleteFileAfterImport' ) )
-            // InternalDataDSL.g:23914:3: ( 'deleteFileAfterImport' )
+            // InternalDataDSL.g:25138:2: ( ( 'deleteFileAfterImport' ) )
+            // InternalDataDSL.g:25139:3: ( 'deleteFileAfterImport' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDeleteFileAfterImportDeleteFileAfterImportKeyword_8_0()); 
             }
-            // InternalDataDSL.g:23915:3: ( 'deleteFileAfterImport' )
-            // InternalDataDSL.g:23916:4: 'deleteFileAfterImport'
+            // InternalDataDSL.g:25140:3: ( 'deleteFileAfterImport' )
+            // InternalDataDSL.g:25141:4: 'deleteFileAfterImport'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getDeleteFileAfterImportDeleteFileAfterImportKeyword_8_0()); 
             }
-            match(input,151,FOLLOW_2); if (state.failed) return ;
+            match(input,157,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeAccess().getDeleteFileAfterImportDeleteFileAfterImportKeyword_8_0()); 
             }
@@ -78675,17 +82755,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__FileEndpointAssignment_10"
-    // InternalDataDSL.g:23927:1: rule__DataInterchange__FileEndpointAssignment_10 : ( ruleDataInterchangeFile ) ;
+    // InternalDataDSL.g:25152:1: rule__DataInterchange__FileEndpointAssignment_10 : ( ruleDataInterchangeFile ) ;
     public final void rule__DataInterchange__FileEndpointAssignment_10() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23931:1: ( ( ruleDataInterchangeFile ) )
-            // InternalDataDSL.g:23932:2: ( ruleDataInterchangeFile )
+            // InternalDataDSL.g:25156:1: ( ( ruleDataInterchangeFile ) )
+            // InternalDataDSL.g:25157:2: ( ruleDataInterchangeFile )
             {
-            // InternalDataDSL.g:23932:2: ( ruleDataInterchangeFile )
-            // InternalDataDSL.g:23933:3: ruleDataInterchangeFile
+            // InternalDataDSL.g:25157:2: ( ruleDataInterchangeFile )
+            // InternalDataDSL.g:25158:3: ruleDataInterchangeFile
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getFileEndpointDataInterchangeFileParserRuleCall_10_0()); 
@@ -78720,17 +82800,17 @@
 
 
     // $ANTLR start "rule__DataInterchange__PathAssignment_13"
-    // InternalDataDSL.g:23942:1: rule__DataInterchange__PathAssignment_13 : ( ruleDataInterchangeBean ) ;
+    // InternalDataDSL.g:25167:1: rule__DataInterchange__PathAssignment_13 : ( ruleDataInterchangeBean ) ;
     public final void rule__DataInterchange__PathAssignment_13() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23946:1: ( ( ruleDataInterchangeBean ) )
-            // InternalDataDSL.g:23947:2: ( ruleDataInterchangeBean )
+            // InternalDataDSL.g:25171:1: ( ( ruleDataInterchangeBean ) )
+            // InternalDataDSL.g:25172:2: ( ruleDataInterchangeBean )
             {
-            // InternalDataDSL.g:23947:2: ( ruleDataInterchangeBean )
-            // InternalDataDSL.g:23948:3: ruleDataInterchangeBean
+            // InternalDataDSL.g:25172:2: ( ruleDataInterchangeBean )
+            // InternalDataDSL.g:25173:3: ruleDataInterchangeBean
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeAccess().getPathDataInterchangeBeanParserRuleCall_13_0()); 
@@ -78765,17 +82845,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__FileURLAssignment_2"
-    // InternalDataDSL.g:23957:1: rule__DataInterchangeFileXML__FileURLAssignment_2 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25182:1: rule__DataInterchangeFileXML__FileURLAssignment_2 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileXML__FileURLAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23961:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:23962:2: ( RULE_STRING )
+            // InternalDataDSL.g:25186:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25187:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:23962:2: ( RULE_STRING )
-            // InternalDataDSL.g:23963:3: RULE_STRING
+            // InternalDataDSL.g:25187:2: ( RULE_STRING )
+            // InternalDataDSL.g:25188:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getFileURLSTRINGTerminalRuleCall_2_0()); 
@@ -78806,28 +82886,28 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__ByAttributeAssignment_3_0"
-    // InternalDataDSL.g:23972:1: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 : ( ( 'mapByAttribute' ) ) ;
+    // InternalDataDSL.g:25197:1: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 : ( ( 'mapByAttribute' ) ) ;
     public final void rule__DataInterchangeFileXML__ByAttributeAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23976:1: ( ( ( 'mapByAttribute' ) ) )
-            // InternalDataDSL.g:23977:2: ( ( 'mapByAttribute' ) )
+            // InternalDataDSL.g:25201:1: ( ( ( 'mapByAttribute' ) ) )
+            // InternalDataDSL.g:25202:2: ( ( 'mapByAttribute' ) )
             {
-            // InternalDataDSL.g:23977:2: ( ( 'mapByAttribute' ) )
-            // InternalDataDSL.g:23978:3: ( 'mapByAttribute' )
+            // InternalDataDSL.g:25202:2: ( ( 'mapByAttribute' ) )
+            // InternalDataDSL.g:25203:3: ( 'mapByAttribute' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getByAttributeMapByAttributeKeyword_3_0_0()); 
             }
-            // InternalDataDSL.g:23979:3: ( 'mapByAttribute' )
-            // InternalDataDSL.g:23980:4: 'mapByAttribute'
+            // InternalDataDSL.g:25204:3: ( 'mapByAttribute' )
+            // InternalDataDSL.g:25205:4: 'mapByAttribute'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getByAttributeMapByAttributeKeyword_3_0_0()); 
             }
-            match(input,152,FOLLOW_2); if (state.failed) return ;
+            match(input,158,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeFileXMLAccess().getByAttributeMapByAttributeKeyword_3_0_0()); 
             }
@@ -78859,17 +82939,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__EncodingAssignment_3_1_1"
-    // InternalDataDSL.g:23991:1: rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25216:1: rule__DataInterchangeFileXML__EncodingAssignment_3_1_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileXML__EncodingAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:23995:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:23996:2: ( RULE_STRING )
+            // InternalDataDSL.g:25220:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25221:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:23996:2: ( RULE_STRING )
-            // InternalDataDSL.g:23997:3: RULE_STRING
+            // InternalDataDSL.g:25221:2: ( RULE_STRING )
+            // InternalDataDSL.g:25222:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getEncodingSTRINGTerminalRuleCall_3_1_1_0()); 
@@ -78900,17 +82980,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileXML__LocaleAssignment_3_2_1"
-    // InternalDataDSL.g:24006:1: rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25231:1: rule__DataInterchangeFileXML__LocaleAssignment_3_2_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileXML__LocaleAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24010:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24011:2: ( RULE_STRING )
+            // InternalDataDSL.g:25235:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25236:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24011:2: ( RULE_STRING )
-            // InternalDataDSL.g:24012:3: RULE_STRING
+            // InternalDataDSL.g:25236:2: ( RULE_STRING )
+            // InternalDataDSL.g:25237:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileXMLAccess().getLocaleSTRINGTerminalRuleCall_3_2_1_0()); 
@@ -78941,17 +83021,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__FileURLAssignment_2"
-    // InternalDataDSL.g:24021:1: rule__DataInterchangeFileCSV__FileURLAssignment_2 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25246:1: rule__DataInterchangeFileCSV__FileURLAssignment_2 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileCSV__FileURLAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24025:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24026:2: ( RULE_STRING )
+            // InternalDataDSL.g:25250:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25251:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24026:2: ( RULE_STRING )
-            // InternalDataDSL.g:24027:3: RULE_STRING
+            // InternalDataDSL.g:25251:2: ( RULE_STRING )
+            // InternalDataDSL.g:25252:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getFileURLSTRINGTerminalRuleCall_2_0()); 
@@ -78982,17 +83062,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1"
-    // InternalDataDSL.g:24036:1: rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25261:1: rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileCSV__DelimiterAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24040:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24041:2: ( RULE_STRING )
+            // InternalDataDSL.g:25265:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25266:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24041:2: ( RULE_STRING )
-            // InternalDataDSL.g:24042:3: RULE_STRING
+            // InternalDataDSL.g:25266:2: ( RULE_STRING )
+            // InternalDataDSL.g:25267:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getDelimiterSTRINGTerminalRuleCall_3_0_1_0()); 
@@ -79023,17 +83103,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1"
-    // InternalDataDSL.g:24051:1: rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25276:1: rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileCSV__QuoteCharacterAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24055:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24056:2: ( RULE_STRING )
+            // InternalDataDSL.g:25280:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25281:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24056:2: ( RULE_STRING )
-            // InternalDataDSL.g:24057:3: RULE_STRING
+            // InternalDataDSL.g:25281:2: ( RULE_STRING )
+            // InternalDataDSL.g:25282:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getQuoteCharacterSTRINGTerminalRuleCall_3_1_1_0()); 
@@ -79064,17 +83144,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1"
-    // InternalDataDSL.g:24066:1: rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 : ( RULE_INT ) ;
+    // InternalDataDSL.g:25291:1: rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1 : ( RULE_INT ) ;
     public final void rule__DataInterchangeFileCSV__SkipLinesAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24070:1: ( ( RULE_INT ) )
-            // InternalDataDSL.g:24071:2: ( RULE_INT )
+            // InternalDataDSL.g:25295:1: ( ( RULE_INT ) )
+            // InternalDataDSL.g:25296:2: ( RULE_INT )
             {
-            // InternalDataDSL.g:24071:2: ( RULE_INT )
-            // InternalDataDSL.g:24072:3: RULE_INT
+            // InternalDataDSL.g:25296:2: ( RULE_INT )
+            // InternalDataDSL.g:25297:3: RULE_INT
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getSkipLinesINTTerminalRuleCall_3_2_1_0()); 
@@ -79105,28 +83185,28 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__IndentAssignment_3_3"
-    // InternalDataDSL.g:24081:1: rule__DataInterchangeFileCSV__IndentAssignment_3_3 : ( ( 'indent' ) ) ;
+    // InternalDataDSL.g:25306:1: rule__DataInterchangeFileCSV__IndentAssignment_3_3 : ( ( 'indent' ) ) ;
     public final void rule__DataInterchangeFileCSV__IndentAssignment_3_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24085:1: ( ( ( 'indent' ) ) )
-            // InternalDataDSL.g:24086:2: ( ( 'indent' ) )
+            // InternalDataDSL.g:25310:1: ( ( ( 'indent' ) ) )
+            // InternalDataDSL.g:25311:2: ( ( 'indent' ) )
             {
-            // InternalDataDSL.g:24086:2: ( ( 'indent' ) )
-            // InternalDataDSL.g:24087:3: ( 'indent' )
+            // InternalDataDSL.g:25311:2: ( ( 'indent' ) )
+            // InternalDataDSL.g:25312:3: ( 'indent' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getIndentIndentKeyword_3_3_0()); 
             }
-            // InternalDataDSL.g:24088:3: ( 'indent' )
-            // InternalDataDSL.g:24089:4: 'indent'
+            // InternalDataDSL.g:25313:3: ( 'indent' )
+            // InternalDataDSL.g:25314:4: 'indent'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getIndentIndentKeyword_3_3_0()); 
             }
-            match(input,153,FOLLOW_2); if (state.failed) return ;
+            match(input,159,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeFileCSVAccess().getIndentIndentKeyword_3_3_0()); 
             }
@@ -79158,17 +83238,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1"
-    // InternalDataDSL.g:24100:1: rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25325:1: rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileCSV__EncodingAssignment_3_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24104:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24105:2: ( RULE_STRING )
+            // InternalDataDSL.g:25329:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25330:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24105:2: ( RULE_STRING )
-            // InternalDataDSL.g:24106:3: RULE_STRING
+            // InternalDataDSL.g:25330:2: ( RULE_STRING )
+            // InternalDataDSL.g:25331:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getEncodingSTRINGTerminalRuleCall_3_4_1_0()); 
@@ -79199,17 +83279,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1"
-    // InternalDataDSL.g:24115:1: rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25340:1: rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileCSV__LocaleAssignment_3_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24119:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24120:2: ( RULE_STRING )
+            // InternalDataDSL.g:25344:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25345:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24120:2: ( RULE_STRING )
-            // InternalDataDSL.g:24121:3: RULE_STRING
+            // InternalDataDSL.g:25345:2: ( RULE_STRING )
+            // InternalDataDSL.g:25346:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileCSVAccess().getLocaleSTRINGTerminalRuleCall_3_5_1_0()); 
@@ -79240,17 +83320,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__FileURLAssignment_2"
-    // InternalDataDSL.g:24130:1: rule__DataInterchangeFileEDI__FileURLAssignment_2 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25355:1: rule__DataInterchangeFileEDI__FileURLAssignment_2 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileEDI__FileURLAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24134:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24135:2: ( RULE_STRING )
+            // InternalDataDSL.g:25359:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25360:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24135:2: ( RULE_STRING )
-            // InternalDataDSL.g:24136:3: RULE_STRING
+            // InternalDataDSL.g:25360:2: ( RULE_STRING )
+            // InternalDataDSL.g:25361:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getFileURLSTRINGTerminalRuleCall_2_0()); 
@@ -79281,17 +83361,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1"
-    // InternalDataDSL.g:24145:1: rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25370:1: rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileEDI__EncodingAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24149:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24150:2: ( RULE_STRING )
+            // InternalDataDSL.g:25374:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25375:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24150:2: ( RULE_STRING )
-            // InternalDataDSL.g:24151:3: RULE_STRING
+            // InternalDataDSL.g:25375:2: ( RULE_STRING )
+            // InternalDataDSL.g:25376:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0()); 
@@ -79322,17 +83402,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1"
-    // InternalDataDSL.g:24160:1: rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25385:1: rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileEDI__LocaleAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24164:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24165:2: ( RULE_STRING )
+            // InternalDataDSL.g:25389:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25390:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24165:2: ( RULE_STRING )
-            // InternalDataDSL.g:24166:3: RULE_STRING
+            // InternalDataDSL.g:25390:2: ( RULE_STRING )
+            // InternalDataDSL.g:25391:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0()); 
@@ -79363,17 +83443,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__MappingModelAssignment_5"
-    // InternalDataDSL.g:24175:1: rule__DataInterchangeFileEDI__MappingModelAssignment_5 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:25400:1: rule__DataInterchangeFileEDI__MappingModelAssignment_5 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFileEDI__MappingModelAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24179:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24180:2: ( RULE_STRING )
+            // InternalDataDSL.g:25404:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25405:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24180:2: ( RULE_STRING )
-            // InternalDataDSL.g:24181:3: RULE_STRING
+            // InternalDataDSL.g:25405:2: ( RULE_STRING )
+            // InternalDataDSL.g:25406:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getMappingModelSTRINGTerminalRuleCall_5_0()); 
@@ -79404,28 +83484,28 @@
 
 
     // $ANTLR start "rule__DataInterchangeFileEDI__ValidateAssignment_6"
-    // InternalDataDSL.g:24190:1: rule__DataInterchangeFileEDI__ValidateAssignment_6 : ( ( 'validate' ) ) ;
+    // InternalDataDSL.g:25415:1: rule__DataInterchangeFileEDI__ValidateAssignment_6 : ( ( 'validate' ) ) ;
     public final void rule__DataInterchangeFileEDI__ValidateAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24194:1: ( ( ( 'validate' ) ) )
-            // InternalDataDSL.g:24195:2: ( ( 'validate' ) )
+            // InternalDataDSL.g:25419:1: ( ( ( 'validate' ) ) )
+            // InternalDataDSL.g:25420:2: ( ( 'validate' ) )
             {
-            // InternalDataDSL.g:24195:2: ( ( 'validate' ) )
-            // InternalDataDSL.g:24196:3: ( 'validate' )
+            // InternalDataDSL.g:25420:2: ( ( 'validate' ) )
+            // InternalDataDSL.g:25421:3: ( 'validate' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getValidateValidateKeyword_6_0()); 
             }
-            // InternalDataDSL.g:24197:3: ( 'validate' )
-            // InternalDataDSL.g:24198:4: 'validate'
+            // InternalDataDSL.g:25422:3: ( 'validate' )
+            // InternalDataDSL.g:25423:4: 'validate'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFileEDIAccess().getValidateValidateKeyword_6_0()); 
             }
-            match(input,154,FOLLOW_2); if (state.failed) return ;
+            match(input,160,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeFileEDIAccess().getValidateValidateKeyword_6_0()); 
             }
@@ -79456,24 +83536,147 @@
     // $ANTLR end "rule__DataInterchangeFileEDI__ValidateAssignment_6"
 
 
+    // $ANTLR start "rule__DataInterchangeFileFixed__FileURLAssignment_2"
+    // InternalDataDSL.g:25434:1: rule__DataInterchangeFileFixed__FileURLAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeFileFixed__FileURLAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25438:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25439:2: ( RULE_STRING )
+            {
+            // InternalDataDSL.g:25439:2: ( RULE_STRING )
+            // InternalDataDSL.g:25440:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__FileURLAssignment_2"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1"
+    // InternalDataDSL.g:25449:1: rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25453:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25454:2: ( RULE_STRING )
+            {
+            // InternalDataDSL.g:25454:2: ( RULE_STRING )
+            // InternalDataDSL.g:25455:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__EncodingAssignment_3_0_1"
+
+
+    // $ANTLR start "rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1"
+    // InternalDataDSL.g:25464:1: rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25468:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25469:2: ( RULE_STRING )
+            {
+            // InternalDataDSL.g:25469:2: ( RULE_STRING )
+            // InternalDataDSL.g:25470:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFileFixed__LocaleAssignment_3_1_1"
+
+
     // $ANTLR start "rule__DataInterchangeBean__EntityAssignment_2"
-    // InternalDataDSL.g:24209:1: rule__DataInterchangeBean__EntityAssignment_2 : ( ( ruleLFQN ) ) ;
+    // InternalDataDSL.g:25479:1: rule__DataInterchangeBean__EntityAssignment_2 : ( ( ruleLFQN ) ) ;
     public final void rule__DataInterchangeBean__EntityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24213:1: ( ( ( ruleLFQN ) ) )
-            // InternalDataDSL.g:24214:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:25483:1: ( ( ( ruleLFQN ) ) )
+            // InternalDataDSL.g:25484:2: ( ( ruleLFQN ) )
             {
-            // InternalDataDSL.g:24214:2: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:24215:3: ( ruleLFQN )
+            // InternalDataDSL.g:25484:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:25485:3: ( ruleLFQN )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getEntityLEntityCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24216:3: ( ruleLFQN )
-            // InternalDataDSL.g:24217:4: ruleLFQN
+            // InternalDataDSL.g:25486:3: ( ruleLFQN )
+            // InternalDataDSL.g:25487:4: ruleLFQN
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBeanAccess().getEntityLEntityLFQNParserRuleCall_2_0_1()); 
@@ -79513,172 +83716,37 @@
     // $ANTLR end "rule__DataInterchangeBean__EntityAssignment_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__NodeNameAssignment_3_1"
-    // InternalDataDSL.g:24228:1: rule__DataInterchangeBean__NodeNameAssignment_3_1 : ( RULE_STRING ) ;
-    public final void rule__DataInterchangeBean__NodeNameAssignment_3_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__RefDataSourceAssignment_3_1"
+    // InternalDataDSL.g:25498:1: rule__DataInterchangeBean__RefDataSourceAssignment_3_1 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeBean__RefDataSourceAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24232:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24233:2: ( RULE_STRING )
+            // InternalDataDSL.g:25502:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25503:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24233:2: ( RULE_STRING )
-            // InternalDataDSL.g:24234:3: RULE_STRING
+            // InternalDataDSL.g:25503:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25504:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0()); 
             }
-            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__NodeNameAssignment_3_1"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__ElementMapAssignment_4_1"
-    // InternalDataDSL.g:24243:1: rule__DataInterchangeBean__ElementMapAssignment_4_1 : ( RULE_STRING ) ;
-    public final void rule__DataInterchangeBean__ElementMapAssignment_4_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24247:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24248:2: ( RULE_STRING )
-            {
-            // InternalDataDSL.g:24248:2: ( RULE_STRING )
-            // InternalDataDSL.g:24249:3: RULE_STRING
+            // InternalDataDSL.g:25505:3: ( RULE_ID )
+            // InternalDataDSL.g:25506:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0()); 
-            }
-            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__ElementMapAssignment_4_1"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__MarkLatestImportAssignment_5_0"
-    // InternalDataDSL.g:24258:1: rule__DataInterchangeBean__MarkLatestImportAssignment_5_0 : ( ( 'latestImport' ) ) ;
-    public final void rule__DataInterchangeBean__MarkLatestImportAssignment_5_0() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24262:1: ( ( ( 'latestImport' ) ) )
-            // InternalDataDSL.g:24263:2: ( ( 'latestImport' ) )
-            {
-            // InternalDataDSL.g:24263:2: ( ( 'latestImport' ) )
-            // InternalDataDSL.g:24264:3: ( 'latestImport' )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); 
-            }
-            // InternalDataDSL.g:24265:3: ( 'latestImport' )
-            // InternalDataDSL.g:24266:4: 'latestImport'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); 
-            }
-            match(input,155,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); 
-            }
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeBean__MarkLatestImportAssignment_5_0"
-
-
-    // $ANTLR start "rule__DataInterchangeBean__LatestPropertyAssignment_5_1"
-    // InternalDataDSL.g:24277:1: rule__DataInterchangeBean__LatestPropertyAssignment_5_1 : ( ( RULE_ID ) ) ;
-    public final void rule__DataInterchangeBean__LatestPropertyAssignment_5_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24281:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24282:2: ( ( RULE_ID ) )
-            {
-            // InternalDataDSL.g:24282:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24283:3: ( RULE_ID )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0()); 
-            }
-            // InternalDataDSL.g:24284:3: ( RULE_ID )
-            // InternalDataDSL.g:24285:4: RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1()); 
             }
             match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1()); 
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0()); 
             }
 
             }
@@ -79698,40 +83766,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__LatestPropertyAssignment_5_1"
+    // $ANTLR end "rule__DataInterchangeBean__RefDataSourceAssignment_3_1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__MarkLatestExportAssignment_6_0"
-    // InternalDataDSL.g:24296:1: rule__DataInterchangeBean__MarkLatestExportAssignment_6_0 : ( ( 'latestExport' ) ) ;
-    public final void rule__DataInterchangeBean__MarkLatestExportAssignment_6_0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__NodeNameAssignment_4_1"
+    // InternalDataDSL.g:25517:1: rule__DataInterchangeBean__NodeNameAssignment_4_1 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeBean__NodeNameAssignment_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24300:1: ( ( ( 'latestExport' ) ) )
-            // InternalDataDSL.g:24301:2: ( ( 'latestExport' ) )
+            // InternalDataDSL.g:25521:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25522:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24301:2: ( ( 'latestExport' ) )
-            // InternalDataDSL.g:24302:3: ( 'latestExport' )
+            // InternalDataDSL.g:25522:2: ( RULE_STRING )
+            // InternalDataDSL.g:25523:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0()); 
             }
-            // InternalDataDSL.g:24303:3: ( 'latestExport' )
-            // InternalDataDSL.g:24304:4: 'latestExport'
-            {
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); 
-            }
-            match(input,156,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); 
-            }
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0()); 
             }
 
             }
@@ -79751,40 +83807,134 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__MarkLatestExportAssignment_6_0"
+    // $ANTLR end "rule__DataInterchangeBean__NodeNameAssignment_4_1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1"
-    // InternalDataDSL.g:24315:1: rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1 : ( ( RULE_ID ) ) ;
-    public final void rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__ElementMapAssignment_5_1"
+    // InternalDataDSL.g:25532:1: rule__DataInterchangeBean__ElementMapAssignment_5_1 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeBean__ElementMapAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24319:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24320:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25536:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25537:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24320:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24321:3: ( RULE_ID )
+            // InternalDataDSL.g:25537:2: ( RULE_STRING )
+            // InternalDataDSL.g:25538:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); 
             }
-            // InternalDataDSL.g:24322:3: ( RULE_ID )
-            // InternalDataDSL.g:24323:4: RULE_ID
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__ElementMapAssignment_5_1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__MarkLatestImportAssignment_6_0"
+    // InternalDataDSL.g:25547:1: rule__DataInterchangeBean__MarkLatestImportAssignment_6_0 : ( ( 'latestImport' ) ) ;
+    public final void rule__DataInterchangeBean__MarkLatestImportAssignment_6_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25551:1: ( ( ( 'latestImport' ) ) )
+            // InternalDataDSL.g:25552:2: ( ( 'latestImport' ) )
+            {
+            // InternalDataDSL.g:25552:2: ( ( 'latestImport' ) )
+            // InternalDataDSL.g:25553:3: ( 'latestImport' )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); 
+            }
+            // InternalDataDSL.g:25554:3: ( 'latestImport' )
+            // InternalDataDSL.g:25555:4: 'latestImport'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); 
+            }
+            match(input,161,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__MarkLatestImportAssignment_6_0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__LatestPropertyAssignment_6_1"
+    // InternalDataDSL.g:25566:1: rule__DataInterchangeBean__LatestPropertyAssignment_6_1 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeBean__LatestPropertyAssignment_6_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25570:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25571:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:25571:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25572:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0()); 
+            }
+            // InternalDataDSL.g:25573:3: ( RULE_ID )
+            // InternalDataDSL.g:25574:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); 
             }
             match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1()); 
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0()); 
             }
 
             }
@@ -79804,24 +83954,130 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__LatestExpPropertyAssignment_6_1"
+    // $ANTLR end "rule__DataInterchangeBean__LatestPropertyAssignment_6_1"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__ExpressionAssignment_7_2"
-    // InternalDataDSL.g:24334:1: rule__DataInterchangeBean__ExpressionAssignment_7_2 : ( ruleDataInterchangeExpression ) ;
-    public final void rule__DataInterchangeBean__ExpressionAssignment_7_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__MarkLatestExportAssignment_7_0"
+    // InternalDataDSL.g:25585:1: rule__DataInterchangeBean__MarkLatestExportAssignment_7_0 : ( ( 'latestExport' ) ) ;
+    public final void rule__DataInterchangeBean__MarkLatestExportAssignment_7_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24338:1: ( ( ruleDataInterchangeExpression ) )
-            // InternalDataDSL.g:24339:2: ( ruleDataInterchangeExpression )
+            // InternalDataDSL.g:25589:1: ( ( ( 'latestExport' ) ) )
+            // InternalDataDSL.g:25590:2: ( ( 'latestExport' ) )
             {
-            // InternalDataDSL.g:24339:2: ( ruleDataInterchangeExpression )
-            // InternalDataDSL.g:24340:3: ruleDataInterchangeExpression
+            // InternalDataDSL.g:25590:2: ( ( 'latestExport' ) )
+            // InternalDataDSL.g:25591:3: ( 'latestExport' )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); 
+            }
+            // InternalDataDSL.g:25592:3: ( 'latestExport' )
+            // InternalDataDSL.g:25593:4: 'latestExport'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); 
+            }
+            match(input,162,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__MarkLatestExportAssignment_7_0"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1"
+    // InternalDataDSL.g:25604:1: rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25608:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25609:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:25609:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25610:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0()); 
+            }
+            // InternalDataDSL.g:25611:3: ( RULE_ID )
+            // InternalDataDSL.g:25612:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeBean__LatestExpPropertyAssignment_7_1"
+
+
+    // $ANTLR start "rule__DataInterchangeBean__ExpressionAssignment_8_0_2"
+    // InternalDataDSL.g:25623:1: rule__DataInterchangeBean__ExpressionAssignment_8_0_2 : ( ruleDataInterchangeExpression ) ;
+    public final void rule__DataInterchangeBean__ExpressionAssignment_8_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25627:1: ( ( ruleDataInterchangeExpression ) )
+            // InternalDataDSL.g:25628:2: ( ruleDataInterchangeExpression )
+            {
+            // InternalDataDSL.g:25628:2: ( ruleDataInterchangeExpression )
+            // InternalDataDSL.g:25629:3: ruleDataInterchangeExpression
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeExpression();
@@ -79829,7 +84085,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0()); 
             }
 
             }
@@ -79849,24 +84105,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__ExpressionAssignment_7_2"
+    // $ANTLR end "rule__DataInterchangeBean__ExpressionAssignment_8_0_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__LookupAssignment_8_2"
-    // InternalDataDSL.g:24349:1: rule__DataInterchangeBean__LookupAssignment_8_2 : ( ruleDataInterchangeLookup ) ;
-    public final void rule__DataInterchangeBean__LookupAssignment_8_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__LookupAssignment_8_1_2"
+    // InternalDataDSL.g:25638:1: rule__DataInterchangeBean__LookupAssignment_8_1_2 : ( ruleDataInterchangeLookup ) ;
+    public final void rule__DataInterchangeBean__LookupAssignment_8_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24353:1: ( ( ruleDataInterchangeLookup ) )
-            // InternalDataDSL.g:24354:2: ( ruleDataInterchangeLookup )
+            // InternalDataDSL.g:25642:1: ( ( ruleDataInterchangeLookup ) )
+            // InternalDataDSL.g:25643:2: ( ruleDataInterchangeLookup )
             {
-            // InternalDataDSL.g:24354:2: ( ruleDataInterchangeLookup )
-            // InternalDataDSL.g:24355:3: ruleDataInterchangeLookup
+            // InternalDataDSL.g:25643:2: ( ruleDataInterchangeLookup )
+            // InternalDataDSL.g:25644:3: ruleDataInterchangeLookup
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeLookup();
@@ -79874,7 +84130,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0()); 
             }
 
             }
@@ -79894,24 +84150,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__LookupAssignment_8_2"
+    // $ANTLR end "rule__DataInterchangeBean__LookupAssignment_8_1_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__FormatAssignment_9_2"
-    // InternalDataDSL.g:24364:1: rule__DataInterchangeBean__FormatAssignment_9_2 : ( ruleDataInterchangeFormat ) ;
-    public final void rule__DataInterchangeBean__FormatAssignment_9_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__FormatAssignment_8_2_2"
+    // InternalDataDSL.g:25653:1: rule__DataInterchangeBean__FormatAssignment_8_2_2 : ( ruleDataInterchangeFormat ) ;
+    public final void rule__DataInterchangeBean__FormatAssignment_8_2_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24368:1: ( ( ruleDataInterchangeFormat ) )
-            // InternalDataDSL.g:24369:2: ( ruleDataInterchangeFormat )
+            // InternalDataDSL.g:25657:1: ( ( ruleDataInterchangeFormat ) )
+            // InternalDataDSL.g:25658:2: ( ruleDataInterchangeFormat )
             {
-            // InternalDataDSL.g:24369:2: ( ruleDataInterchangeFormat )
-            // InternalDataDSL.g:24370:3: ruleDataInterchangeFormat
+            // InternalDataDSL.g:25658:2: ( ruleDataInterchangeFormat )
+            // InternalDataDSL.g:25659:3: ruleDataInterchangeFormat
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeFormat();
@@ -79919,7 +84175,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0()); 
             }
 
             }
@@ -79939,24 +84195,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__FormatAssignment_9_2"
+    // $ANTLR end "rule__DataInterchangeBean__FormatAssignment_8_2_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__ExportExposesAssignment_10_2"
-    // InternalDataDSL.g:24379:1: rule__DataInterchangeBean__ExportExposesAssignment_10_2 : ( ruleDataInterchangeExpose ) ;
-    public final void rule__DataInterchangeBean__ExportExposesAssignment_10_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__ExportExposesAssignment_8_3_2"
+    // InternalDataDSL.g:25668:1: rule__DataInterchangeBean__ExportExposesAssignment_8_3_2 : ( ruleDataInterchangeExpose ) ;
+    public final void rule__DataInterchangeBean__ExportExposesAssignment_8_3_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24383:1: ( ( ruleDataInterchangeExpose ) )
-            // InternalDataDSL.g:24384:2: ( ruleDataInterchangeExpose )
+            // InternalDataDSL.g:25672:1: ( ( ruleDataInterchangeExpose ) )
+            // InternalDataDSL.g:25673:2: ( ruleDataInterchangeExpose )
             {
-            // InternalDataDSL.g:24384:2: ( ruleDataInterchangeExpose )
-            // InternalDataDSL.g:24385:3: ruleDataInterchangeExpose
+            // InternalDataDSL.g:25673:2: ( ruleDataInterchangeExpose )
+            // InternalDataDSL.g:25674:3: ruleDataInterchangeExpose
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeExpose();
@@ -79964,7 +84220,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0()); 
             }
 
             }
@@ -79984,24 +84240,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__ExportExposesAssignment_10_2"
+    // $ANTLR end "rule__DataInterchangeBean__ExportExposesAssignment_8_3_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__MappingsAssignment_11_2"
-    // InternalDataDSL.g:24394:1: rule__DataInterchangeBean__MappingsAssignment_11_2 : ( ruleDataInterchangeMapping ) ;
-    public final void rule__DataInterchangeBean__MappingsAssignment_11_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__MappingsAssignment_8_4_2"
+    // InternalDataDSL.g:25683:1: rule__DataInterchangeBean__MappingsAssignment_8_4_2 : ( ruleDataInterchangeMapping ) ;
+    public final void rule__DataInterchangeBean__MappingsAssignment_8_4_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24398:1: ( ( ruleDataInterchangeMapping ) )
-            // InternalDataDSL.g:24399:2: ( ruleDataInterchangeMapping )
+            // InternalDataDSL.g:25687:1: ( ( ruleDataInterchangeMapping ) )
+            // InternalDataDSL.g:25688:2: ( ruleDataInterchangeMapping )
             {
-            // InternalDataDSL.g:24399:2: ( ruleDataInterchangeMapping )
-            // InternalDataDSL.g:24400:3: ruleDataInterchangeMapping
+            // InternalDataDSL.g:25688:2: ( ruleDataInterchangeMapping )
+            // InternalDataDSL.g:25689:3: ruleDataInterchangeMapping
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeMapping();
@@ -80009,7 +84265,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0()); 
             }
 
             }
@@ -80029,24 +84285,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__MappingsAssignment_11_2"
+    // $ANTLR end "rule__DataInterchangeBean__MappingsAssignment_8_4_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__LookupKeysAssignment_12_2"
-    // InternalDataDSL.g:24409:1: rule__DataInterchangeBean__LookupKeysAssignment_12_2 : ( ruleDataInterchangeKey ) ;
-    public final void rule__DataInterchangeBean__LookupKeysAssignment_12_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__LookupKeysAssignment_8_5_2"
+    // InternalDataDSL.g:25698:1: rule__DataInterchangeBean__LookupKeysAssignment_8_5_2 : ( ruleDataInterchangeKey ) ;
+    public final void rule__DataInterchangeBean__LookupKeysAssignment_8_5_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24413:1: ( ( ruleDataInterchangeKey ) )
-            // InternalDataDSL.g:24414:2: ( ruleDataInterchangeKey )
+            // InternalDataDSL.g:25702:1: ( ( ruleDataInterchangeKey ) )
+            // InternalDataDSL.g:25703:2: ( ruleDataInterchangeKey )
             {
-            // InternalDataDSL.g:24414:2: ( ruleDataInterchangeKey )
-            // InternalDataDSL.g:24415:3: ruleDataInterchangeKey
+            // InternalDataDSL.g:25703:2: ( ruleDataInterchangeKey )
+            // InternalDataDSL.g:25704:3: ruleDataInterchangeKey
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeKey();
@@ -80054,7 +84310,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0()); 
             }
 
             }
@@ -80074,24 +84330,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__LookupKeysAssignment_12_2"
+    // $ANTLR end "rule__DataInterchangeBean__LookupKeysAssignment_8_5_2"
 
 
-    // $ANTLR start "rule__DataInterchangeBean__ExportFilterAssignment_13_2"
-    // InternalDataDSL.g:24424:1: rule__DataInterchangeBean__ExportFilterAssignment_13_2 : ( ruleDataInterchangeExportFilter ) ;
-    public final void rule__DataInterchangeBean__ExportFilterAssignment_13_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeBean__ExportFilterAssignment_8_6_2"
+    // InternalDataDSL.g:25713:1: rule__DataInterchangeBean__ExportFilterAssignment_8_6_2 : ( ruleDataInterchangeExportFilter ) ;
+    public final void rule__DataInterchangeBean__ExportFilterAssignment_8_6_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24428:1: ( ( ruleDataInterchangeExportFilter ) )
-            // InternalDataDSL.g:24429:2: ( ruleDataInterchangeExportFilter )
+            // InternalDataDSL.g:25717:1: ( ( ruleDataInterchangeExportFilter ) )
+            // InternalDataDSL.g:25718:2: ( ruleDataInterchangeExportFilter )
             {
-            // InternalDataDSL.g:24429:2: ( ruleDataInterchangeExportFilter )
-            // InternalDataDSL.g:24430:3: ruleDataInterchangeExportFilter
+            // InternalDataDSL.g:25718:2: ( ruleDataInterchangeExportFilter )
+            // InternalDataDSL.g:25719:3: ruleDataInterchangeExportFilter
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0()); 
+               before(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeExportFilter();
@@ -80099,7 +84355,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0()); 
+               after(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0()); 
             }
 
             }
@@ -80119,27 +84375,27 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeBean__ExportFilterAssignment_13_2"
+    // $ANTLR end "rule__DataInterchangeBean__ExportFilterAssignment_8_6_2"
 
 
     // $ANTLR start "rule__DataInterchangeKey__PropertyAssignment_2"
-    // InternalDataDSL.g:24439:1: rule__DataInterchangeKey__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:25728:1: rule__DataInterchangeKey__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeKey__PropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24443:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24444:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25732:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25733:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24444:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24445:3: ( RULE_ID )
+            // InternalDataDSL.g:25733:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25734:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24446:3: ( RULE_ID )
-            // InternalDataDSL.g:24447:4: RULE_ID
+            // InternalDataDSL.g:25735:3: ( RULE_ID )
+            // InternalDataDSL.g:25736:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeKeyAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -80176,23 +84432,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__TargetPropertyAssignment_2"
-    // InternalDataDSL.g:24458:1: rule__DataInterchangeLookup__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:25747:1: rule__DataInterchangeLookup__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeLookup__TargetPropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24462:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24463:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25751:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25752:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24463:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24464:3: ( RULE_ID )
+            // InternalDataDSL.g:25752:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25753:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getTargetPropertyLEntityReferenceCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24465:3: ( RULE_ID )
-            // InternalDataDSL.g:24466:4: RULE_ID
+            // InternalDataDSL.g:25754:3: ( RULE_ID )
+            // InternalDataDSL.g:25755:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getTargetPropertyLEntityReferenceIDTerminalRuleCall_2_0_1()); 
@@ -80229,23 +84485,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeLookup__EntityAssignment_4"
-    // InternalDataDSL.g:24477:1: rule__DataInterchangeLookup__EntityAssignment_4 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:25766:1: rule__DataInterchangeLookup__EntityAssignment_4 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeLookup__EntityAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24481:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24482:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25770:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25771:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24482:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24483:3: ( RULE_ID )
+            // InternalDataDSL.g:25771:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25772:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getEntityLEntityCrossReference_4_0()); 
             }
-            // InternalDataDSL.g:24484:3: ( RULE_ID )
-            // InternalDataDSL.g:24485:4: RULE_ID
+            // InternalDataDSL.g:25773:3: ( RULE_ID )
+            // InternalDataDSL.g:25774:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeLookupAccess().getEntityLEntityIDTerminalRuleCall_4_0_1()); 
@@ -80281,25 +84537,25 @@
     // $ANTLR end "rule__DataInterchangeLookup__EntityAssignment_4"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__ElementMapAssignment_5_1"
-    // InternalDataDSL.g:24496:1: rule__DataInterchangeLookup__ElementMapAssignment_5_1 : ( RULE_STRING ) ;
-    public final void rule__DataInterchangeLookup__ElementMapAssignment_5_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__ElementMapAssignment_6"
+    // InternalDataDSL.g:25785:1: rule__DataInterchangeLookup__ElementMapAssignment_6 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeLookup__ElementMapAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24500:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24501:2: ( RULE_STRING )
+            // InternalDataDSL.g:25789:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25790:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24501:2: ( RULE_STRING )
-            // InternalDataDSL.g:24502:3: RULE_STRING
+            // InternalDataDSL.g:25790:2: ( RULE_STRING )
+            // InternalDataDSL.g:25791:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0()); 
             }
             match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0()); 
             }
 
             }
@@ -80319,175 +84575,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__ElementMapAssignment_5_1"
+    // $ANTLR end "rule__DataInterchangeLookup__ElementMapAssignment_6"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__QueryPropertyAssignment_7"
-    // InternalDataDSL.g:24511:1: rule__DataInterchangeLookup__QueryPropertyAssignment_7 : ( ( RULE_ID ) ) ;
-    public final void rule__DataInterchangeLookup__QueryPropertyAssignment_7() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__DataMapAssignment_8"
+    // InternalDataDSL.g:25800:1: rule__DataInterchangeLookup__DataMapAssignment_8 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeLookup__DataMapAssignment_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24515:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24516:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25804:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:25805:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24516:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24517:3: ( RULE_ID )
+            // InternalDataDSL.g:25805:2: ( RULE_STRING )
+            // InternalDataDSL.g:25806:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0()); 
-            }
-            // InternalDataDSL.g:24518:3: ( RULE_ID )
-            // InternalDataDSL.g:24519:4: RULE_ID
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1()); 
-            }
-            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1()); 
-            }
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__QueryPropertyAssignment_7"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__CachedAssignment_8_0"
-    // InternalDataDSL.g:24530:1: rule__DataInterchangeLookup__CachedAssignment_8_0 : ( ( 'cacheSize' ) ) ;
-    public final void rule__DataInterchangeLookup__CachedAssignment_8_0() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24534:1: ( ( ( 'cacheSize' ) ) )
-            // InternalDataDSL.g:24535:2: ( ( 'cacheSize' ) )
-            {
-            // InternalDataDSL.g:24535:2: ( ( 'cacheSize' ) )
-            // InternalDataDSL.g:24536:3: ( 'cacheSize' )
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); 
-            }
-            // InternalDataDSL.g:24537:3: ( 'cacheSize' )
-            // InternalDataDSL.g:24538:4: 'cacheSize'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); 
-            }
-            match(input,157,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); 
-            }
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__CachedAssignment_8_0"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__CacheSizeAssignment_8_1"
-    // InternalDataDSL.g:24549:1: rule__DataInterchangeLookup__CacheSizeAssignment_8_1 : ( RULE_INT ) ;
-    public final void rule__DataInterchangeLookup__CacheSizeAssignment_8_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24553:1: ( ( RULE_INT ) )
-            // InternalDataDSL.g:24554:2: ( RULE_INT )
-            {
-            // InternalDataDSL.g:24554:2: ( RULE_INT )
-            // InternalDataDSL.g:24555:3: RULE_INT
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0()); 
-            }
-            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__CacheSizeAssignment_8_1"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__DataMapAssignment_9_1"
-    // InternalDataDSL.g:24564:1: rule__DataInterchangeLookup__DataMapAssignment_9_1 : ( RULE_STRING ) ;
-    public final void rule__DataInterchangeLookup__DataMapAssignment_9_1() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24568:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24569:2: ( RULE_STRING )
-            {
-            // InternalDataDSL.g:24569:2: ( RULE_STRING )
-            // InternalDataDSL.g:24570:3: RULE_STRING
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0()); 
             }
             match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0()); 
             }
 
             }
@@ -80507,40 +84616,40 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__DataMapAssignment_9_1"
+    // $ANTLR end "rule__DataInterchangeLookup__DataMapAssignment_8"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__AllowNoResultAssignment_10_0"
-    // InternalDataDSL.g:24579:1: rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 : ( ( 'allowNoResult' ) ) ;
-    public final void rule__DataInterchangeLookup__AllowNoResultAssignment_10_0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__AllowNoResultAssignment_9_0"
+    // InternalDataDSL.g:25815:1: rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 : ( ( 'allowNoResult' ) ) ;
+    public final void rule__DataInterchangeLookup__AllowNoResultAssignment_9_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24583:1: ( ( ( 'allowNoResult' ) ) )
-            // InternalDataDSL.g:24584:2: ( ( 'allowNoResult' ) )
+            // InternalDataDSL.g:25819:1: ( ( ( 'allowNoResult' ) ) )
+            // InternalDataDSL.g:25820:2: ( ( 'allowNoResult' ) )
             {
-            // InternalDataDSL.g:24584:2: ( ( 'allowNoResult' ) )
-            // InternalDataDSL.g:24585:3: ( 'allowNoResult' )
+            // InternalDataDSL.g:25820:2: ( ( 'allowNoResult' ) )
+            // InternalDataDSL.g:25821:3: ( 'allowNoResult' )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); 
             }
-            // InternalDataDSL.g:24586:3: ( 'allowNoResult' )
-            // InternalDataDSL.g:24587:4: 'allowNoResult'
+            // InternalDataDSL.g:25822:3: ( 'allowNoResult' )
+            // InternalDataDSL.g:25823:4: 'allowNoResult'
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); 
             }
-            match(input,158,FOLLOW_2); if (state.failed) return ;
+            match(input,163,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); 
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0()); 
             }
 
             }
@@ -80560,77 +84669,24 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__AllowNoResultAssignment_10_0"
+    // $ANTLR end "rule__DataInterchangeLookup__AllowNoResultAssignment_9_0"
 
 
-    // $ANTLR start "rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1"
-    // InternalDataDSL.g:24598:1: rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 : ( ( 'allowNonuniqueResult' ) ) ;
-    public final void rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeLookup__MarkerPathAssignment_9_1"
+    // InternalDataDSL.g:25834:1: rule__DataInterchangeLookup__MarkerPathAssignment_9_1 : ( ruleDataInterchangeMarkerPath ) ;
+    public final void rule__DataInterchangeLookup__MarkerPathAssignment_9_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24602:1: ( ( ( 'allowNonuniqueResult' ) ) )
-            // InternalDataDSL.g:24603:2: ( ( 'allowNonuniqueResult' ) )
+            // InternalDataDSL.g:25838:1: ( ( ruleDataInterchangeMarkerPath ) )
+            // InternalDataDSL.g:25839:2: ( ruleDataInterchangeMarkerPath )
             {
-            // InternalDataDSL.g:24603:2: ( ( 'allowNonuniqueResult' ) )
-            // InternalDataDSL.g:24604:3: ( 'allowNonuniqueResult' )
+            // InternalDataDSL.g:25839:2: ( ruleDataInterchangeMarkerPath )
+            // InternalDataDSL.g:25840:3: ruleDataInterchangeMarkerPath
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); 
-            }
-            // InternalDataDSL.g:24605:3: ( 'allowNonuniqueResult' )
-            // InternalDataDSL.g:24606:4: 'allowNonuniqueResult'
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); 
-            }
-            match(input,159,FOLLOW_2); if (state.failed) return ;
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); 
-            }
-
-            }
-
-            if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0()); 
-            }
-
-            }
-
-
-            }
-
-        }
-        catch (RecognitionException re) {
-            reportError(re);
-            recover(input,re);
-        }
-        finally {
-
-            	restoreStackSize(stackSize);
-
-        }
-        return ;
-    }
-    // $ANTLR end "rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1"
-
-
-    // $ANTLR start "rule__DataInterchangeLookup__MarkerPathAssignment_10_2"
-    // InternalDataDSL.g:24617:1: rule__DataInterchangeLookup__MarkerPathAssignment_10_2 : ( ruleDataInterchangeMarkerPath ) ;
-    public final void rule__DataInterchangeLookup__MarkerPathAssignment_10_2() throws RecognitionException {
-
-        		int stackSize = keepStackSize();
-        	
-        try {
-            // InternalDataDSL.g:24621:1: ( ( ruleDataInterchangeMarkerPath ) )
-            // InternalDataDSL.g:24622:2: ( ruleDataInterchangeMarkerPath )
-            {
-            // InternalDataDSL.g:24622:2: ( ruleDataInterchangeMarkerPath )
-            // InternalDataDSL.g:24623:3: ruleDataInterchangeMarkerPath
-            {
-            if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0()); 
+               before(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0()); 
             }
             pushFollow(FOLLOW_2);
             ruleDataInterchangeMarkerPath();
@@ -80638,7 +84694,7 @@
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0()); 
+               after(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0()); 
             }
 
             }
@@ -80658,21 +84714,213 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeLookup__MarkerPathAssignment_10_2"
+    // $ANTLR end "rule__DataInterchangeLookup__MarkerPathAssignment_9_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__QueryPropertyAssignment_11"
+    // InternalDataDSL.g:25849:1: rule__DataInterchangeLookup__QueryPropertyAssignment_11 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeLookup__QueryPropertyAssignment_11() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25853:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25854:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:25854:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25855:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0()); 
+            }
+            // InternalDataDSL.g:25856:3: ( RULE_ID )
+            // InternalDataDSL.g:25857:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__QueryPropertyAssignment_11"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__CachedAssignment_12_0"
+    // InternalDataDSL.g:25868:1: rule__DataInterchangeLookup__CachedAssignment_12_0 : ( ( 'cacheSize' ) ) ;
+    public final void rule__DataInterchangeLookup__CachedAssignment_12_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25872:1: ( ( ( 'cacheSize' ) ) )
+            // InternalDataDSL.g:25873:2: ( ( 'cacheSize' ) )
+            {
+            // InternalDataDSL.g:25873:2: ( ( 'cacheSize' ) )
+            // InternalDataDSL.g:25874:3: ( 'cacheSize' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); 
+            }
+            // InternalDataDSL.g:25875:3: ( 'cacheSize' )
+            // InternalDataDSL.g:25876:4: 'cacheSize'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); 
+            }
+            match(input,164,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__CachedAssignment_12_0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__CacheSizeAssignment_12_1"
+    // InternalDataDSL.g:25887:1: rule__DataInterchangeLookup__CacheSizeAssignment_12_1 : ( RULE_INT ) ;
+    public final void rule__DataInterchangeLookup__CacheSizeAssignment_12_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25891:1: ( ( RULE_INT ) )
+            // InternalDataDSL.g:25892:2: ( RULE_INT )
+            {
+            // InternalDataDSL.g:25892:2: ( RULE_INT )
+            // InternalDataDSL.g:25893:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__CacheSizeAssignment_12_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookup__ConditionAssignment_13_2"
+    // InternalDataDSL.g:25902:1: rule__DataInterchangeLookup__ConditionAssignment_13_2 : ( ruleDataInterchangeLookupFilterCondition ) ;
+    public final void rule__DataInterchangeLookup__ConditionAssignment_13_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:25906:1: ( ( ruleDataInterchangeLookupFilterCondition ) )
+            // InternalDataDSL.g:25907:2: ( ruleDataInterchangeLookupFilterCondition )
+            {
+            // InternalDataDSL.g:25907:2: ( ruleDataInterchangeLookupFilterCondition )
+            // InternalDataDSL.g:25908:3: ruleDataInterchangeLookupFilterCondition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleDataInterchangeLookupFilterCondition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookup__ConditionAssignment_13_2"
 
 
     // $ANTLR start "rule__DataInterchangeMarkerPath__PathAssignment_3"
-    // InternalDataDSL.g:24632:1: rule__DataInterchangeMarkerPath__PathAssignment_3 : ( ruleDataInterchangeMarkerEntity ) ;
+    // InternalDataDSL.g:25917:1: rule__DataInterchangeMarkerPath__PathAssignment_3 : ( ruleDataInterchangeMarkerEntity ) ;
     public final void rule__DataInterchangeMarkerPath__PathAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24636:1: ( ( ruleDataInterchangeMarkerEntity ) )
-            // InternalDataDSL.g:24637:2: ( ruleDataInterchangeMarkerEntity )
+            // InternalDataDSL.g:25921:1: ( ( ruleDataInterchangeMarkerEntity ) )
+            // InternalDataDSL.g:25922:2: ( ruleDataInterchangeMarkerEntity )
             {
-            // InternalDataDSL.g:24637:2: ( ruleDataInterchangeMarkerEntity )
-            // InternalDataDSL.g:24638:3: ruleDataInterchangeMarkerEntity
+            // InternalDataDSL.g:25922:2: ( ruleDataInterchangeMarkerEntity )
+            // InternalDataDSL.g:25923:3: ruleDataInterchangeMarkerEntity
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerPathAccess().getPathDataInterchangeMarkerEntityParserRuleCall_3_0()); 
@@ -80707,23 +84955,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2"
-    // InternalDataDSL.g:24647:1: rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 : ( ( ruleLFQN ) ) ;
+    // InternalDataDSL.g:25932:1: rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2 : ( ( ruleLFQN ) ) ;
     public final void rule__DataInterchangeMarkerEntity__MarkerEntityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24651:1: ( ( ( ruleLFQN ) ) )
-            // InternalDataDSL.g:24652:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:25936:1: ( ( ( ruleLFQN ) ) )
+            // InternalDataDSL.g:25937:2: ( ( ruleLFQN ) )
             {
-            // InternalDataDSL.g:24652:2: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:24653:3: ( ruleLFQN )
+            // InternalDataDSL.g:25937:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:25938:3: ( ruleLFQN )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityLEntityCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24654:3: ( ruleLFQN )
-            // InternalDataDSL.g:24655:4: ruleLFQN
+            // InternalDataDSL.g:25939:3: ( ruleLFQN )
+            // InternalDataDSL.g:25940:4: ruleLFQN
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityLEntityLFQNParserRuleCall_2_0_1()); 
@@ -80764,28 +85012,28 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0"
-    // InternalDataDSL.g:24666:1: rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 : ( ( 'markedBy' ) ) ;
+    // InternalDataDSL.g:25951:1: rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0 : ( ( 'markedBy' ) ) ;
     public final void rule__DataInterchangeMarkerEntity__MarkLatestAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24670:1: ( ( ( 'markedBy' ) ) )
-            // InternalDataDSL.g:24671:2: ( ( 'markedBy' ) )
+            // InternalDataDSL.g:25955:1: ( ( ( 'markedBy' ) ) )
+            // InternalDataDSL.g:25956:2: ( ( 'markedBy' ) )
             {
-            // InternalDataDSL.g:24671:2: ( ( 'markedBy' ) )
-            // InternalDataDSL.g:24672:3: ( 'markedBy' )
+            // InternalDataDSL.g:25956:2: ( ( 'markedBy' ) )
+            // InternalDataDSL.g:25957:3: ( 'markedBy' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestMarkedByKeyword_3_0_0()); 
             }
-            // InternalDataDSL.g:24673:3: ( 'markedBy' )
-            // InternalDataDSL.g:24674:4: 'markedBy'
+            // InternalDataDSL.g:25958:3: ( 'markedBy' )
+            // InternalDataDSL.g:25959:4: 'markedBy'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestMarkedByKeyword_3_0_0()); 
             }
-            match(input,160,FOLLOW_2); if (state.failed) return ;
+            match(input,165,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestMarkedByKeyword_3_0_0()); 
             }
@@ -80817,23 +85065,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1"
-    // InternalDataDSL.g:24685:1: rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:25970:1: rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeMarkerEntity__MarkerPropertyAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24689:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24690:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25974:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25975:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24690:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24691:3: ( RULE_ID )
+            // InternalDataDSL.g:25975:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25976:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerPropertyLEntityAttributeCrossReference_3_1_0()); 
             }
-            // InternalDataDSL.g:24692:3: ( RULE_ID )
-            // InternalDataDSL.g:24693:4: RULE_ID
+            // InternalDataDSL.g:25977:3: ( RULE_ID )
+            // InternalDataDSL.g:25978:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerPropertyLEntityAttributeIDTerminalRuleCall_3_1_0_1()); 
@@ -80870,23 +85118,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__TargetPropertyAssignment_2"
-    // InternalDataDSL.g:24704:1: rule__DataInterchangeFormat__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:25989:1: rule__DataInterchangeFormat__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeFormat__TargetPropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24708:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24709:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25993:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:25994:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24709:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24710:3: ( RULE_ID )
+            // InternalDataDSL.g:25994:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:25995:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getTargetPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24711:3: ( RULE_ID )
-            // InternalDataDSL.g:24712:4: RULE_ID
+            // InternalDataDSL.g:25996:3: ( RULE_ID )
+            // InternalDataDSL.g:25997:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getTargetPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -80923,17 +85171,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeFormat__FormatAssignment_4"
-    // InternalDataDSL.g:24723:1: rule__DataInterchangeFormat__FormatAssignment_4 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:26008:1: rule__DataInterchangeFormat__FormatAssignment_4 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeFormat__FormatAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24727:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24728:2: ( RULE_STRING )
+            // InternalDataDSL.g:26012:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26013:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24728:2: ( RULE_STRING )
-            // InternalDataDSL.g:24729:3: RULE_STRING
+            // InternalDataDSL.g:26013:2: ( RULE_STRING )
+            // InternalDataDSL.g:26014:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeFormatAccess().getFormatSTRINGTerminalRuleCall_4_0()); 
@@ -80964,23 +85212,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2"
-    // InternalDataDSL.g:24738:1: rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26023:1: rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeEntityExpression__TargetPropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24742:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24743:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26027:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26028:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24743:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24744:3: ( RULE_ID )
+            // InternalDataDSL.g:26028:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26029:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getTargetPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24745:3: ( RULE_ID )
-            // InternalDataDSL.g:24746:4: RULE_ID
+            // InternalDataDSL.g:26030:3: ( RULE_ID )
+            // InternalDataDSL.g:26031:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getTargetPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -81017,23 +85265,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__EntityAssignment_4"
-    // InternalDataDSL.g:24757:1: rule__DataInterchangeEntityExpression__EntityAssignment_4 : ( ( ruleLFQN ) ) ;
+    // InternalDataDSL.g:26042:1: rule__DataInterchangeEntityExpression__EntityAssignment_4 : ( ( ruleLFQN ) ) ;
     public final void rule__DataInterchangeEntityExpression__EntityAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24761:1: ( ( ( ruleLFQN ) ) )
-            // InternalDataDSL.g:24762:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:26046:1: ( ( ( ruleLFQN ) ) )
+            // InternalDataDSL.g:26047:2: ( ( ruleLFQN ) )
             {
-            // InternalDataDSL.g:24762:2: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:24763:3: ( ruleLFQN )
+            // InternalDataDSL.g:26047:2: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:26048:3: ( ruleLFQN )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getEntityLEntityCrossReference_4_0()); 
             }
-            // InternalDataDSL.g:24764:3: ( ruleLFQN )
-            // InternalDataDSL.g:24765:4: ruleLFQN
+            // InternalDataDSL.g:26049:3: ( ruleLFQN )
+            // InternalDataDSL.g:26050:4: ruleLFQN
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getEntityLEntityLFQNParserRuleCall_4_0_1()); 
@@ -81074,23 +85322,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeEntityExpression__PropertyAssignment_6"
-    // InternalDataDSL.g:24776:1: rule__DataInterchangeEntityExpression__PropertyAssignment_6 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26061:1: rule__DataInterchangeEntityExpression__PropertyAssignment_6 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeEntityExpression__PropertyAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24780:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24781:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26065:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26066:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24781:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24782:3: ( RULE_ID )
+            // InternalDataDSL.g:26066:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26067:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyLEntityAttributeCrossReference_6_0()); 
             }
-            // InternalDataDSL.g:24783:3: ( RULE_ID )
-            // InternalDataDSL.g:24784:4: RULE_ID
+            // InternalDataDSL.g:26068:3: ( RULE_ID )
+            // InternalDataDSL.g:26069:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyLEntityAttributeIDTerminalRuleCall_6_0_1()); 
@@ -81127,23 +85375,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__RefEntityAssignment_2"
-    // InternalDataDSL.g:24795:1: rule__DataInterchangeExpose__RefEntityAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26080:1: rule__DataInterchangeExpose__RefEntityAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeExpose__RefEntityAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24799:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24800:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26084:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26085:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24800:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24801:3: ( RULE_ID )
+            // InternalDataDSL.g:26085:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26086:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefEntityLEntityReferenceCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24802:3: ( RULE_ID )
-            // InternalDataDSL.g:24803:4: RULE_ID
+            // InternalDataDSL.g:26087:3: ( RULE_ID )
+            // InternalDataDSL.g:26088:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefEntityLEntityReferenceIDTerminalRuleCall_2_0_1()); 
@@ -81180,23 +85428,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1"
-    // InternalDataDSL.g:24814:1: rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26099:1: rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeExpose__RefPropertyAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24818:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24819:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26103:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26104:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24819:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24820:3: ( RULE_ID )
+            // InternalDataDSL.g:26104:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26105:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefPropertyLEntityAttributeCrossReference_3_0_1_0()); 
             }
-            // InternalDataDSL.g:24821:3: ( RULE_ID )
-            // InternalDataDSL.g:24822:4: RULE_ID
+            // InternalDataDSL.g:26106:3: ( RULE_ID )
+            // InternalDataDSL.g:26107:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getRefPropertyLEntityAttributeIDTerminalRuleCall_3_0_1_0_1()); 
@@ -81233,17 +85481,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExpose__SubExposeAssignment_3_1_2"
-    // InternalDataDSL.g:24833:1: rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 : ( ruleDataInterchangeExpose ) ;
+    // InternalDataDSL.g:26118:1: rule__DataInterchangeExpose__SubExposeAssignment_3_1_2 : ( ruleDataInterchangeExpose ) ;
     public final void rule__DataInterchangeExpose__SubExposeAssignment_3_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24837:1: ( ( ruleDataInterchangeExpose ) )
-            // InternalDataDSL.g:24838:2: ( ruleDataInterchangeExpose )
+            // InternalDataDSL.g:26122:1: ( ( ruleDataInterchangeExpose ) )
+            // InternalDataDSL.g:26123:2: ( ruleDataInterchangeExpose )
             {
-            // InternalDataDSL.g:24838:2: ( ruleDataInterchangeExpose )
-            // InternalDataDSL.g:24839:3: ruleDataInterchangeExpose
+            // InternalDataDSL.g:26123:2: ( ruleDataInterchangeExpose )
+            // InternalDataDSL.g:26124:3: ruleDataInterchangeExpose
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExposeAccess().getSubExposeDataInterchangeExposeParserRuleCall_3_1_2_0()); 
@@ -81278,28 +85526,28 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__ConditionAssignment_1_2"
-    // InternalDataDSL.g:24848:1: rule__DataInterchangeExportFilter__ConditionAssignment_1_2 : ( ruleDataInterchangeFilterCondition ) ;
+    // InternalDataDSL.g:26133:1: rule__DataInterchangeExportFilter__ConditionAssignment_1_2 : ( ruleDataInterchangeExportFilterCondition ) ;
     public final void rule__DataInterchangeExportFilter__ConditionAssignment_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24852:1: ( ( ruleDataInterchangeFilterCondition ) )
-            // InternalDataDSL.g:24853:2: ( ruleDataInterchangeFilterCondition )
+            // InternalDataDSL.g:26137:1: ( ( ruleDataInterchangeExportFilterCondition ) )
+            // InternalDataDSL.g:26138:2: ( ruleDataInterchangeExportFilterCondition )
             {
-            // InternalDataDSL.g:24853:2: ( ruleDataInterchangeFilterCondition )
-            // InternalDataDSL.g:24854:3: ruleDataInterchangeFilterCondition
+            // InternalDataDSL.g:26138:2: ( ruleDataInterchangeExportFilterCondition )
+            // InternalDataDSL.g:26139:3: ruleDataInterchangeExportFilterCondition
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0()); 
             }
             pushFollow(FOLLOW_2);
-            ruleDataInterchangeFilterCondition();
+            ruleDataInterchangeExportFilterCondition();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0()); 
             }
 
             }
@@ -81323,17 +85571,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1"
-    // InternalDataDSL.g:24863:1: rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 : ( ruleDataInterchangeExportHide ) ;
+    // InternalDataDSL.g:26148:1: rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1 : ( ruleDataInterchangeExportHide ) ;
     public final void rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24867:1: ( ( ruleDataInterchangeExportHide ) )
-            // InternalDataDSL.g:24868:2: ( ruleDataInterchangeExportHide )
+            // InternalDataDSL.g:26152:1: ( ( ruleDataInterchangeExportHide ) )
+            // InternalDataDSL.g:26153:2: ( ruleDataInterchangeExportHide )
             {
-            // InternalDataDSL.g:24868:2: ( ruleDataInterchangeExportHide )
-            // InternalDataDSL.g:24869:3: ruleDataInterchangeExportHide
+            // InternalDataDSL.g:26153:2: ( ruleDataInterchangeExportHide )
+            // InternalDataDSL.g:26154:3: ruleDataInterchangeExportHide
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportFilterAccess().getHiddenpropertiesDataInterchangeExportHideParserRuleCall_2_1_0()); 
@@ -81367,37 +85615,37 @@
     // $ANTLR end "rule__DataInterchangeExportFilter__HiddenpropertiesAssignment_2_1"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__RefPropertyAssignment_0"
-    // InternalDataDSL.g:24878:1: rule__DataInterchangeFilterCondition__RefPropertyAssignment_0 : ( ( RULE_ID ) ) ;
-    public final void rule__DataInterchangeFilterCondition__RefPropertyAssignment_0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0"
+    // InternalDataDSL.g:26163:1: rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24882:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24883:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26167:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26168:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24883:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24884:3: ( RULE_ID )
+            // InternalDataDSL.g:26168:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26169:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
             }
-            // InternalDataDSL.g:24885:3: ( RULE_ID )
-            // InternalDataDSL.g:24886:4: RULE_ID
+            // InternalDataDSL.g:26170:3: ( RULE_ID )
+            // InternalDataDSL.g:26171:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
             }
             match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
             }
 
             }
 
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
             }
 
             }
@@ -81417,32 +85665,32 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__RefPropertyAssignment_0"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__RefPropertyAssignment_0"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__OperatorAssignment_1"
-    // InternalDataDSL.g:24897:1: rule__DataInterchangeFilterCondition__OperatorAssignment_1 : ( ruleConditionAndOperator1 ) ;
-    public final void rule__DataInterchangeFilterCondition__OperatorAssignment_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__OperatorAssignment_1"
+    // InternalDataDSL.g:26182:1: rule__DataInterchangeExportFilterCondition__OperatorAssignment_1 : ( ruleOperator ) ;
+    public final void rule__DataInterchangeExportFilterCondition__OperatorAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24901:1: ( ( ruleConditionAndOperator1 ) )
-            // InternalDataDSL.g:24902:2: ( ruleConditionAndOperator1 )
+            // InternalDataDSL.g:26186:1: ( ( ruleOperator ) )
+            // InternalDataDSL.g:26187:2: ( ruleOperator )
             {
-            // InternalDataDSL.g:24902:2: ( ruleConditionAndOperator1 )
-            // InternalDataDSL.g:24903:3: ruleConditionAndOperator1
+            // InternalDataDSL.g:26187:2: ( ruleOperator )
+            // InternalDataDSL.g:26188:3: ruleOperator
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); 
             }
             pushFollow(FOLLOW_2);
-            ruleConditionAndOperator1();
+            ruleOperator();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); 
             }
 
             }
@@ -81462,28 +85710,28 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__OperatorAssignment_1"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__OperatorAssignment_1"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__ValueAssignment_2"
-    // InternalDataDSL.g:24912:1: rule__DataInterchangeFilterCondition__ValueAssignment_2 : ( RULE_STRING ) ;
-    public final void rule__DataInterchangeFilterCondition__ValueAssignment_2() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__ValueAssignment_2"
+    // InternalDataDSL.g:26197:1: rule__DataInterchangeExportFilterCondition__ValueAssignment_2 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeExportFilterCondition__ValueAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24916:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:24917:2: ( RULE_STRING )
+            // InternalDataDSL.g:26201:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26202:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:24917:2: ( RULE_STRING )
-            // InternalDataDSL.g:24918:3: RULE_STRING
+            // InternalDataDSL.g:26202:2: ( RULE_STRING )
+            // InternalDataDSL.g:26203:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); 
             }
             match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0()); 
             }
 
             }
@@ -81503,32 +85751,32 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__ValueAssignment_2"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__ValueAssignment_2"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__Operator2Assignment_3_0"
-    // InternalDataDSL.g:24927:1: rule__DataInterchangeFilterCondition__Operator2Assignment_3_0 : ( ruleConditionAndOperator2 ) ;
-    public final void rule__DataInterchangeFilterCondition__Operator2Assignment_3_0() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0"
+    // InternalDataDSL.g:26212:1: rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0 : ( ruleJunction ) ;
+    public final void rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24931:1: ( ( ruleConditionAndOperator2 ) )
-            // InternalDataDSL.g:24932:2: ( ruleConditionAndOperator2 )
+            // InternalDataDSL.g:26216:1: ( ( ruleJunction ) )
+            // InternalDataDSL.g:26217:2: ( ruleJunction )
             {
-            // InternalDataDSL.g:24932:2: ( ruleConditionAndOperator2 )
-            // InternalDataDSL.g:24933:3: ruleConditionAndOperator2
+            // InternalDataDSL.g:26217:2: ( ruleJunction )
+            // InternalDataDSL.g:26218:3: ruleJunction
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); 
             }
             pushFollow(FOLLOW_2);
-            ruleConditionAndOperator2();
+            ruleJunction();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); 
             }
 
             }
@@ -81548,32 +85796,32 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__Operator2Assignment_3_0"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__Operator2Assignment_3_0"
 
 
-    // $ANTLR start "rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1"
-    // InternalDataDSL.g:24942:1: rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1 : ( ruleDataInterchangeFilterCondition ) ;
-    public final void rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1() throws RecognitionException {
+    // $ANTLR start "rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1"
+    // InternalDataDSL.g:26227:1: rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1 : ( ruleDataInterchangeExportFilterCondition ) ;
+    public final void rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24946:1: ( ( ruleDataInterchangeFilterCondition ) )
-            // InternalDataDSL.g:24947:2: ( ruleDataInterchangeFilterCondition )
+            // InternalDataDSL.g:26231:1: ( ( ruleDataInterchangeExportFilterCondition ) )
+            // InternalDataDSL.g:26232:2: ( ruleDataInterchangeExportFilterCondition )
             {
-            // InternalDataDSL.g:24947:2: ( ruleDataInterchangeFilterCondition )
-            // InternalDataDSL.g:24948:3: ruleDataInterchangeFilterCondition
+            // InternalDataDSL.g:26232:2: ( ruleDataInterchangeExportFilterCondition )
+            // InternalDataDSL.g:26233:3: ruleDataInterchangeExportFilterCondition
             {
             if ( state.backtracking==0 ) {
-               before(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0()); 
+               before(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0()); 
             }
             pushFollow(FOLLOW_2);
-            ruleDataInterchangeFilterCondition();
+            ruleDataInterchangeExportFilterCondition();
 
             state._fsp--;
             if (state.failed) return ;
             if ( state.backtracking==0 ) {
-               after(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0()); 
+               after(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0()); 
             }
 
             }
@@ -81593,27 +85841,354 @@
         }
         return ;
     }
-    // $ANTLR end "rule__DataInterchangeFilterCondition__SubconditionAssignment_3_1"
+    // $ANTLR end "rule__DataInterchangeExportFilterCondition__SubconditionAssignment_3_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0"
+    // InternalDataDSL.g:26242:1: rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26246:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26247:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:26247:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26248:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
+            }
+            // InternalDataDSL.g:26249:3: ( RULE_ID )
+            // InternalDataDSL.g:26250:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__RefPropertyAssignment_0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1"
+    // InternalDataDSL.g:26261:1: rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1 : ( ruleOperator ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26265:1: ( ( ruleOperator ) )
+            // InternalDataDSL.g:26266:2: ( ruleOperator )
+            {
+            // InternalDataDSL.g:26266:2: ( ruleOperator )
+            // InternalDataDSL.g:26267:3: ruleOperator
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleOperator();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__OperatorAssignment_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__OperandAssignment_2"
+    // InternalDataDSL.g:26276:1: rule__DataInterchangeLookupFilterCondition__OperandAssignment_2 : ( ruleDataInterchangeLookupFilterOperand ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__OperandAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26280:1: ( ( ruleDataInterchangeLookupFilterOperand ) )
+            // InternalDataDSL.g:26281:2: ( ruleDataInterchangeLookupFilterOperand )
+            {
+            // InternalDataDSL.g:26281:2: ( ruleDataInterchangeLookupFilterOperand )
+            // InternalDataDSL.g:26282:3: ruleDataInterchangeLookupFilterOperand
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleDataInterchangeLookupFilterOperand();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__OperandAssignment_2"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0"
+    // InternalDataDSL.g:26291:1: rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0 : ( ruleJunction ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26295:1: ( ( ruleJunction ) )
+            // InternalDataDSL.g:26296:2: ( ruleJunction )
+            {
+            // InternalDataDSL.g:26296:2: ( ruleJunction )
+            // InternalDataDSL.g:26297:3: ruleJunction
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleJunction();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__Operator2Assignment_3_0"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1"
+    // InternalDataDSL.g:26306:1: rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1 : ( ruleDataInterchangeLookupFilterCondition ) ;
+    public final void rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26310:1: ( ( ruleDataInterchangeLookupFilterCondition ) )
+            // InternalDataDSL.g:26311:2: ( ruleDataInterchangeLookupFilterCondition )
+            {
+            // InternalDataDSL.g:26311:2: ( ruleDataInterchangeLookupFilterCondition )
+            // InternalDataDSL.g:26312:3: ruleDataInterchangeLookupFilterCondition
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0()); 
+            }
+            pushFollow(FOLLOW_2);
+            ruleDataInterchangeLookupFilterCondition();
+
+            state._fsp--;
+            if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterCondition__SubconditionAssignment_3_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1"
+    // InternalDataDSL.g:26321:1: rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26325:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26326:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:26326:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26327:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0()); 
+            }
+            // InternalDataDSL.g:26328:3: ( RULE_ID )
+            // InternalDataDSL.g:26329:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandProperty__RefPropertyAssignment_1"
+
+
+    // $ANTLR start "rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1"
+    // InternalDataDSL.g:26340:1: rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1 : ( RULE_STRING ) ;
+    public final void rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26344:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26345:2: ( RULE_STRING )
+            {
+            // InternalDataDSL.g:26345:2: ( RULE_STRING )
+            // InternalDataDSL.g:26346:3: RULE_STRING
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0()); 
+            }
+            match(input,RULE_STRING,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeLookupFilterOperandString__ValueAssignment_1"
 
 
     // $ANTLR start "rule__DataInterchangeExportHide__PropertyAssignment_1"
-    // InternalDataDSL.g:24957:1: rule__DataInterchangeExportHide__PropertyAssignment_1 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26355:1: rule__DataInterchangeExportHide__PropertyAssignment_1 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeExportHide__PropertyAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24961:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24962:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26359:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26360:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24962:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24963:3: ( RULE_ID )
+            // InternalDataDSL.g:26360:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26361:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideAccess().getPropertyLEntityFeatureCrossReference_1_0()); 
             }
-            // InternalDataDSL.g:24964:3: ( RULE_ID )
-            // InternalDataDSL.g:24965:4: RULE_ID
+            // InternalDataDSL.g:26362:3: ( RULE_ID )
+            // InternalDataDSL.g:26363:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeExportHideAccess().getPropertyLEntityFeatureIDTerminalRuleCall_1_0_1()); 
@@ -81650,23 +86225,23 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2"
-    // InternalDataDSL.g:24976:1: rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26374:1: rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangePredefinedExpression__TargetPropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24980:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:24981:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26378:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26379:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:24981:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:24982:3: ( RULE_ID )
+            // InternalDataDSL.g:26379:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26380:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getTargetPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:24983:3: ( RULE_ID )
-            // InternalDataDSL.g:24984:4: RULE_ID
+            // InternalDataDSL.g:26381:3: ( RULE_ID )
+            // InternalDataDSL.g:26382:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getTargetPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -81703,17 +86278,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__BeanAssignment_4"
-    // InternalDataDSL.g:24995:1: rule__DataInterchangePredefinedExpression__BeanAssignment_4 : ( rulePredefinedBeanEnum ) ;
+    // InternalDataDSL.g:26393:1: rule__DataInterchangePredefinedExpression__BeanAssignment_4 : ( rulePredefinedBeanEnum ) ;
     public final void rule__DataInterchangePredefinedExpression__BeanAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:24999:1: ( ( rulePredefinedBeanEnum ) )
-            // InternalDataDSL.g:25000:2: ( rulePredefinedBeanEnum )
+            // InternalDataDSL.g:26397:1: ( ( rulePredefinedBeanEnum ) )
+            // InternalDataDSL.g:26398:2: ( rulePredefinedBeanEnum )
             {
-            // InternalDataDSL.g:25000:2: ( rulePredefinedBeanEnum )
-            // InternalDataDSL.g:25001:3: rulePredefinedBeanEnum
+            // InternalDataDSL.g:26398:2: ( rulePredefinedBeanEnum )
+            // InternalDataDSL.g:26399:3: rulePredefinedBeanEnum
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanPredefinedBeanEnumEnumRuleCall_4_0()); 
@@ -81748,17 +86323,17 @@
 
 
     // $ANTLR start "rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6"
-    // InternalDataDSL.g:25010:1: rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 : ( rulePredefinedBeanTypeEnum ) ;
+    // InternalDataDSL.g:26408:1: rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6 : ( rulePredefinedBeanTypeEnum ) ;
     public final void rule__DataInterchangePredefinedExpression__BeanTypeAssignment_6() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25014:1: ( ( rulePredefinedBeanTypeEnum ) )
-            // InternalDataDSL.g:25015:2: ( rulePredefinedBeanTypeEnum )
+            // InternalDataDSL.g:26412:1: ( ( rulePredefinedBeanTypeEnum ) )
+            // InternalDataDSL.g:26413:2: ( rulePredefinedBeanTypeEnum )
             {
-            // InternalDataDSL.g:25015:2: ( rulePredefinedBeanTypeEnum )
-            // InternalDataDSL.g:25016:3: rulePredefinedBeanTypeEnum
+            // InternalDataDSL.g:26413:2: ( rulePredefinedBeanTypeEnum )
+            // InternalDataDSL.g:26414:3: rulePredefinedBeanTypeEnum
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanTypePredefinedBeanTypeEnumEnumRuleCall_6_0()); 
@@ -81793,23 +86368,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__PropertyAssignment_2"
-    // InternalDataDSL.g:25025:1: rule__DataInterchangeValueMapping__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26423:1: rule__DataInterchangeValueMapping__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeValueMapping__PropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25029:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:25030:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26427:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26428:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:25030:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:25031:3: ( RULE_ID )
+            // InternalDataDSL.g:26428:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26429:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:25032:3: ( RULE_ID )
-            // InternalDataDSL.g:25033:4: RULE_ID
+            // InternalDataDSL.g:26430:3: ( RULE_ID )
+            // InternalDataDSL.g:26431:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -81846,17 +86421,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeValueMapping__DataAssignment_4"
-    // InternalDataDSL.g:25044:1: rule__DataInterchangeValueMapping__DataAssignment_4 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:26442:1: rule__DataInterchangeValueMapping__DataAssignment_4 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeValueMapping__DataAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25048:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:25049:2: ( RULE_STRING )
+            // InternalDataDSL.g:26446:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26447:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:25049:2: ( RULE_STRING )
-            // InternalDataDSL.g:25050:3: RULE_STRING
+            // InternalDataDSL.g:26447:2: ( RULE_STRING )
+            // InternalDataDSL.g:26448:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeValueMappingAccess().getDataSTRINGTerminalRuleCall_4_0()); 
@@ -81887,23 +86462,23 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__PropertyAssignment_2"
-    // InternalDataDSL.g:25059:1: rule__DataInterchangeBlobMapping__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    // InternalDataDSL.g:26457:1: rule__DataInterchangeBlobMapping__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
     public final void rule__DataInterchangeBlobMapping__PropertyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25063:1: ( ( ( RULE_ID ) ) )
-            // InternalDataDSL.g:25064:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26461:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26462:2: ( ( RULE_ID ) )
             {
-            // InternalDataDSL.g:25064:2: ( ( RULE_ID ) )
-            // InternalDataDSL.g:25065:3: ( RULE_ID )
+            // InternalDataDSL.g:26462:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26463:3: ( RULE_ID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:25066:3: ( RULE_ID )
-            // InternalDataDSL.g:25067:4: RULE_ID
+            // InternalDataDSL.g:26464:3: ( RULE_ID )
+            // InternalDataDSL.g:26465:4: RULE_ID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
@@ -81940,17 +86515,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__DataAssignment_4"
-    // InternalDataDSL.g:25078:1: rule__DataInterchangeBlobMapping__DataAssignment_4 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:26476:1: rule__DataInterchangeBlobMapping__DataAssignment_4 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeBlobMapping__DataAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25082:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:25083:2: ( RULE_STRING )
+            // InternalDataDSL.g:26480:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26481:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:25083:2: ( RULE_STRING )
-            // InternalDataDSL.g:25084:3: RULE_STRING
+            // InternalDataDSL.g:26481:2: ( RULE_STRING )
+            // InternalDataDSL.g:26482:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getDataSTRINGTerminalRuleCall_4_0()); 
@@ -81981,17 +86556,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1"
-    // InternalDataDSL.g:25093:1: rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:26491:1: rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeBlobMapping__BlobFileExtensionAssignment_5_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25097:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:25098:2: ( RULE_STRING )
+            // InternalDataDSL.g:26495:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26496:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:25098:2: ( RULE_STRING )
-            // InternalDataDSL.g:25099:3: RULE_STRING
+            // InternalDataDSL.g:26496:2: ( RULE_STRING )
+            // InternalDataDSL.g:26497:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobFileExtensionSTRINGTerminalRuleCall_5_1_0()); 
@@ -82022,17 +86597,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1"
-    // InternalDataDSL.g:25108:1: rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:26506:1: rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1 : ( RULE_STRING ) ;
     public final void rule__DataInterchangeBlobMapping__BlobPathAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25112:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:25113:2: ( RULE_STRING )
+            // InternalDataDSL.g:26510:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:26511:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:25113:2: ( RULE_STRING )
-            // InternalDataDSL.g:25114:3: RULE_STRING
+            // InternalDataDSL.g:26511:2: ( RULE_STRING )
+            // InternalDataDSL.g:26512:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getBlobPathSTRINGTerminalRuleCall_6_1_0()); 
@@ -82063,17 +86638,17 @@
 
 
     // $ANTLR start "rule__DataInterchangeBlobMapping__MimeTypeAssignment_8"
-    // InternalDataDSL.g:25123:1: rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 : ( rulePredefinedBlobMimeTypeEnum ) ;
+    // InternalDataDSL.g:26521:1: rule__DataInterchangeBlobMapping__MimeTypeAssignment_8 : ( rulePredefinedBlobMimeTypeEnum ) ;
     public final void rule__DataInterchangeBlobMapping__MimeTypeAssignment_8() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25127:1: ( ( rulePredefinedBlobMimeTypeEnum ) )
-            // InternalDataDSL.g:25128:2: ( rulePredefinedBlobMimeTypeEnum )
+            // InternalDataDSL.g:26525:1: ( ( rulePredefinedBlobMimeTypeEnum ) )
+            // InternalDataDSL.g:26526:2: ( rulePredefinedBlobMimeTypeEnum )
             {
-            // InternalDataDSL.g:25128:2: ( rulePredefinedBlobMimeTypeEnum )
-            // InternalDataDSL.g:25129:3: rulePredefinedBlobMimeTypeEnum
+            // InternalDataDSL.g:26526:2: ( rulePredefinedBlobMimeTypeEnum )
+            // InternalDataDSL.g:26527:3: rulePredefinedBlobMimeTypeEnum
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypePredefinedBlobMimeTypeEnumEnumRuleCall_8_0()); 
@@ -82107,24 +86682,542 @@
     // $ANTLR end "rule__DataInterchangeBlobMapping__MimeTypeAssignment_8"
 
 
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2"
+    // InternalDataDSL.g:26536:1: rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2 : ( ( RULE_ID ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26540:1: ( ( ( RULE_ID ) ) )
+            // InternalDataDSL.g:26541:2: ( ( RULE_ID ) )
+            {
+            // InternalDataDSL.g:26541:2: ( ( RULE_ID ) )
+            // InternalDataDSL.g:26542:3: ( RULE_ID )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); 
+            }
+            // InternalDataDSL.g:26543:3: ( RULE_ID )
+            // InternalDataDSL.g:26544:4: RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+            match(input,RULE_ID,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__PropertyAssignment_2"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__LengthAssignment_4"
+    // InternalDataDSL.g:26555:1: rule__DataInterchangeFixedColumnMapping__LengthAssignment_4 : ( RULE_INT ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__LengthAssignment_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26559:1: ( ( RULE_INT ) )
+            // InternalDataDSL.g:26560:2: ( RULE_INT )
+            {
+            // InternalDataDSL.g:26560:2: ( RULE_INT )
+            // InternalDataDSL.g:26561:3: RULE_INT
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0()); 
+            }
+            match(input,RULE_INT,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__LengthAssignment_4"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0"
+    // InternalDataDSL.g:26570:1: rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0 : ( ( 'trim' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26574:1: ( ( ( 'trim' ) ) )
+            // InternalDataDSL.g:26575:2: ( ( 'trim' ) )
+            {
+            // InternalDataDSL.g:26575:2: ( ( 'trim' ) )
+            // InternalDataDSL.g:26576:3: ( 'trim' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); 
+            }
+            // InternalDataDSL.g:26577:3: ( 'trim' )
+            // InternalDataDSL.g:26578:4: 'trim'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); 
+            }
+            match(input,166,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__TrimAssignment_5_0_0"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1"
+    // InternalDataDSL.g:26589:1: rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1 : ( ( 'leftTrim' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26593:1: ( ( ( 'leftTrim' ) ) )
+            // InternalDataDSL.g:26594:2: ( ( 'leftTrim' ) )
+            {
+            // InternalDataDSL.g:26594:2: ( ( 'leftTrim' ) )
+            // InternalDataDSL.g:26595:3: ( 'leftTrim' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); 
+            }
+            // InternalDataDSL.g:26596:3: ( 'leftTrim' )
+            // InternalDataDSL.g:26597:4: 'leftTrim'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); 
+            }
+            match(input,167,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__LeftTrimAssignment_5_0_1"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2"
+    // InternalDataDSL.g:26608:1: rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2 : ( ( 'rightTrim' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26612:1: ( ( ( 'rightTrim' ) ) )
+            // InternalDataDSL.g:26613:2: ( ( 'rightTrim' ) )
+            {
+            // InternalDataDSL.g:26613:2: ( ( 'rightTrim' ) )
+            // InternalDataDSL.g:26614:3: ( 'rightTrim' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); 
+            }
+            // InternalDataDSL.g:26615:3: ( 'rightTrim' )
+            // InternalDataDSL.g:26616:4: 'rightTrim'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); 
+            }
+            match(input,168,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__RightTrimAssignment_5_0_2"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0"
+    // InternalDataDSL.g:26627:1: rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0 : ( ( 'lowerCase' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26631:1: ( ( ( 'lowerCase' ) ) )
+            // InternalDataDSL.g:26632:2: ( ( 'lowerCase' ) )
+            {
+            // InternalDataDSL.g:26632:2: ( ( 'lowerCase' ) )
+            // InternalDataDSL.g:26633:3: ( 'lowerCase' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); 
+            }
+            // InternalDataDSL.g:26634:3: ( 'lowerCase' )
+            // InternalDataDSL.g:26635:4: 'lowerCase'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); 
+            }
+            match(input,169,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__LowerCaseAssignment_5_1_0"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1"
+    // InternalDataDSL.g:26646:1: rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1 : ( ( 'upperCase' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26650:1: ( ( ( 'upperCase' ) ) )
+            // InternalDataDSL.g:26651:2: ( ( 'upperCase' ) )
+            {
+            // InternalDataDSL.g:26651:2: ( ( 'upperCase' ) )
+            // InternalDataDSL.g:26652:3: ( 'upperCase' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); 
+            }
+            // InternalDataDSL.g:26653:3: ( 'upperCase' )
+            // InternalDataDSL.g:26654:4: 'upperCase'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); 
+            }
+            match(input,170,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UpperCaseAssignment_5_1_1"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2"
+    // InternalDataDSL.g:26665:1: rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2 : ( ( 'capitalizeFirstWord' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26669:1: ( ( ( 'capitalizeFirstWord' ) ) )
+            // InternalDataDSL.g:26670:2: ( ( 'capitalizeFirstWord' ) )
+            {
+            // InternalDataDSL.g:26670:2: ( ( 'capitalizeFirstWord' ) )
+            // InternalDataDSL.g:26671:3: ( 'capitalizeFirstWord' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); 
+            }
+            // InternalDataDSL.g:26672:3: ( 'capitalizeFirstWord' )
+            // InternalDataDSL.g:26673:4: 'capitalizeFirstWord'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); 
+            }
+            match(input,171,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__CapFirstAssignment_5_1_2"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3"
+    // InternalDataDSL.g:26684:1: rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3 : ( ( 'uncapitalizeFirstWord' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26688:1: ( ( ( 'uncapitalizeFirstWord' ) ) )
+            // InternalDataDSL.g:26689:2: ( ( 'uncapitalizeFirstWord' ) )
+            {
+            // InternalDataDSL.g:26689:2: ( ( 'uncapitalizeFirstWord' ) )
+            // InternalDataDSL.g:26690:3: ( 'uncapitalizeFirstWord' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); 
+            }
+            // InternalDataDSL.g:26691:3: ( 'uncapitalizeFirstWord' )
+            // InternalDataDSL.g:26692:4: 'uncapitalizeFirstWord'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); 
+            }
+            match(input,172,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__UncapFirstAssignment_5_1_3"
+
+
+    // $ANTLR start "rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4"
+    // InternalDataDSL.g:26703:1: rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4 : ( ( 'capitalize' ) ) ;
+    public final void rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4() throws RecognitionException {
+
+        		int stackSize = keepStackSize();
+        	
+        try {
+            // InternalDataDSL.g:26707:1: ( ( ( 'capitalize' ) ) )
+            // InternalDataDSL.g:26708:2: ( ( 'capitalize' ) )
+            {
+            // InternalDataDSL.g:26708:2: ( ( 'capitalize' ) )
+            // InternalDataDSL.g:26709:3: ( 'capitalize' )
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); 
+            }
+            // InternalDataDSL.g:26710:3: ( 'capitalize' )
+            // InternalDataDSL.g:26711:4: 'capitalize'
+            {
+            if ( state.backtracking==0 ) {
+               before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); 
+            }
+            match(input,173,FOLLOW_2); if (state.failed) return ;
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); 
+            }
+
+            }
+
+            if ( state.backtracking==0 ) {
+               after(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0()); 
+            }
+
+            }
+
+
+            }
+
+        }
+        catch (RecognitionException re) {
+            reportError(re);
+            recover(input,re);
+        }
+        finally {
+
+            	restoreStackSize(stackSize);
+
+        }
+        return ;
+    }
+    // $ANTLR end "rule__DataInterchangeFixedColumnMapping__CapitalizeAssignment_5_1_4"
+
+
     // $ANTLR start "rule__XImportDeclaration__StaticAssignment_2_0_0"
-    // InternalDataDSL.g:25138:1: rule__XImportDeclaration__StaticAssignment_2_0_0 : ( ( 'static' ) ) ;
+    // InternalDataDSL.g:26722:1: rule__XImportDeclaration__StaticAssignment_2_0_0 : ( ( 'static' ) ) ;
     public final void rule__XImportDeclaration__StaticAssignment_2_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25142:1: ( ( ( 'static' ) ) )
-            // InternalDataDSL.g:25143:2: ( ( 'static' ) )
+            // InternalDataDSL.g:26726:1: ( ( ( 'static' ) ) )
+            // InternalDataDSL.g:26727:2: ( ( 'static' ) )
             {
-            // InternalDataDSL.g:25143:2: ( ( 'static' ) )
-            // InternalDataDSL.g:25144:3: ( 'static' )
+            // InternalDataDSL.g:26727:2: ( ( 'static' ) )
+            // InternalDataDSL.g:26728:3: ( 'static' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
             }
-            // InternalDataDSL.g:25145:3: ( 'static' )
-            // InternalDataDSL.g:25146:4: 'static'
+            // InternalDataDSL.g:26729:3: ( 'static' )
+            // InternalDataDSL.g:26730:4: 'static'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0()); 
@@ -82161,23 +87254,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ExtensionAssignment_2_0_1"
-    // InternalDataDSL.g:25157:1: rule__XImportDeclaration__ExtensionAssignment_2_0_1 : ( ( 'extension' ) ) ;
+    // InternalDataDSL.g:26741:1: rule__XImportDeclaration__ExtensionAssignment_2_0_1 : ( ( 'extension' ) ) ;
     public final void rule__XImportDeclaration__ExtensionAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25161:1: ( ( ( 'extension' ) ) )
-            // InternalDataDSL.g:25162:2: ( ( 'extension' ) )
+            // InternalDataDSL.g:26745:1: ( ( ( 'extension' ) ) )
+            // InternalDataDSL.g:26746:2: ( ( 'extension' ) )
             {
-            // InternalDataDSL.g:25162:2: ( ( 'extension' ) )
-            // InternalDataDSL.g:25163:3: ( 'extension' )
+            // InternalDataDSL.g:26746:2: ( ( 'extension' ) )
+            // InternalDataDSL.g:26747:3: ( 'extension' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
             }
-            // InternalDataDSL.g:25164:3: ( 'extension' )
-            // InternalDataDSL.g:25165:4: 'extension'
+            // InternalDataDSL.g:26748:3: ( 'extension' )
+            // InternalDataDSL.g:26749:4: 'extension'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0()); 
@@ -82214,23 +87307,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_0_2"
-    // InternalDataDSL.g:25176:1: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
+    // InternalDataDSL.g:26760:1: rule__XImportDeclaration__ImportedTypeAssignment_2_0_2 : ( ( ruleQualifiedNameInStaticImport ) ) ;
     public final void rule__XImportDeclaration__ImportedTypeAssignment_2_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25180:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
-            // InternalDataDSL.g:25181:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalDataDSL.g:26764:1: ( ( ( ruleQualifiedNameInStaticImport ) ) )
+            // InternalDataDSL.g:26765:2: ( ( ruleQualifiedNameInStaticImport ) )
             {
-            // InternalDataDSL.g:25181:2: ( ( ruleQualifiedNameInStaticImport ) )
-            // InternalDataDSL.g:25182:3: ( ruleQualifiedNameInStaticImport )
+            // InternalDataDSL.g:26765:2: ( ( ruleQualifiedNameInStaticImport ) )
+            // InternalDataDSL.g:26766:3: ( ruleQualifiedNameInStaticImport )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0()); 
             }
-            // InternalDataDSL.g:25183:3: ( ruleQualifiedNameInStaticImport )
-            // InternalDataDSL.g:25184:4: ruleQualifiedNameInStaticImport
+            // InternalDataDSL.g:26767:3: ( ruleQualifiedNameInStaticImport )
+            // InternalDataDSL.g:26768:4: ruleQualifiedNameInStaticImport
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameInStaticImportParserRuleCall_2_0_2_0_1()); 
@@ -82271,23 +87364,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__WildcardAssignment_2_0_3_0"
-    // InternalDataDSL.g:25195:1: rule__XImportDeclaration__WildcardAssignment_2_0_3_0 : ( ( '*' ) ) ;
+    // InternalDataDSL.g:26779:1: rule__XImportDeclaration__WildcardAssignment_2_0_3_0 : ( ( '*' ) ) ;
     public final void rule__XImportDeclaration__WildcardAssignment_2_0_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25199:1: ( ( ( '*' ) ) )
-            // InternalDataDSL.g:25200:2: ( ( '*' ) )
+            // InternalDataDSL.g:26783:1: ( ( ( '*' ) ) )
+            // InternalDataDSL.g:26784:2: ( ( '*' ) )
             {
-            // InternalDataDSL.g:25200:2: ( ( '*' ) )
-            // InternalDataDSL.g:25201:3: ( '*' )
+            // InternalDataDSL.g:26784:2: ( ( '*' ) )
+            // InternalDataDSL.g:26785:3: ( '*' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
             }
-            // InternalDataDSL.g:25202:3: ( '*' )
-            // InternalDataDSL.g:25203:4: '*'
+            // InternalDataDSL.g:26786:3: ( '*' )
+            // InternalDataDSL.g:26787:4: '*'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0()); 
@@ -82324,17 +87417,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__MemberNameAssignment_2_0_3_1"
-    // InternalDataDSL.g:25214:1: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 : ( ruleValidID ) ;
+    // InternalDataDSL.g:26798:1: rule__XImportDeclaration__MemberNameAssignment_2_0_3_1 : ( ruleValidID ) ;
     public final void rule__XImportDeclaration__MemberNameAssignment_2_0_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25218:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:25219:2: ( ruleValidID )
+            // InternalDataDSL.g:26802:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:26803:2: ( ruleValidID )
             {
-            // InternalDataDSL.g:25219:2: ( ruleValidID )
-            // InternalDataDSL.g:25220:3: ruleValidID
+            // InternalDataDSL.g:26803:2: ( ruleValidID )
+            // InternalDataDSL.g:26804:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0()); 
@@ -82369,23 +87462,23 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedTypeAssignment_2_1"
-    // InternalDataDSL.g:25229:1: rule__XImportDeclaration__ImportedTypeAssignment_2_1 : ( ( ruleQualifiedName ) ) ;
+    // InternalDataDSL.g:26813:1: rule__XImportDeclaration__ImportedTypeAssignment_2_1 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XImportDeclaration__ImportedTypeAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25233:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalDataDSL.g:25234:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:26817:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalDataDSL.g:26818:2: ( ( ruleQualifiedName ) )
             {
-            // InternalDataDSL.g:25234:2: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:25235:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:26818:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:26819:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0()); 
             }
-            // InternalDataDSL.g:25236:3: ( ruleQualifiedName )
-            // InternalDataDSL.g:25237:4: ruleQualifiedName
+            // InternalDataDSL.g:26820:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:26821:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeQualifiedNameParserRuleCall_2_1_0_1()); 
@@ -82426,17 +87519,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedNamespaceAssignment_2_2"
-    // InternalDataDSL.g:25248:1: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 : ( ruleQualifiedNameWithWildcard ) ;
+    // InternalDataDSL.g:26832:1: rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 : ( ruleQualifiedNameWithWildcard ) ;
     public final void rule__XImportDeclaration__ImportedNamespaceAssignment_2_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25252:1: ( ( ruleQualifiedNameWithWildcard ) )
-            // InternalDataDSL.g:25253:2: ( ruleQualifiedNameWithWildcard )
+            // InternalDataDSL.g:26836:1: ( ( ruleQualifiedNameWithWildcard ) )
+            // InternalDataDSL.g:26837:2: ( ruleQualifiedNameWithWildcard )
             {
-            // InternalDataDSL.g:25253:2: ( ruleQualifiedNameWithWildcard )
-            // InternalDataDSL.g:25254:3: ruleQualifiedNameWithWildcard
+            // InternalDataDSL.g:26837:2: ( ruleQualifiedNameWithWildcard )
+            // InternalDataDSL.g:26838:3: ruleQualifiedNameWithWildcard
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0()); 
@@ -82471,28 +87564,28 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__FqnImportAssignment_2_3_0"
-    // InternalDataDSL.g:25263:1: rule__XImportDeclaration__FqnImportAssignment_2_3_0 : ( ( 'ns' ) ) ;
+    // InternalDataDSL.g:26847:1: rule__XImportDeclaration__FqnImportAssignment_2_3_0 : ( ( 'ns' ) ) ;
     public final void rule__XImportDeclaration__FqnImportAssignment_2_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25267:1: ( ( ( 'ns' ) ) )
-            // InternalDataDSL.g:25268:2: ( ( 'ns' ) )
+            // InternalDataDSL.g:26851:1: ( ( ( 'ns' ) ) )
+            // InternalDataDSL.g:26852:2: ( ( 'ns' ) )
             {
-            // InternalDataDSL.g:25268:2: ( ( 'ns' ) )
-            // InternalDataDSL.g:25269:3: ( 'ns' )
+            // InternalDataDSL.g:26852:2: ( ( 'ns' ) )
+            // InternalDataDSL.g:26853:3: ( 'ns' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
             }
-            // InternalDataDSL.g:25270:3: ( 'ns' )
-            // InternalDataDSL.g:25271:4: 'ns'
+            // InternalDataDSL.g:26854:3: ( 'ns' )
+            // InternalDataDSL.g:26855:4: 'ns'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
             }
-            match(input,161,FOLLOW_2); if (state.failed) return ;
+            match(input,174,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0()); 
             }
@@ -82524,17 +87617,17 @@
 
 
     // $ANTLR start "rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1"
-    // InternalDataDSL.g:25282:1: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 : ( ruleQualifiedName ) ;
+    // InternalDataDSL.g:26866:1: rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1 : ( ruleQualifiedName ) ;
     public final void rule__XImportDeclaration__ImportedFullyQualifiedNameAssignment_2_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25286:1: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:25287:2: ( ruleQualifiedName )
+            // InternalDataDSL.g:26870:1: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:26871:2: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:25287:2: ( ruleQualifiedName )
-            // InternalDataDSL.g:25288:3: ruleQualifiedName
+            // InternalDataDSL.g:26871:2: ( ruleQualifiedName )
+            // InternalDataDSL.g:26872:3: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0()); 
@@ -82569,23 +87662,23 @@
 
 
     // $ANTLR start "rule__XAnnotation__AnnotationTypeAssignment_2"
-    // InternalDataDSL.g:25297:1: rule__XAnnotation__AnnotationTypeAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    // InternalDataDSL.g:26881:1: rule__XAnnotation__AnnotationTypeAssignment_2 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XAnnotation__AnnotationTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25301:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalDataDSL.g:25302:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:26885:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalDataDSL.g:26886:2: ( ( ruleQualifiedName ) )
             {
-            // InternalDataDSL.g:25302:2: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:25303:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:26886:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:26887:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:25304:3: ( ruleQualifiedName )
-            // InternalDataDSL.g:25305:4: ruleQualifiedName
+            // InternalDataDSL.g:26888:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:26889:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeQualifiedNameParserRuleCall_2_0_1()); 
@@ -82626,17 +87719,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0"
-    // InternalDataDSL.g:25316:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 : ( ruleXAnnotationElementValuePair ) ;
+    // InternalDataDSL.g:26900:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0 : ( ruleXAnnotationElementValuePair ) ;
     public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25320:1: ( ( ruleXAnnotationElementValuePair ) )
-            // InternalDataDSL.g:25321:2: ( ruleXAnnotationElementValuePair )
+            // InternalDataDSL.g:26904:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalDataDSL.g:26905:2: ( ruleXAnnotationElementValuePair )
             {
-            // InternalDataDSL.g:25321:2: ( ruleXAnnotationElementValuePair )
-            // InternalDataDSL.g:25322:3: ruleXAnnotationElementValuePair
+            // InternalDataDSL.g:26905:2: ( ruleXAnnotationElementValuePair )
+            // InternalDataDSL.g:26906:3: ruleXAnnotationElementValuePair
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0()); 
@@ -82671,17 +87764,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1"
-    // InternalDataDSL.g:25331:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 : ( ruleXAnnotationElementValuePair ) ;
+    // InternalDataDSL.g:26915:1: rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1 : ( ruleXAnnotationElementValuePair ) ;
     public final void rule__XAnnotation__ElementValuePairsAssignment_3_1_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25335:1: ( ( ruleXAnnotationElementValuePair ) )
-            // InternalDataDSL.g:25336:2: ( ruleXAnnotationElementValuePair )
+            // InternalDataDSL.g:26919:1: ( ( ruleXAnnotationElementValuePair ) )
+            // InternalDataDSL.g:26920:2: ( ruleXAnnotationElementValuePair )
             {
-            // InternalDataDSL.g:25336:2: ( ruleXAnnotationElementValuePair )
-            // InternalDataDSL.g:25337:3: ruleXAnnotationElementValuePair
+            // InternalDataDSL.g:26920:2: ( ruleXAnnotationElementValuePair )
+            // InternalDataDSL.g:26921:3: ruleXAnnotationElementValuePair
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0()); 
@@ -82716,17 +87809,17 @@
 
 
     // $ANTLR start "rule__XAnnotation__ValueAssignment_3_1_1"
-    // InternalDataDSL.g:25346:1: rule__XAnnotation__ValueAssignment_3_1_1 : ( ruleXAnnotationElementValueOrCommaList ) ;
+    // InternalDataDSL.g:26930:1: rule__XAnnotation__ValueAssignment_3_1_1 : ( ruleXAnnotationElementValueOrCommaList ) ;
     public final void rule__XAnnotation__ValueAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25350:1: ( ( ruleXAnnotationElementValueOrCommaList ) )
-            // InternalDataDSL.g:25351:2: ( ruleXAnnotationElementValueOrCommaList )
+            // InternalDataDSL.g:26934:1: ( ( ruleXAnnotationElementValueOrCommaList ) )
+            // InternalDataDSL.g:26935:2: ( ruleXAnnotationElementValueOrCommaList )
             {
-            // InternalDataDSL.g:25351:2: ( ruleXAnnotationElementValueOrCommaList )
-            // InternalDataDSL.g:25352:3: ruleXAnnotationElementValueOrCommaList
+            // InternalDataDSL.g:26935:2: ( ruleXAnnotationElementValueOrCommaList )
+            // InternalDataDSL.g:26936:3: ruleXAnnotationElementValueOrCommaList
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0()); 
@@ -82761,23 +87854,23 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__ElementAssignment_0_0_0"
-    // InternalDataDSL.g:25361:1: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 : ( ( ruleValidID ) ) ;
+    // InternalDataDSL.g:26945:1: rule__XAnnotationElementValuePair__ElementAssignment_0_0_0 : ( ( ruleValidID ) ) ;
     public final void rule__XAnnotationElementValuePair__ElementAssignment_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25365:1: ( ( ( ruleValidID ) ) )
-            // InternalDataDSL.g:25366:2: ( ( ruleValidID ) )
+            // InternalDataDSL.g:26949:1: ( ( ( ruleValidID ) ) )
+            // InternalDataDSL.g:26950:2: ( ( ruleValidID ) )
             {
-            // InternalDataDSL.g:25366:2: ( ( ruleValidID ) )
-            // InternalDataDSL.g:25367:3: ( ruleValidID )
+            // InternalDataDSL.g:26950:2: ( ( ruleValidID ) )
+            // InternalDataDSL.g:26951:3: ( ruleValidID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0()); 
             }
-            // InternalDataDSL.g:25368:3: ( ruleValidID )
-            // InternalDataDSL.g:25369:4: ruleValidID
+            // InternalDataDSL.g:26952:3: ( ruleValidID )
+            // InternalDataDSL.g:26953:4: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationValidIDParserRuleCall_0_0_0_0_1()); 
@@ -82818,17 +87911,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValuePair__ValueAssignment_1"
-    // InternalDataDSL.g:25380:1: rule__XAnnotationElementValuePair__ValueAssignment_1 : ( ruleXAnnotationElementValue ) ;
+    // InternalDataDSL.g:26964:1: rule__XAnnotationElementValuePair__ValueAssignment_1 : ( ruleXAnnotationElementValue ) ;
     public final void rule__XAnnotationElementValuePair__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25384:1: ( ( ruleXAnnotationElementValue ) )
-            // InternalDataDSL.g:25385:2: ( ruleXAnnotationElementValue )
+            // InternalDataDSL.g:26968:1: ( ( ruleXAnnotationElementValue ) )
+            // InternalDataDSL.g:26969:2: ( ruleXAnnotationElementValue )
             {
-            // InternalDataDSL.g:25385:2: ( ruleXAnnotationElementValue )
-            // InternalDataDSL.g:25386:3: ruleXAnnotationElementValue
+            // InternalDataDSL.g:26969:2: ( ruleXAnnotationElementValue )
+            // InternalDataDSL.g:26970:3: ruleXAnnotationElementValue
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValuePairAccess().getValueXAnnotationElementValueParserRuleCall_1_0()); 
@@ -82863,17 +87956,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0"
-    // InternalDataDSL.g:25395:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:26979:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25399:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:25400:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:26983:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:26984:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:25400:2: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:25401:3: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:26984:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:26985:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
@@ -82908,17 +88001,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1"
-    // InternalDataDSL.g:25410:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:26994:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25414:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:25415:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:26998:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:26999:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:25415:2: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:25416:3: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:26999:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27000:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
@@ -82953,17 +88046,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1"
-    // InternalDataDSL.g:25425:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:27009:1: rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValueOrCommaList__ElementsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25429:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:25430:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27013:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:27014:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:25430:2: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:25431:3: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:27014:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27015:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0()); 
@@ -82998,17 +88091,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_0"
-    // InternalDataDSL.g:25440:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:27024:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_0 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25444:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:25445:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27028:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:27029:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:25445:2: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:25446:3: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:27029:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27030:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0()); 
@@ -83043,17 +88136,17 @@
 
 
     // $ANTLR start "rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1"
-    // InternalDataDSL.g:25455:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:27039:1: rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1 : ( ruleXAnnotationOrExpression ) ;
     public final void rule__XAnnotationElementValue__ElementsAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25459:1: ( ( ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:25460:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27043:1: ( ( ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:27044:2: ( ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:25460:2: ( ruleXAnnotationOrExpression )
-            // InternalDataDSL.g:25461:3: ruleXAnnotationOrExpression
+            // InternalDataDSL.g:27044:2: ( ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:27045:3: ruleXAnnotationOrExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0()); 
@@ -83088,23 +88181,23 @@
 
 
     // $ANTLR start "rule__XAssignment__FeatureAssignment_0_1"
-    // InternalDataDSL.g:25470:1: rule__XAssignment__FeatureAssignment_0_1 : ( ( ruleFeatureCallID ) ) ;
+    // InternalDataDSL.g:27054:1: rule__XAssignment__FeatureAssignment_0_1 : ( ( ruleFeatureCallID ) ) ;
     public final void rule__XAssignment__FeatureAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25474:1: ( ( ( ruleFeatureCallID ) ) )
-            // InternalDataDSL.g:25475:2: ( ( ruleFeatureCallID ) )
+            // InternalDataDSL.g:27058:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalDataDSL.g:27059:2: ( ( ruleFeatureCallID ) )
             {
-            // InternalDataDSL.g:25475:2: ( ( ruleFeatureCallID ) )
-            // InternalDataDSL.g:25476:3: ( ruleFeatureCallID )
+            // InternalDataDSL.g:27059:2: ( ( ruleFeatureCallID ) )
+            // InternalDataDSL.g:27060:3: ( ruleFeatureCallID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
             }
-            // InternalDataDSL.g:25477:3: ( ruleFeatureCallID )
-            // InternalDataDSL.g:25478:4: ruleFeatureCallID
+            // InternalDataDSL.g:27061:3: ( ruleFeatureCallID )
+            // InternalDataDSL.g:27062:4: ruleFeatureCallID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_0_1_0_1()); 
@@ -83145,17 +88238,17 @@
 
 
     // $ANTLR start "rule__XAssignment__ValueAssignment_0_3"
-    // InternalDataDSL.g:25489:1: rule__XAssignment__ValueAssignment_0_3 : ( ruleXAssignment ) ;
+    // InternalDataDSL.g:27073:1: rule__XAssignment__ValueAssignment_0_3 : ( ruleXAssignment ) ;
     public final void rule__XAssignment__ValueAssignment_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25493:1: ( ( ruleXAssignment ) )
-            // InternalDataDSL.g:25494:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27077:1: ( ( ruleXAssignment ) )
+            // InternalDataDSL.g:27078:2: ( ruleXAssignment )
             {
-            // InternalDataDSL.g:25494:2: ( ruleXAssignment )
-            // InternalDataDSL.g:25495:3: ruleXAssignment
+            // InternalDataDSL.g:27078:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27079:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getValueXAssignmentParserRuleCall_0_3_0()); 
@@ -83190,23 +88283,23 @@
 
 
     // $ANTLR start "rule__XAssignment__FeatureAssignment_1_1_0_0_1"
-    // InternalDataDSL.g:25504:1: rule__XAssignment__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpMultiAssign ) ) ;
+    // InternalDataDSL.g:27088:1: rule__XAssignment__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpMultiAssign ) ) ;
     public final void rule__XAssignment__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25508:1: ( ( ( ruleOpMultiAssign ) ) )
-            // InternalDataDSL.g:25509:2: ( ( ruleOpMultiAssign ) )
+            // InternalDataDSL.g:27092:1: ( ( ( ruleOpMultiAssign ) ) )
+            // InternalDataDSL.g:27093:2: ( ( ruleOpMultiAssign ) )
             {
-            // InternalDataDSL.g:25509:2: ( ( ruleOpMultiAssign ) )
-            // InternalDataDSL.g:25510:3: ( ruleOpMultiAssign )
+            // InternalDataDSL.g:27093:2: ( ( ruleOpMultiAssign ) )
+            // InternalDataDSL.g:27094:3: ( ruleOpMultiAssign )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25511:3: ( ruleOpMultiAssign )
-            // InternalDataDSL.g:25512:4: ruleOpMultiAssign
+            // InternalDataDSL.g:27095:3: ( ruleOpMultiAssign )
+            // InternalDataDSL.g:27096:4: ruleOpMultiAssign
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementOpMultiAssignParserRuleCall_1_1_0_0_1_0_1()); 
@@ -83247,17 +88340,17 @@
 
 
     // $ANTLR start "rule__XAssignment__RightOperandAssignment_1_1_1"
-    // InternalDataDSL.g:25523:1: rule__XAssignment__RightOperandAssignment_1_1_1 : ( ruleXAssignment ) ;
+    // InternalDataDSL.g:27107:1: rule__XAssignment__RightOperandAssignment_1_1_1 : ( ruleXAssignment ) ;
     public final void rule__XAssignment__RightOperandAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25527:1: ( ( ruleXAssignment ) )
-            // InternalDataDSL.g:25528:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27111:1: ( ( ruleXAssignment ) )
+            // InternalDataDSL.g:27112:2: ( ruleXAssignment )
             {
-            // InternalDataDSL.g:25528:2: ( ruleXAssignment )
-            // InternalDataDSL.g:25529:3: ruleXAssignment
+            // InternalDataDSL.g:27112:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27113:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAssignmentAccess().getRightOperandXAssignmentParserRuleCall_1_1_1_0()); 
@@ -83292,23 +88385,23 @@
 
 
     // $ANTLR start "rule__XOrExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25538:1: rule__XOrExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOr ) ) ;
+    // InternalDataDSL.g:27122:1: rule__XOrExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOr ) ) ;
     public final void rule__XOrExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25542:1: ( ( ( ruleOpOr ) ) )
-            // InternalDataDSL.g:25543:2: ( ( ruleOpOr ) )
+            // InternalDataDSL.g:27126:1: ( ( ( ruleOpOr ) ) )
+            // InternalDataDSL.g:27127:2: ( ( ruleOpOr ) )
             {
-            // InternalDataDSL.g:25543:2: ( ( ruleOpOr ) )
-            // InternalDataDSL.g:25544:3: ( ruleOpOr )
+            // InternalDataDSL.g:27127:2: ( ( ruleOpOr ) )
+            // InternalDataDSL.g:27128:3: ( ruleOpOr )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25545:3: ( ruleOpOr )
-            // InternalDataDSL.g:25546:4: ruleOpOr
+            // InternalDataDSL.g:27129:3: ( ruleOpOr )
+            // InternalDataDSL.g:27130:4: ruleOpOr
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementOpOrParserRuleCall_1_0_0_1_0_1()); 
@@ -83349,17 +88442,17 @@
 
 
     // $ANTLR start "rule__XOrExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25557:1: rule__XOrExpression__RightOperandAssignment_1_1 : ( ruleXAndExpression ) ;
+    // InternalDataDSL.g:27141:1: rule__XOrExpression__RightOperandAssignment_1_1 : ( ruleXAndExpression ) ;
     public final void rule__XOrExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25561:1: ( ( ruleXAndExpression ) )
-            // InternalDataDSL.g:25562:2: ( ruleXAndExpression )
+            // InternalDataDSL.g:27145:1: ( ( ruleXAndExpression ) )
+            // InternalDataDSL.g:27146:2: ( ruleXAndExpression )
             {
-            // InternalDataDSL.g:25562:2: ( ruleXAndExpression )
-            // InternalDataDSL.g:25563:3: ruleXAndExpression
+            // InternalDataDSL.g:27146:2: ( ruleXAndExpression )
+            // InternalDataDSL.g:27147:3: ruleXAndExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0()); 
@@ -83394,23 +88487,23 @@
 
 
     // $ANTLR start "rule__XAndExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25572:1: rule__XAndExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAnd ) ) ;
+    // InternalDataDSL.g:27156:1: rule__XAndExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAnd ) ) ;
     public final void rule__XAndExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25576:1: ( ( ( ruleOpAnd ) ) )
-            // InternalDataDSL.g:25577:2: ( ( ruleOpAnd ) )
+            // InternalDataDSL.g:27160:1: ( ( ( ruleOpAnd ) ) )
+            // InternalDataDSL.g:27161:2: ( ( ruleOpAnd ) )
             {
-            // InternalDataDSL.g:25577:2: ( ( ruleOpAnd ) )
-            // InternalDataDSL.g:25578:3: ( ruleOpAnd )
+            // InternalDataDSL.g:27161:2: ( ( ruleOpAnd ) )
+            // InternalDataDSL.g:27162:3: ( ruleOpAnd )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25579:3: ( ruleOpAnd )
-            // InternalDataDSL.g:25580:4: ruleOpAnd
+            // InternalDataDSL.g:27163:3: ( ruleOpAnd )
+            // InternalDataDSL.g:27164:4: ruleOpAnd
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementOpAndParserRuleCall_1_0_0_1_0_1()); 
@@ -83451,17 +88544,17 @@
 
 
     // $ANTLR start "rule__XAndExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25591:1: rule__XAndExpression__RightOperandAssignment_1_1 : ( ruleXEqualityExpression ) ;
+    // InternalDataDSL.g:27175:1: rule__XAndExpression__RightOperandAssignment_1_1 : ( ruleXEqualityExpression ) ;
     public final void rule__XAndExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25595:1: ( ( ruleXEqualityExpression ) )
-            // InternalDataDSL.g:25596:2: ( ruleXEqualityExpression )
+            // InternalDataDSL.g:27179:1: ( ( ruleXEqualityExpression ) )
+            // InternalDataDSL.g:27180:2: ( ruleXEqualityExpression )
             {
-            // InternalDataDSL.g:25596:2: ( ruleXEqualityExpression )
-            // InternalDataDSL.g:25597:3: ruleXEqualityExpression
+            // InternalDataDSL.g:27180:2: ( ruleXEqualityExpression )
+            // InternalDataDSL.g:27181:3: ruleXEqualityExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0()); 
@@ -83496,23 +88589,23 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25606:1: rule__XEqualityExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpEquality ) ) ;
+    // InternalDataDSL.g:27190:1: rule__XEqualityExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpEquality ) ) ;
     public final void rule__XEqualityExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25610:1: ( ( ( ruleOpEquality ) ) )
-            // InternalDataDSL.g:25611:2: ( ( ruleOpEquality ) )
+            // InternalDataDSL.g:27194:1: ( ( ( ruleOpEquality ) ) )
+            // InternalDataDSL.g:27195:2: ( ( ruleOpEquality ) )
             {
-            // InternalDataDSL.g:25611:2: ( ( ruleOpEquality ) )
-            // InternalDataDSL.g:25612:3: ( ruleOpEquality )
+            // InternalDataDSL.g:27195:2: ( ( ruleOpEquality ) )
+            // InternalDataDSL.g:27196:3: ( ruleOpEquality )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25613:3: ( ruleOpEquality )
-            // InternalDataDSL.g:25614:4: ruleOpEquality
+            // InternalDataDSL.g:27197:3: ( ruleOpEquality )
+            // InternalDataDSL.g:27198:4: ruleOpEquality
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementOpEqualityParserRuleCall_1_0_0_1_0_1()); 
@@ -83553,17 +88646,17 @@
 
 
     // $ANTLR start "rule__XEqualityExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25625:1: rule__XEqualityExpression__RightOperandAssignment_1_1 : ( ruleXRelationalExpression ) ;
+    // InternalDataDSL.g:27209:1: rule__XEqualityExpression__RightOperandAssignment_1_1 : ( ruleXRelationalExpression ) ;
     public final void rule__XEqualityExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25629:1: ( ( ruleXRelationalExpression ) )
-            // InternalDataDSL.g:25630:2: ( ruleXRelationalExpression )
+            // InternalDataDSL.g:27213:1: ( ( ruleXRelationalExpression ) )
+            // InternalDataDSL.g:27214:2: ( ruleXRelationalExpression )
             {
-            // InternalDataDSL.g:25630:2: ( ruleXRelationalExpression )
-            // InternalDataDSL.g:25631:3: ruleXRelationalExpression
+            // InternalDataDSL.g:27214:2: ( ruleXRelationalExpression )
+            // InternalDataDSL.g:27215:3: ruleXRelationalExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0()); 
@@ -83598,17 +88691,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__TypeAssignment_1_0_1"
-    // InternalDataDSL.g:25640:1: rule__XRelationalExpression__TypeAssignment_1_0_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:27224:1: rule__XRelationalExpression__TypeAssignment_1_0_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XRelationalExpression__TypeAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25644:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:25645:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:27228:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:27229:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:25645:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:25646:3: ruleJvmTypeReference
+            // InternalDataDSL.g:27229:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:27230:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0()); 
@@ -83643,23 +88736,23 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1"
-    // InternalDataDSL.g:25655:1: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpCompare ) ) ;
+    // InternalDataDSL.g:27239:1: rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1 : ( ( ruleOpCompare ) ) ;
     public final void rule__XRelationalExpression__FeatureAssignment_1_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25659:1: ( ( ( ruleOpCompare ) ) )
-            // InternalDataDSL.g:25660:2: ( ( ruleOpCompare ) )
+            // InternalDataDSL.g:27243:1: ( ( ( ruleOpCompare ) ) )
+            // InternalDataDSL.g:27244:2: ( ( ruleOpCompare ) )
             {
-            // InternalDataDSL.g:25660:2: ( ( ruleOpCompare ) )
-            // InternalDataDSL.g:25661:3: ( ruleOpCompare )
+            // InternalDataDSL.g:27244:2: ( ( ruleOpCompare ) )
+            // InternalDataDSL.g:27245:3: ( ruleOpCompare )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25662:3: ( ruleOpCompare )
-            // InternalDataDSL.g:25663:4: ruleOpCompare
+            // InternalDataDSL.g:27246:3: ( ruleOpCompare )
+            // InternalDataDSL.g:27247:4: ruleOpCompare
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementOpCompareParserRuleCall_1_1_0_0_1_0_1()); 
@@ -83700,17 +88793,17 @@
 
 
     // $ANTLR start "rule__XRelationalExpression__RightOperandAssignment_1_1_1"
-    // InternalDataDSL.g:25674:1: rule__XRelationalExpression__RightOperandAssignment_1_1_1 : ( ruleXOtherOperatorExpression ) ;
+    // InternalDataDSL.g:27258:1: rule__XRelationalExpression__RightOperandAssignment_1_1_1 : ( ruleXOtherOperatorExpression ) ;
     public final void rule__XRelationalExpression__RightOperandAssignment_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25678:1: ( ( ruleXOtherOperatorExpression ) )
-            // InternalDataDSL.g:25679:2: ( ruleXOtherOperatorExpression )
+            // InternalDataDSL.g:27262:1: ( ( ruleXOtherOperatorExpression ) )
+            // InternalDataDSL.g:27263:2: ( ruleXOtherOperatorExpression )
             {
-            // InternalDataDSL.g:25679:2: ( ruleXOtherOperatorExpression )
-            // InternalDataDSL.g:25680:3: ruleXOtherOperatorExpression
+            // InternalDataDSL.g:27263:2: ( ruleXOtherOperatorExpression )
+            // InternalDataDSL.g:27264:3: ruleXOtherOperatorExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0()); 
@@ -83745,23 +88838,23 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25689:1: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOther ) ) ;
+    // InternalDataDSL.g:27273:1: rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpOther ) ) ;
     public final void rule__XOtherOperatorExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25693:1: ( ( ( ruleOpOther ) ) )
-            // InternalDataDSL.g:25694:2: ( ( ruleOpOther ) )
+            // InternalDataDSL.g:27277:1: ( ( ( ruleOpOther ) ) )
+            // InternalDataDSL.g:27278:2: ( ( ruleOpOther ) )
             {
-            // InternalDataDSL.g:25694:2: ( ( ruleOpOther ) )
-            // InternalDataDSL.g:25695:3: ( ruleOpOther )
+            // InternalDataDSL.g:27278:2: ( ( ruleOpOther ) )
+            // InternalDataDSL.g:27279:3: ( ruleOpOther )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25696:3: ( ruleOpOther )
-            // InternalDataDSL.g:25697:4: ruleOpOther
+            // InternalDataDSL.g:27280:3: ( ruleOpOther )
+            // InternalDataDSL.g:27281:4: ruleOpOther
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementOpOtherParserRuleCall_1_0_0_1_0_1()); 
@@ -83802,17 +88895,17 @@
 
 
     // $ANTLR start "rule__XOtherOperatorExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25708:1: rule__XOtherOperatorExpression__RightOperandAssignment_1_1 : ( ruleXAdditiveExpression ) ;
+    // InternalDataDSL.g:27292:1: rule__XOtherOperatorExpression__RightOperandAssignment_1_1 : ( ruleXAdditiveExpression ) ;
     public final void rule__XOtherOperatorExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25712:1: ( ( ruleXAdditiveExpression ) )
-            // InternalDataDSL.g:25713:2: ( ruleXAdditiveExpression )
+            // InternalDataDSL.g:27296:1: ( ( ruleXAdditiveExpression ) )
+            // InternalDataDSL.g:27297:2: ( ruleXAdditiveExpression )
             {
-            // InternalDataDSL.g:25713:2: ( ruleXAdditiveExpression )
-            // InternalDataDSL.g:25714:3: ruleXAdditiveExpression
+            // InternalDataDSL.g:27297:2: ( ruleXAdditiveExpression )
+            // InternalDataDSL.g:27298:3: ruleXAdditiveExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0()); 
@@ -83847,23 +88940,23 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25723:1: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAdd ) ) ;
+    // InternalDataDSL.g:27307:1: rule__XAdditiveExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpAdd ) ) ;
     public final void rule__XAdditiveExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25727:1: ( ( ( ruleOpAdd ) ) )
-            // InternalDataDSL.g:25728:2: ( ( ruleOpAdd ) )
+            // InternalDataDSL.g:27311:1: ( ( ( ruleOpAdd ) ) )
+            // InternalDataDSL.g:27312:2: ( ( ruleOpAdd ) )
             {
-            // InternalDataDSL.g:25728:2: ( ( ruleOpAdd ) )
-            // InternalDataDSL.g:25729:3: ( ruleOpAdd )
+            // InternalDataDSL.g:27312:2: ( ( ruleOpAdd ) )
+            // InternalDataDSL.g:27313:3: ( ruleOpAdd )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25730:3: ( ruleOpAdd )
-            // InternalDataDSL.g:25731:4: ruleOpAdd
+            // InternalDataDSL.g:27314:3: ( ruleOpAdd )
+            // InternalDataDSL.g:27315:4: ruleOpAdd
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementOpAddParserRuleCall_1_0_0_1_0_1()); 
@@ -83904,17 +88997,17 @@
 
 
     // $ANTLR start "rule__XAdditiveExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25742:1: rule__XAdditiveExpression__RightOperandAssignment_1_1 : ( ruleXMultiplicativeExpression ) ;
+    // InternalDataDSL.g:27326:1: rule__XAdditiveExpression__RightOperandAssignment_1_1 : ( ruleXMultiplicativeExpression ) ;
     public final void rule__XAdditiveExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25746:1: ( ( ruleXMultiplicativeExpression ) )
-            // InternalDataDSL.g:25747:2: ( ruleXMultiplicativeExpression )
+            // InternalDataDSL.g:27330:1: ( ( ruleXMultiplicativeExpression ) )
+            // InternalDataDSL.g:27331:2: ( ruleXMultiplicativeExpression )
             {
-            // InternalDataDSL.g:25747:2: ( ruleXMultiplicativeExpression )
-            // InternalDataDSL.g:25748:3: ruleXMultiplicativeExpression
+            // InternalDataDSL.g:27331:2: ( ruleXMultiplicativeExpression )
+            // InternalDataDSL.g:27332:3: ruleXMultiplicativeExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0()); 
@@ -83949,23 +89042,23 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1"
-    // InternalDataDSL.g:25757:1: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpMulti ) ) ;
+    // InternalDataDSL.g:27341:1: rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1 : ( ( ruleOpMulti ) ) ;
     public final void rule__XMultiplicativeExpression__FeatureAssignment_1_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25761:1: ( ( ( ruleOpMulti ) ) )
-            // InternalDataDSL.g:25762:2: ( ( ruleOpMulti ) )
+            // InternalDataDSL.g:27345:1: ( ( ( ruleOpMulti ) ) )
+            // InternalDataDSL.g:27346:2: ( ( ruleOpMulti ) )
             {
-            // InternalDataDSL.g:25762:2: ( ( ruleOpMulti ) )
-            // InternalDataDSL.g:25763:3: ( ruleOpMulti )
+            // InternalDataDSL.g:27346:2: ( ( ruleOpMulti ) )
+            // InternalDataDSL.g:27347:3: ( ruleOpMulti )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0()); 
             }
-            // InternalDataDSL.g:25764:3: ( ruleOpMulti )
-            // InternalDataDSL.g:25765:4: ruleOpMulti
+            // InternalDataDSL.g:27348:3: ( ruleOpMulti )
+            // InternalDataDSL.g:27349:4: ruleOpMulti
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementOpMultiParserRuleCall_1_0_0_1_0_1()); 
@@ -84006,17 +89099,17 @@
 
 
     // $ANTLR start "rule__XMultiplicativeExpression__RightOperandAssignment_1_1"
-    // InternalDataDSL.g:25776:1: rule__XMultiplicativeExpression__RightOperandAssignment_1_1 : ( ruleXUnaryOperation ) ;
+    // InternalDataDSL.g:27360:1: rule__XMultiplicativeExpression__RightOperandAssignment_1_1 : ( ruleXUnaryOperation ) ;
     public final void rule__XMultiplicativeExpression__RightOperandAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25780:1: ( ( ruleXUnaryOperation ) )
-            // InternalDataDSL.g:25781:2: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:27364:1: ( ( ruleXUnaryOperation ) )
+            // InternalDataDSL.g:27365:2: ( ruleXUnaryOperation )
             {
-            // InternalDataDSL.g:25781:2: ( ruleXUnaryOperation )
-            // InternalDataDSL.g:25782:3: ruleXUnaryOperation
+            // InternalDataDSL.g:27365:2: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:27366:3: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0()); 
@@ -84051,23 +89144,23 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__FeatureAssignment_0_1"
-    // InternalDataDSL.g:25791:1: rule__XUnaryOperation__FeatureAssignment_0_1 : ( ( ruleOpUnary ) ) ;
+    // InternalDataDSL.g:27375:1: rule__XUnaryOperation__FeatureAssignment_0_1 : ( ( ruleOpUnary ) ) ;
     public final void rule__XUnaryOperation__FeatureAssignment_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25795:1: ( ( ( ruleOpUnary ) ) )
-            // InternalDataDSL.g:25796:2: ( ( ruleOpUnary ) )
+            // InternalDataDSL.g:27379:1: ( ( ( ruleOpUnary ) ) )
+            // InternalDataDSL.g:27380:2: ( ( ruleOpUnary ) )
             {
-            // InternalDataDSL.g:25796:2: ( ( ruleOpUnary ) )
-            // InternalDataDSL.g:25797:3: ( ruleOpUnary )
+            // InternalDataDSL.g:27380:2: ( ( ruleOpUnary ) )
+            // InternalDataDSL.g:27381:3: ( ruleOpUnary )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0()); 
             }
-            // InternalDataDSL.g:25798:3: ( ruleOpUnary )
-            // InternalDataDSL.g:25799:4: ruleOpUnary
+            // InternalDataDSL.g:27382:3: ( ruleOpUnary )
+            // InternalDataDSL.g:27383:4: ruleOpUnary
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementOpUnaryParserRuleCall_0_1_0_1()); 
@@ -84108,17 +89201,17 @@
 
 
     // $ANTLR start "rule__XUnaryOperation__OperandAssignment_0_2"
-    // InternalDataDSL.g:25810:1: rule__XUnaryOperation__OperandAssignment_0_2 : ( ruleXUnaryOperation ) ;
+    // InternalDataDSL.g:27394:1: rule__XUnaryOperation__OperandAssignment_0_2 : ( ruleXUnaryOperation ) ;
     public final void rule__XUnaryOperation__OperandAssignment_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25814:1: ( ( ruleXUnaryOperation ) )
-            // InternalDataDSL.g:25815:2: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:27398:1: ( ( ruleXUnaryOperation ) )
+            // InternalDataDSL.g:27399:2: ( ruleXUnaryOperation )
             {
-            // InternalDataDSL.g:25815:2: ( ruleXUnaryOperation )
-            // InternalDataDSL.g:25816:3: ruleXUnaryOperation
+            // InternalDataDSL.g:27399:2: ( ruleXUnaryOperation )
+            // InternalDataDSL.g:27400:3: ruleXUnaryOperation
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXUnaryOperationAccess().getOperandXUnaryOperationParserRuleCall_0_2_0()); 
@@ -84153,17 +89246,17 @@
 
 
     // $ANTLR start "rule__XCastedExpression__TypeAssignment_1_1"
-    // InternalDataDSL.g:25825:1: rule__XCastedExpression__TypeAssignment_1_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:27409:1: rule__XCastedExpression__TypeAssignment_1_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XCastedExpression__TypeAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25829:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:25830:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:27413:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:27414:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:25830:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:25831:3: ruleJvmTypeReference
+            // InternalDataDSL.g:27414:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:27415:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0()); 
@@ -84198,23 +89291,23 @@
 
 
     // $ANTLR start "rule__XPostfixOperation__FeatureAssignment_1_0_1"
-    // InternalDataDSL.g:25840:1: rule__XPostfixOperation__FeatureAssignment_1_0_1 : ( ( ruleOpPostfix ) ) ;
+    // InternalDataDSL.g:27424:1: rule__XPostfixOperation__FeatureAssignment_1_0_1 : ( ( ruleOpPostfix ) ) ;
     public final void rule__XPostfixOperation__FeatureAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25844:1: ( ( ( ruleOpPostfix ) ) )
-            // InternalDataDSL.g:25845:2: ( ( ruleOpPostfix ) )
+            // InternalDataDSL.g:27428:1: ( ( ( ruleOpPostfix ) ) )
+            // InternalDataDSL.g:27429:2: ( ( ruleOpPostfix ) )
             {
-            // InternalDataDSL.g:25845:2: ( ( ruleOpPostfix ) )
-            // InternalDataDSL.g:25846:3: ( ruleOpPostfix )
+            // InternalDataDSL.g:27429:2: ( ( ruleOpPostfix ) )
+            // InternalDataDSL.g:27430:3: ( ruleOpPostfix )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_1_0()); 
             }
-            // InternalDataDSL.g:25847:3: ( ruleOpPostfix )
-            // InternalDataDSL.g:25848:4: ruleOpPostfix
+            // InternalDataDSL.g:27431:3: ( ruleOpPostfix )
+            // InternalDataDSL.g:27432:4: ruleOpPostfix
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXPostfixOperationAccess().getFeatureJvmIdentifiableElementOpPostfixParserRuleCall_1_0_1_0_1()); 
@@ -84255,28 +89348,28 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1"
-    // InternalDataDSL.g:25859:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 : ( ( '::' ) ) ;
+    // InternalDataDSL.g:27443:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1 : ( ( '::' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_0_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25863:1: ( ( ( '::' ) ) )
-            // InternalDataDSL.g:25864:2: ( ( '::' ) )
+            // InternalDataDSL.g:27447:1: ( ( ( '::' ) ) )
+            // InternalDataDSL.g:27448:2: ( ( '::' ) )
             {
-            // InternalDataDSL.g:25864:2: ( ( '::' ) )
-            // InternalDataDSL.g:25865:3: ( '::' )
+            // InternalDataDSL.g:27448:2: ( ( '::' ) )
+            // InternalDataDSL.g:27449:3: ( '::' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
             }
-            // InternalDataDSL.g:25866:3: ( '::' )
-            // InternalDataDSL.g:25867:4: '::'
+            // InternalDataDSL.g:27450:3: ( '::' )
+            // InternalDataDSL.g:27451:4: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
             }
-            match(input,162,FOLLOW_2); if (state.failed) return ;
+            match(input,175,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0()); 
             }
@@ -84308,23 +89401,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2"
-    // InternalDataDSL.g:25878:1: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 : ( ( ruleFeatureCallID ) ) ;
+    // InternalDataDSL.g:27462:1: rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2 : ( ( ruleFeatureCallID ) ) ;
     public final void rule__XMemberFeatureCall__FeatureAssignment_1_0_0_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25882:1: ( ( ( ruleFeatureCallID ) ) )
-            // InternalDataDSL.g:25883:2: ( ( ruleFeatureCallID ) )
+            // InternalDataDSL.g:27466:1: ( ( ( ruleFeatureCallID ) ) )
+            // InternalDataDSL.g:27467:2: ( ( ruleFeatureCallID ) )
             {
-            // InternalDataDSL.g:25883:2: ( ( ruleFeatureCallID ) )
-            // InternalDataDSL.g:25884:3: ( ruleFeatureCallID )
+            // InternalDataDSL.g:27467:2: ( ( ruleFeatureCallID ) )
+            // InternalDataDSL.g:27468:3: ( ruleFeatureCallID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0()); 
             }
-            // InternalDataDSL.g:25885:3: ( ruleFeatureCallID )
-            // InternalDataDSL.g:25886:4: ruleFeatureCallID
+            // InternalDataDSL.g:27469:3: ( ruleFeatureCallID )
+            // InternalDataDSL.g:27470:4: ruleFeatureCallID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementFeatureCallIDParserRuleCall_1_0_0_0_2_0_1()); 
@@ -84365,17 +89458,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ValueAssignment_1_0_1"
-    // InternalDataDSL.g:25897:1: rule__XMemberFeatureCall__ValueAssignment_1_0_1 : ( ruleXAssignment ) ;
+    // InternalDataDSL.g:27481:1: rule__XMemberFeatureCall__ValueAssignment_1_0_1 : ( ruleXAssignment ) ;
     public final void rule__XMemberFeatureCall__ValueAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25901:1: ( ( ruleXAssignment ) )
-            // InternalDataDSL.g:25902:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27485:1: ( ( ruleXAssignment ) )
+            // InternalDataDSL.g:27486:2: ( ruleXAssignment )
             {
-            // InternalDataDSL.g:25902:2: ( ruleXAssignment )
-            // InternalDataDSL.g:25903:3: ruleXAssignment
+            // InternalDataDSL.g:27486:2: ( ruleXAssignment )
+            // InternalDataDSL.g:27487:3: ruleXAssignment
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0()); 
@@ -84410,28 +89503,28 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1"
-    // InternalDataDSL.g:25912:1: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 : ( ( '?.' ) ) ;
+    // InternalDataDSL.g:27496:1: rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1 : ( ( '?.' ) ) ;
     public final void rule__XMemberFeatureCall__NullSafeAssignment_1_1_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25916:1: ( ( ( '?.' ) ) )
-            // InternalDataDSL.g:25917:2: ( ( '?.' ) )
+            // InternalDataDSL.g:27500:1: ( ( ( '?.' ) ) )
+            // InternalDataDSL.g:27501:2: ( ( '?.' ) )
             {
-            // InternalDataDSL.g:25917:2: ( ( '?.' ) )
-            // InternalDataDSL.g:25918:3: ( '?.' )
+            // InternalDataDSL.g:27501:2: ( ( '?.' ) )
+            // InternalDataDSL.g:27502:3: ( '?.' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
             }
-            // InternalDataDSL.g:25919:3: ( '?.' )
-            // InternalDataDSL.g:25920:4: '?.'
+            // InternalDataDSL.g:27503:3: ( '?.' )
+            // InternalDataDSL.g:27504:4: '?.'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
             }
-            match(input,163,FOLLOW_2); if (state.failed) return ;
+            match(input,176,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0()); 
             }
@@ -84463,28 +89556,28 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2"
-    // InternalDataDSL.g:25931:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 : ( ( '::' ) ) ;
+    // InternalDataDSL.g:27515:1: rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2 : ( ( '::' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitStaticAssignment_1_1_0_0_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25935:1: ( ( ( '::' ) ) )
-            // InternalDataDSL.g:25936:2: ( ( '::' ) )
+            // InternalDataDSL.g:27519:1: ( ( ( '::' ) ) )
+            // InternalDataDSL.g:27520:2: ( ( '::' ) )
             {
-            // InternalDataDSL.g:25936:2: ( ( '::' ) )
-            // InternalDataDSL.g:25937:3: ( '::' )
+            // InternalDataDSL.g:27520:2: ( ( '::' ) )
+            // InternalDataDSL.g:27521:3: ( '::' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
             }
-            // InternalDataDSL.g:25938:3: ( '::' )
-            // InternalDataDSL.g:25939:4: '::'
+            // InternalDataDSL.g:27522:3: ( '::' )
+            // InternalDataDSL.g:27523:4: '::'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
             }
-            match(input,162,FOLLOW_2); if (state.failed) return ;
+            match(input,175,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0()); 
             }
@@ -84516,17 +89609,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1"
-    // InternalDataDSL.g:25950:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:27534:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25954:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:25955:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:27538:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:27539:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:25955:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:25956:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:27539:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:27540:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0()); 
@@ -84561,17 +89654,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1"
-    // InternalDataDSL.g:25965:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:27549:1: rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XMemberFeatureCall__TypeArgumentsAssignment_1_1_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25969:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:25970:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:27553:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:27554:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:25970:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:25971:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:27554:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:27555:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0()); 
@@ -84606,23 +89699,23 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__FeatureAssignment_1_1_2"
-    // InternalDataDSL.g:25980:1: rule__XMemberFeatureCall__FeatureAssignment_1_1_2 : ( ( ruleIdOrSuper ) ) ;
+    // InternalDataDSL.g:27564:1: rule__XMemberFeatureCall__FeatureAssignment_1_1_2 : ( ( ruleIdOrSuper ) ) ;
     public final void rule__XMemberFeatureCall__FeatureAssignment_1_1_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:25984:1: ( ( ( ruleIdOrSuper ) ) )
-            // InternalDataDSL.g:25985:2: ( ( ruleIdOrSuper ) )
+            // InternalDataDSL.g:27568:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalDataDSL.g:27569:2: ( ( ruleIdOrSuper ) )
             {
-            // InternalDataDSL.g:25985:2: ( ( ruleIdOrSuper ) )
-            // InternalDataDSL.g:25986:3: ( ruleIdOrSuper )
+            // InternalDataDSL.g:27569:2: ( ( ruleIdOrSuper ) )
+            // InternalDataDSL.g:27570:3: ( ruleIdOrSuper )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0()); 
             }
-            // InternalDataDSL.g:25987:3: ( ruleIdOrSuper )
-            // InternalDataDSL.g:25988:4: ruleIdOrSuper
+            // InternalDataDSL.g:27571:3: ( ruleIdOrSuper )
+            // InternalDataDSL.g:27572:4: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_1_1_2_0_1()); 
@@ -84663,28 +89756,28 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0"
-    // InternalDataDSL.g:25999:1: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 : ( ( '(' ) ) ;
+    // InternalDataDSL.g:27583:1: rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0 : ( ( '(' ) ) ;
     public final void rule__XMemberFeatureCall__ExplicitOperationCallAssignment_1_1_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26003:1: ( ( ( '(' ) ) )
-            // InternalDataDSL.g:26004:2: ( ( '(' ) )
+            // InternalDataDSL.g:27587:1: ( ( ( '(' ) ) )
+            // InternalDataDSL.g:27588:2: ( ( '(' ) )
             {
-            // InternalDataDSL.g:26004:2: ( ( '(' ) )
-            // InternalDataDSL.g:26005:3: ( '(' )
+            // InternalDataDSL.g:27588:2: ( ( '(' ) )
+            // InternalDataDSL.g:27589:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
             }
-            // InternalDataDSL.g:26006:3: ( '(' )
-            // InternalDataDSL.g:26007:4: '('
+            // InternalDataDSL.g:27590:3: ( '(' )
+            // InternalDataDSL.g:27591:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0()); 
             }
@@ -84716,17 +89809,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0"
-    // InternalDataDSL.g:26018:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 : ( ruleXShortClosure ) ;
+    // InternalDataDSL.g:27602:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26022:1: ( ( ruleXShortClosure ) )
-            // InternalDataDSL.g:26023:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:27606:1: ( ( ruleXShortClosure ) )
+            // InternalDataDSL.g:27607:2: ( ruleXShortClosure )
             {
-            // InternalDataDSL.g:26023:2: ( ruleXShortClosure )
-            // InternalDataDSL.g:26024:3: ruleXShortClosure
+            // InternalDataDSL.g:27607:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:27608:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0()); 
@@ -84761,17 +89854,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0"
-    // InternalDataDSL.g:26033:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27617:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26037:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26038:2: ( ruleXExpression )
+            // InternalDataDSL.g:27621:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27622:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26038:2: ( ruleXExpression )
-            // InternalDataDSL.g:26039:3: ruleXExpression
+            // InternalDataDSL.g:27622:2: ( ruleXExpression )
+            // InternalDataDSL.g:27623:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0()); 
@@ -84806,17 +89899,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1"
-    // InternalDataDSL.g:26048:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27632:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26052:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26053:2: ( ruleXExpression )
+            // InternalDataDSL.g:27636:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27637:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26053:2: ( ruleXExpression )
-            // InternalDataDSL.g:26054:3: ruleXExpression
+            // InternalDataDSL.g:27637:2: ( ruleXExpression )
+            // InternalDataDSL.g:27638:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0()); 
@@ -84851,17 +89944,17 @@
 
 
     // $ANTLR start "rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4"
-    // InternalDataDSL.g:26063:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 : ( ruleXClosure ) ;
+    // InternalDataDSL.g:27647:1: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 : ( ruleXClosure ) ;
     public final void rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26067:1: ( ( ruleXClosure ) )
-            // InternalDataDSL.g:26068:2: ( ruleXClosure )
+            // InternalDataDSL.g:27651:1: ( ( ruleXClosure ) )
+            // InternalDataDSL.g:27652:2: ( ruleXClosure )
             {
-            // InternalDataDSL.g:26068:2: ( ruleXClosure )
-            // InternalDataDSL.g:26069:3: ruleXClosure
+            // InternalDataDSL.g:27652:2: ( ruleXClosure )
+            // InternalDataDSL.g:27653:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0()); 
@@ -84896,17 +89989,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_0"
-    // InternalDataDSL.g:26078:1: rule__XSetLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27662:1: rule__XSetLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
     public final void rule__XSetLiteral__ElementsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26082:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26083:2: ( ruleXExpression )
+            // InternalDataDSL.g:27666:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27667:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26083:2: ( ruleXExpression )
-            // InternalDataDSL.g:26084:3: ruleXExpression
+            // InternalDataDSL.g:27667:2: ( ruleXExpression )
+            // InternalDataDSL.g:27668:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
@@ -84941,17 +90034,17 @@
 
 
     // $ANTLR start "rule__XSetLiteral__ElementsAssignment_3_1_1"
-    // InternalDataDSL.g:26093:1: rule__XSetLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27677:1: rule__XSetLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XSetLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26097:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26098:2: ( ruleXExpression )
+            // InternalDataDSL.g:27681:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27682:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26098:2: ( ruleXExpression )
-            // InternalDataDSL.g:26099:3: ruleXExpression
+            // InternalDataDSL.g:27682:2: ( ruleXExpression )
+            // InternalDataDSL.g:27683:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
@@ -84986,17 +90079,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_0"
-    // InternalDataDSL.g:26108:1: rule__XListLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27692:1: rule__XListLiteral__ElementsAssignment_3_0 : ( ruleXExpression ) ;
     public final void rule__XListLiteral__ElementsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26112:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26113:2: ( ruleXExpression )
+            // InternalDataDSL.g:27696:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27697:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26113:2: ( ruleXExpression )
-            // InternalDataDSL.g:26114:3: ruleXExpression
+            // InternalDataDSL.g:27697:2: ( ruleXExpression )
+            // InternalDataDSL.g:27698:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0()); 
@@ -85031,17 +90124,17 @@
 
 
     // $ANTLR start "rule__XListLiteral__ElementsAssignment_3_1_1"
-    // InternalDataDSL.g:26123:1: rule__XListLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27707:1: rule__XListLiteral__ElementsAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XListLiteral__ElementsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26127:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26128:2: ( ruleXExpression )
+            // InternalDataDSL.g:27711:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27712:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26128:2: ( ruleXExpression )
-            // InternalDataDSL.g:26129:3: ruleXExpression
+            // InternalDataDSL.g:27712:2: ( ruleXExpression )
+            // InternalDataDSL.g:27713:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0()); 
@@ -85076,17 +90169,17 @@
 
 
     // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0"
-    // InternalDataDSL.g:26138:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27722:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26142:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26143:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27726:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27727:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26143:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26144:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27727:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27728:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0()); 
@@ -85121,17 +90214,17 @@
 
 
     // $ANTLR start "rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1"
-    // InternalDataDSL.g:26153:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27737:1: rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XClosure__DeclaredFormalParametersAssignment_1_0_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26157:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26158:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27741:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27742:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26158:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26159:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27742:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27743:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0()); 
@@ -85166,28 +90259,28 @@
 
 
     // $ANTLR start "rule__XClosure__ExplicitSyntaxAssignment_1_0_1"
-    // InternalDataDSL.g:26168:1: rule__XClosure__ExplicitSyntaxAssignment_1_0_1 : ( ( '|' ) ) ;
+    // InternalDataDSL.g:27752:1: rule__XClosure__ExplicitSyntaxAssignment_1_0_1 : ( ( '|' ) ) ;
     public final void rule__XClosure__ExplicitSyntaxAssignment_1_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26172:1: ( ( ( '|' ) ) )
-            // InternalDataDSL.g:26173:2: ( ( '|' ) )
+            // InternalDataDSL.g:27756:1: ( ( ( '|' ) ) )
+            // InternalDataDSL.g:27757:2: ( ( '|' ) )
             {
-            // InternalDataDSL.g:26173:2: ( ( '|' ) )
-            // InternalDataDSL.g:26174:3: ( '|' )
+            // InternalDataDSL.g:27757:2: ( ( '|' ) )
+            // InternalDataDSL.g:27758:3: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
             }
-            // InternalDataDSL.g:26175:3: ( '|' )
-            // InternalDataDSL.g:26176:4: '|'
+            // InternalDataDSL.g:27759:3: ( '|' )
+            // InternalDataDSL.g:27760:4: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
             }
-            match(input,164,FOLLOW_2); if (state.failed) return ;
+            match(input,177,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0()); 
             }
@@ -85219,17 +90312,17 @@
 
 
     // $ANTLR start "rule__XClosure__ExpressionAssignment_2"
-    // InternalDataDSL.g:26187:1: rule__XClosure__ExpressionAssignment_2 : ( ruleXExpressionInClosure ) ;
+    // InternalDataDSL.g:27771:1: rule__XClosure__ExpressionAssignment_2 : ( ruleXExpressionInClosure ) ;
     public final void rule__XClosure__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26191:1: ( ( ruleXExpressionInClosure ) )
-            // InternalDataDSL.g:26192:2: ( ruleXExpressionInClosure )
+            // InternalDataDSL.g:27775:1: ( ( ruleXExpressionInClosure ) )
+            // InternalDataDSL.g:27776:2: ( ruleXExpressionInClosure )
             {
-            // InternalDataDSL.g:26192:2: ( ruleXExpressionInClosure )
-            // InternalDataDSL.g:26193:3: ruleXExpressionInClosure
+            // InternalDataDSL.g:27776:2: ( ruleXExpressionInClosure )
+            // InternalDataDSL.g:27777:3: ruleXExpressionInClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0()); 
@@ -85264,17 +90357,17 @@
 
 
     // $ANTLR start "rule__XExpressionInClosure__ExpressionsAssignment_1_0"
-    // InternalDataDSL.g:26202:1: rule__XExpressionInClosure__ExpressionsAssignment_1_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalDataDSL.g:27786:1: rule__XExpressionInClosure__ExpressionsAssignment_1_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XExpressionInClosure__ExpressionsAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26206:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalDataDSL.g:26207:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:27790:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalDataDSL.g:27791:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalDataDSL.g:26207:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalDataDSL.g:26208:3: ruleXExpressionOrVarDeclaration
+            // InternalDataDSL.g:27791:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:27792:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0()); 
@@ -85309,17 +90402,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0"
-    // InternalDataDSL.g:26217:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27801:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26221:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26222:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27805:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27806:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26222:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26223:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27806:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27807:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0()); 
@@ -85354,17 +90447,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1"
-    // InternalDataDSL.g:26232:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27816:1: rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XShortClosure__DeclaredFormalParametersAssignment_0_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26236:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26237:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27820:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27821:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26237:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26238:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27821:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27822:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0()); 
@@ -85399,28 +90492,28 @@
 
 
     // $ANTLR start "rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2"
-    // InternalDataDSL.g:26247:1: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 : ( ( '|' ) ) ;
+    // InternalDataDSL.g:27831:1: rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2 : ( ( '|' ) ) ;
     public final void rule__XShortClosure__ExplicitSyntaxAssignment_0_0_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26251:1: ( ( ( '|' ) ) )
-            // InternalDataDSL.g:26252:2: ( ( '|' ) )
+            // InternalDataDSL.g:27835:1: ( ( ( '|' ) ) )
+            // InternalDataDSL.g:27836:2: ( ( '|' ) )
             {
-            // InternalDataDSL.g:26252:2: ( ( '|' ) )
-            // InternalDataDSL.g:26253:3: ( '|' )
+            // InternalDataDSL.g:27836:2: ( ( '|' ) )
+            // InternalDataDSL.g:27837:3: ( '|' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
             }
-            // InternalDataDSL.g:26254:3: ( '|' )
-            // InternalDataDSL.g:26255:4: '|'
+            // InternalDataDSL.g:27838:3: ( '|' )
+            // InternalDataDSL.g:27839:4: '|'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
             }
-            match(input,164,FOLLOW_2); if (state.failed) return ;
+            match(input,177,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0()); 
             }
@@ -85452,17 +90545,17 @@
 
 
     // $ANTLR start "rule__XShortClosure__ExpressionAssignment_1"
-    // InternalDataDSL.g:26266:1: rule__XShortClosure__ExpressionAssignment_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27850:1: rule__XShortClosure__ExpressionAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XShortClosure__ExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26270:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26271:2: ( ruleXExpression )
+            // InternalDataDSL.g:27854:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27855:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26271:2: ( ruleXExpression )
-            // InternalDataDSL.g:26272:3: ruleXExpression
+            // InternalDataDSL.g:27855:2: ( ruleXExpression )
+            // InternalDataDSL.g:27856:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXShortClosureAccess().getExpressionXExpressionParserRuleCall_1_0()); 
@@ -85497,17 +90590,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__IfAssignment_3"
-    // InternalDataDSL.g:26281:1: rule__XIfExpression__IfAssignment_3 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27865:1: rule__XIfExpression__IfAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__IfAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26285:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26286:2: ( ruleXExpression )
+            // InternalDataDSL.g:27869:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27870:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26286:2: ( ruleXExpression )
-            // InternalDataDSL.g:26287:3: ruleXExpression
+            // InternalDataDSL.g:27870:2: ( ruleXExpression )
+            // InternalDataDSL.g:27871:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0()); 
@@ -85542,17 +90635,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__ThenAssignment_5"
-    // InternalDataDSL.g:26296:1: rule__XIfExpression__ThenAssignment_5 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27880:1: rule__XIfExpression__ThenAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__ThenAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26300:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26301:2: ( ruleXExpression )
+            // InternalDataDSL.g:27884:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27885:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26301:2: ( ruleXExpression )
-            // InternalDataDSL.g:26302:3: ruleXExpression
+            // InternalDataDSL.g:27885:2: ( ruleXExpression )
+            // InternalDataDSL.g:27886:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0()); 
@@ -85587,17 +90680,17 @@
 
 
     // $ANTLR start "rule__XIfExpression__ElseAssignment_6_1"
-    // InternalDataDSL.g:26311:1: rule__XIfExpression__ElseAssignment_6_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27895:1: rule__XIfExpression__ElseAssignment_6_1 : ( ruleXExpression ) ;
     public final void rule__XIfExpression__ElseAssignment_6_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26315:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26316:2: ( ruleXExpression )
+            // InternalDataDSL.g:27899:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27900:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26316:2: ( ruleXExpression )
-            // InternalDataDSL.g:26317:3: ruleXExpression
+            // InternalDataDSL.g:27900:2: ( ruleXExpression )
+            // InternalDataDSL.g:27901:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXIfExpressionAccess().getElseXExpressionParserRuleCall_6_1_0()); 
@@ -85632,17 +90725,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1"
-    // InternalDataDSL.g:26326:1: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27910:1: rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1 : ( ruleJvmFormalParameter ) ;
     public final void rule__XSwitchExpression__DeclaredParamAssignment_2_0_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26330:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26331:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27914:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27915:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26331:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26332:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27915:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27916:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0()); 
@@ -85677,17 +90770,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_0_1"
-    // InternalDataDSL.g:26341:1: rule__XSwitchExpression__SwitchAssignment_2_0_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27925:1: rule__XSwitchExpression__SwitchAssignment_2_0_1 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__SwitchAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26345:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26346:2: ( ruleXExpression )
+            // InternalDataDSL.g:27929:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27930:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26346:2: ( ruleXExpression )
-            // InternalDataDSL.g:26347:3: ruleXExpression
+            // InternalDataDSL.g:27930:2: ( ruleXExpression )
+            // InternalDataDSL.g:27931:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0()); 
@@ -85722,17 +90815,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0"
-    // InternalDataDSL.g:26356:1: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:27940:1: rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0 : ( ruleJvmFormalParameter ) ;
     public final void rule__XSwitchExpression__DeclaredParamAssignment_2_1_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26360:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26361:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27944:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:27945:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26361:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26362:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:27945:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:27946:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0()); 
@@ -85767,17 +90860,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__SwitchAssignment_2_1_1"
-    // InternalDataDSL.g:26371:1: rule__XSwitchExpression__SwitchAssignment_2_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27955:1: rule__XSwitchExpression__SwitchAssignment_2_1_1 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__SwitchAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26375:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26376:2: ( ruleXExpression )
+            // InternalDataDSL.g:27959:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27960:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26376:2: ( ruleXExpression )
-            // InternalDataDSL.g:26377:3: ruleXExpression
+            // InternalDataDSL.g:27960:2: ( ruleXExpression )
+            // InternalDataDSL.g:27961:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_1_1_0()); 
@@ -85812,17 +90905,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__CasesAssignment_4"
-    // InternalDataDSL.g:26386:1: rule__XSwitchExpression__CasesAssignment_4 : ( ruleXCasePart ) ;
+    // InternalDataDSL.g:27970:1: rule__XSwitchExpression__CasesAssignment_4 : ( ruleXCasePart ) ;
     public final void rule__XSwitchExpression__CasesAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26390:1: ( ( ruleXCasePart ) )
-            // InternalDataDSL.g:26391:2: ( ruleXCasePart )
+            // InternalDataDSL.g:27974:1: ( ( ruleXCasePart ) )
+            // InternalDataDSL.g:27975:2: ( ruleXCasePart )
             {
-            // InternalDataDSL.g:26391:2: ( ruleXCasePart )
-            // InternalDataDSL.g:26392:3: ruleXCasePart
+            // InternalDataDSL.g:27975:2: ( ruleXCasePart )
+            // InternalDataDSL.g:27976:3: ruleXCasePart
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0()); 
@@ -85857,17 +90950,17 @@
 
 
     // $ANTLR start "rule__XSwitchExpression__DefaultAssignment_5_2"
-    // InternalDataDSL.g:26401:1: rule__XSwitchExpression__DefaultAssignment_5_2 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:27985:1: rule__XSwitchExpression__DefaultAssignment_5_2 : ( ruleXExpression ) ;
     public final void rule__XSwitchExpression__DefaultAssignment_5_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26405:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26406:2: ( ruleXExpression )
+            // InternalDataDSL.g:27989:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:27990:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26406:2: ( ruleXExpression )
-            // InternalDataDSL.g:26407:3: ruleXExpression
+            // InternalDataDSL.g:27990:2: ( ruleXExpression )
+            // InternalDataDSL.g:27991:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0()); 
@@ -85902,17 +90995,17 @@
 
 
     // $ANTLR start "rule__XCasePart__TypeGuardAssignment_1"
-    // InternalDataDSL.g:26416:1: rule__XCasePart__TypeGuardAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28000:1: rule__XCasePart__TypeGuardAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XCasePart__TypeGuardAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26420:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:26421:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28004:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28005:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:26421:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:26422:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28005:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28006:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0()); 
@@ -85947,17 +91040,17 @@
 
 
     // $ANTLR start "rule__XCasePart__CaseAssignment_2_1"
-    // InternalDataDSL.g:26431:1: rule__XCasePart__CaseAssignment_2_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28015:1: rule__XCasePart__CaseAssignment_2_1 : ( ruleXExpression ) ;
     public final void rule__XCasePart__CaseAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26435:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26436:2: ( ruleXExpression )
+            // InternalDataDSL.g:28019:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28020:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26436:2: ( ruleXExpression )
-            // InternalDataDSL.g:26437:3: ruleXExpression
+            // InternalDataDSL.g:28020:2: ( ruleXExpression )
+            // InternalDataDSL.g:28021:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0()); 
@@ -85992,17 +91085,17 @@
 
 
     // $ANTLR start "rule__XCasePart__ThenAssignment_3_0_1"
-    // InternalDataDSL.g:26446:1: rule__XCasePart__ThenAssignment_3_0_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28030:1: rule__XCasePart__ThenAssignment_3_0_1 : ( ruleXExpression ) ;
     public final void rule__XCasePart__ThenAssignment_3_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26450:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26451:2: ( ruleXExpression )
+            // InternalDataDSL.g:28034:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28035:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26451:2: ( ruleXExpression )
-            // InternalDataDSL.g:26452:3: ruleXExpression
+            // InternalDataDSL.g:28035:2: ( ruleXExpression )
+            // InternalDataDSL.g:28036:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getThenXExpressionParserRuleCall_3_0_1_0()); 
@@ -86037,28 +91130,28 @@
 
 
     // $ANTLR start "rule__XCasePart__FallThroughAssignment_3_1"
-    // InternalDataDSL.g:26461:1: rule__XCasePart__FallThroughAssignment_3_1 : ( ( ',' ) ) ;
+    // InternalDataDSL.g:28045:1: rule__XCasePart__FallThroughAssignment_3_1 : ( ( ',' ) ) ;
     public final void rule__XCasePart__FallThroughAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26465:1: ( ( ( ',' ) ) )
-            // InternalDataDSL.g:26466:2: ( ( ',' ) )
+            // InternalDataDSL.g:28049:1: ( ( ( ',' ) ) )
+            // InternalDataDSL.g:28050:2: ( ( ',' ) )
             {
-            // InternalDataDSL.g:26466:2: ( ( ',' ) )
-            // InternalDataDSL.g:26467:3: ( ',' )
+            // InternalDataDSL.g:28050:2: ( ( ',' ) )
+            // InternalDataDSL.g:28051:3: ( ',' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
             }
-            // InternalDataDSL.g:26468:3: ( ',' )
-            // InternalDataDSL.g:26469:4: ','
+            // InternalDataDSL.g:28052:3: ( ',' )
+            // InternalDataDSL.g:28053:4: ','
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
             }
-            match(input,124,FOLLOW_2); if (state.failed) return ;
+            match(input,130,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0()); 
             }
@@ -86090,17 +91183,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__DeclaredParamAssignment_0_0_3"
-    // InternalDataDSL.g:26480:1: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 : ( ruleJvmFormalParameter ) ;
+    // InternalDataDSL.g:28064:1: rule__XForLoopExpression__DeclaredParamAssignment_0_0_3 : ( ruleJvmFormalParameter ) ;
     public final void rule__XForLoopExpression__DeclaredParamAssignment_0_0_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26484:1: ( ( ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:26485:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:28068:1: ( ( ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:28069:2: ( ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:26485:2: ( ruleJvmFormalParameter )
-            // InternalDataDSL.g:26486:3: ruleJvmFormalParameter
+            // InternalDataDSL.g:28069:2: ( ruleJvmFormalParameter )
+            // InternalDataDSL.g:28070:3: ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0()); 
@@ -86135,17 +91228,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__ForExpressionAssignment_1"
-    // InternalDataDSL.g:26495:1: rule__XForLoopExpression__ForExpressionAssignment_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28079:1: rule__XForLoopExpression__ForExpressionAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XForLoopExpression__ForExpressionAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26499:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26500:2: ( ruleXExpression )
+            // InternalDataDSL.g:28083:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28084:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26500:2: ( ruleXExpression )
-            // InternalDataDSL.g:26501:3: ruleXExpression
+            // InternalDataDSL.g:28084:2: ( ruleXExpression )
+            // InternalDataDSL.g:28085:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0()); 
@@ -86180,17 +91273,17 @@
 
 
     // $ANTLR start "rule__XForLoopExpression__EachExpressionAssignment_3"
-    // InternalDataDSL.g:26510:1: rule__XForLoopExpression__EachExpressionAssignment_3 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28094:1: rule__XForLoopExpression__EachExpressionAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XForLoopExpression__EachExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26514:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26515:2: ( ruleXExpression )
+            // InternalDataDSL.g:28098:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28099:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26515:2: ( ruleXExpression )
-            // InternalDataDSL.g:26516:3: ruleXExpression
+            // InternalDataDSL.g:28099:2: ( ruleXExpression )
+            // InternalDataDSL.g:28100:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_3_0()); 
@@ -86225,17 +91318,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0"
-    // InternalDataDSL.g:26525:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalDataDSL.g:28109:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26529:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalDataDSL.g:26530:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28113:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalDataDSL.g:28114:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalDataDSL.g:26530:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalDataDSL.g:26531:3: ruleXExpressionOrVarDeclaration
+            // InternalDataDSL.g:28114:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28115:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0()); 
@@ -86270,17 +91363,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1"
-    // InternalDataDSL.g:26540:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalDataDSL.g:28124:1: rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBasicForLoopExpression__InitExpressionsAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26544:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalDataDSL.g:26545:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28128:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalDataDSL.g:28129:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalDataDSL.g:26545:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalDataDSL.g:26546:3: ruleXExpressionOrVarDeclaration
+            // InternalDataDSL.g:28129:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28130:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0()); 
@@ -86315,17 +91408,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__ExpressionAssignment_5"
-    // InternalDataDSL.g:26555:1: rule__XBasicForLoopExpression__ExpressionAssignment_5 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28139:1: rule__XBasicForLoopExpression__ExpressionAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__ExpressionAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26559:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26560:2: ( ruleXExpression )
+            // InternalDataDSL.g:28143:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28144:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26560:2: ( ruleXExpression )
-            // InternalDataDSL.g:26561:3: ruleXExpression
+            // InternalDataDSL.g:28144:2: ( ruleXExpression )
+            // InternalDataDSL.g:28145:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0()); 
@@ -86360,17 +91453,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0"
-    // InternalDataDSL.g:26570:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28154:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26574:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26575:2: ( ruleXExpression )
+            // InternalDataDSL.g:28158:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28159:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26575:2: ( ruleXExpression )
-            // InternalDataDSL.g:26576:3: ruleXExpression
+            // InternalDataDSL.g:28159:2: ( ruleXExpression )
+            // InternalDataDSL.g:28160:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0()); 
@@ -86405,17 +91498,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1"
-    // InternalDataDSL.g:26585:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28169:1: rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__UpdateExpressionsAssignment_7_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26589:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26590:2: ( ruleXExpression )
+            // InternalDataDSL.g:28173:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28174:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26590:2: ( ruleXExpression )
-            // InternalDataDSL.g:26591:3: ruleXExpression
+            // InternalDataDSL.g:28174:2: ( ruleXExpression )
+            // InternalDataDSL.g:28175:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0()); 
@@ -86450,17 +91543,17 @@
 
 
     // $ANTLR start "rule__XBasicForLoopExpression__EachExpressionAssignment_9"
-    // InternalDataDSL.g:26600:1: rule__XBasicForLoopExpression__EachExpressionAssignment_9 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28184:1: rule__XBasicForLoopExpression__EachExpressionAssignment_9 : ( ruleXExpression ) ;
     public final void rule__XBasicForLoopExpression__EachExpressionAssignment_9() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26604:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26605:2: ( ruleXExpression )
+            // InternalDataDSL.g:28188:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28189:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26605:2: ( ruleXExpression )
-            // InternalDataDSL.g:26606:3: ruleXExpression
+            // InternalDataDSL.g:28189:2: ( ruleXExpression )
+            // InternalDataDSL.g:28190:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBasicForLoopExpressionAccess().getEachExpressionXExpressionParserRuleCall_9_0()); 
@@ -86495,17 +91588,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__PredicateAssignment_3"
-    // InternalDataDSL.g:26615:1: rule__XWhileExpression__PredicateAssignment_3 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28199:1: rule__XWhileExpression__PredicateAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XWhileExpression__PredicateAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26619:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26620:2: ( ruleXExpression )
+            // InternalDataDSL.g:28203:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28204:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26620:2: ( ruleXExpression )
-            // InternalDataDSL.g:26621:3: ruleXExpression
+            // InternalDataDSL.g:28204:2: ( ruleXExpression )
+            // InternalDataDSL.g:28205:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0()); 
@@ -86540,17 +91633,17 @@
 
 
     // $ANTLR start "rule__XWhileExpression__BodyAssignment_5"
-    // InternalDataDSL.g:26630:1: rule__XWhileExpression__BodyAssignment_5 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28214:1: rule__XWhileExpression__BodyAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XWhileExpression__BodyAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26634:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26635:2: ( ruleXExpression )
+            // InternalDataDSL.g:28218:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28219:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26635:2: ( ruleXExpression )
-            // InternalDataDSL.g:26636:3: ruleXExpression
+            // InternalDataDSL.g:28219:2: ( ruleXExpression )
+            // InternalDataDSL.g:28220:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXWhileExpressionAccess().getBodyXExpressionParserRuleCall_5_0()); 
@@ -86585,17 +91678,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__BodyAssignment_2"
-    // InternalDataDSL.g:26645:1: rule__XDoWhileExpression__BodyAssignment_2 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28229:1: rule__XDoWhileExpression__BodyAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XDoWhileExpression__BodyAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26649:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26650:2: ( ruleXExpression )
+            // InternalDataDSL.g:28233:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28234:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26650:2: ( ruleXExpression )
-            // InternalDataDSL.g:26651:3: ruleXExpression
+            // InternalDataDSL.g:28234:2: ( ruleXExpression )
+            // InternalDataDSL.g:28235:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0()); 
@@ -86630,17 +91723,17 @@
 
 
     // $ANTLR start "rule__XDoWhileExpression__PredicateAssignment_5"
-    // InternalDataDSL.g:26660:1: rule__XDoWhileExpression__PredicateAssignment_5 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28244:1: rule__XDoWhileExpression__PredicateAssignment_5 : ( ruleXExpression ) ;
     public final void rule__XDoWhileExpression__PredicateAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26664:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26665:2: ( ruleXExpression )
+            // InternalDataDSL.g:28248:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28249:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26665:2: ( ruleXExpression )
-            // InternalDataDSL.g:26666:3: ruleXExpression
+            // InternalDataDSL.g:28249:2: ( ruleXExpression )
+            // InternalDataDSL.g:28250:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0()); 
@@ -86675,17 +91768,17 @@
 
 
     // $ANTLR start "rule__XBlockExpression__ExpressionsAssignment_2_0"
-    // InternalDataDSL.g:26675:1: rule__XBlockExpression__ExpressionsAssignment_2_0 : ( ruleXExpressionOrVarDeclaration ) ;
+    // InternalDataDSL.g:28259:1: rule__XBlockExpression__ExpressionsAssignment_2_0 : ( ruleXExpressionOrVarDeclaration ) ;
     public final void rule__XBlockExpression__ExpressionsAssignment_2_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26679:1: ( ( ruleXExpressionOrVarDeclaration ) )
-            // InternalDataDSL.g:26680:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28263:1: ( ( ruleXExpressionOrVarDeclaration ) )
+            // InternalDataDSL.g:28264:2: ( ruleXExpressionOrVarDeclaration )
             {
-            // InternalDataDSL.g:26680:2: ( ruleXExpressionOrVarDeclaration )
-            // InternalDataDSL.g:26681:3: ruleXExpressionOrVarDeclaration
+            // InternalDataDSL.g:28264:2: ( ruleXExpressionOrVarDeclaration )
+            // InternalDataDSL.g:28265:3: ruleXExpressionOrVarDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0()); 
@@ -86720,28 +91813,28 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__WriteableAssignment_1_0"
-    // InternalDataDSL.g:26690:1: rule__XVariableDeclaration__WriteableAssignment_1_0 : ( ( 'var' ) ) ;
+    // InternalDataDSL.g:28274:1: rule__XVariableDeclaration__WriteableAssignment_1_0 : ( ( 'var' ) ) ;
     public final void rule__XVariableDeclaration__WriteableAssignment_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26694:1: ( ( ( 'var' ) ) )
-            // InternalDataDSL.g:26695:2: ( ( 'var' ) )
+            // InternalDataDSL.g:28278:1: ( ( ( 'var' ) ) )
+            // InternalDataDSL.g:28279:2: ( ( 'var' ) )
             {
-            // InternalDataDSL.g:26695:2: ( ( 'var' ) )
-            // InternalDataDSL.g:26696:3: ( 'var' )
+            // InternalDataDSL.g:28279:2: ( ( 'var' ) )
+            // InternalDataDSL.g:28280:3: ( 'var' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
             }
-            // InternalDataDSL.g:26697:3: ( 'var' )
-            // InternalDataDSL.g:26698:4: 'var'
+            // InternalDataDSL.g:28281:3: ( 'var' )
+            // InternalDataDSL.g:28282:4: 'var'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
             }
-            match(input,165,FOLLOW_2); if (state.failed) return ;
+            match(input,178,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0()); 
             }
@@ -86773,17 +91866,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__TypeAssignment_2_0_0_0"
-    // InternalDataDSL.g:26709:1: rule__XVariableDeclaration__TypeAssignment_2_0_0_0 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28293:1: rule__XVariableDeclaration__TypeAssignment_2_0_0_0 : ( ruleJvmTypeReference ) ;
     public final void rule__XVariableDeclaration__TypeAssignment_2_0_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26713:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:26714:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28297:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28298:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:26714:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:26715:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28298:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28299:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getTypeJvmTypeReferenceParserRuleCall_2_0_0_0_0()); 
@@ -86818,17 +91911,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_0_0_1"
-    // InternalDataDSL.g:26724:1: rule__XVariableDeclaration__NameAssignment_2_0_0_1 : ( ruleValidID ) ;
+    // InternalDataDSL.g:28308:1: rule__XVariableDeclaration__NameAssignment_2_0_0_1 : ( ruleValidID ) ;
     public final void rule__XVariableDeclaration__NameAssignment_2_0_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26728:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:26729:2: ( ruleValidID )
+            // InternalDataDSL.g:28312:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:28313:2: ( ruleValidID )
             {
-            // InternalDataDSL.g:26729:2: ( ruleValidID )
-            // InternalDataDSL.g:26730:3: ruleValidID
+            // InternalDataDSL.g:28313:2: ( ruleValidID )
+            // InternalDataDSL.g:28314:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0()); 
@@ -86863,17 +91956,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__NameAssignment_2_1"
-    // InternalDataDSL.g:26739:1: rule__XVariableDeclaration__NameAssignment_2_1 : ( ruleValidID ) ;
+    // InternalDataDSL.g:28323:1: rule__XVariableDeclaration__NameAssignment_2_1 : ( ruleValidID ) ;
     public final void rule__XVariableDeclaration__NameAssignment_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26743:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:26744:2: ( ruleValidID )
+            // InternalDataDSL.g:28327:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:28328:2: ( ruleValidID )
             {
-            // InternalDataDSL.g:26744:2: ( ruleValidID )
-            // InternalDataDSL.g:26745:3: ruleValidID
+            // InternalDataDSL.g:28328:2: ( ruleValidID )
+            // InternalDataDSL.g:28329:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0()); 
@@ -86908,17 +92001,17 @@
 
 
     // $ANTLR start "rule__XVariableDeclaration__RightAssignment_3_1"
-    // InternalDataDSL.g:26754:1: rule__XVariableDeclaration__RightAssignment_3_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28338:1: rule__XVariableDeclaration__RightAssignment_3_1 : ( ruleXExpression ) ;
     public final void rule__XVariableDeclaration__RightAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26758:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26759:2: ( ruleXExpression )
+            // InternalDataDSL.g:28342:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28343:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26759:2: ( ruleXExpression )
-            // InternalDataDSL.g:26760:3: ruleXExpression
+            // InternalDataDSL.g:28343:2: ( ruleXExpression )
+            // InternalDataDSL.g:28344:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXVariableDeclarationAccess().getRightXExpressionParserRuleCall_3_1_0()); 
@@ -86953,17 +92046,17 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__ParameterTypeAssignment_0"
-    // InternalDataDSL.g:26769:1: rule__JvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28353:1: rule__JvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26773:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:26774:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28357:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28358:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:26774:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:26775:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28358:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28359:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
@@ -86998,17 +92091,17 @@
 
 
     // $ANTLR start "rule__JvmFormalParameter__NameAssignment_1"
-    // InternalDataDSL.g:26784:1: rule__JvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    // InternalDataDSL.g:28368:1: rule__JvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
     public final void rule__JvmFormalParameter__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26788:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:26789:2: ( ruleValidID )
+            // InternalDataDSL.g:28372:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:28373:2: ( ruleValidID )
             {
-            // InternalDataDSL.g:26789:2: ( ruleValidID )
-            // InternalDataDSL.g:26790:3: ruleValidID
+            // InternalDataDSL.g:28373:2: ( ruleValidID )
+            // InternalDataDSL.g:28374:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
@@ -87043,17 +92136,17 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__ParameterTypeAssignment_0"
-    // InternalDataDSL.g:26799:1: rule__FullJvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28383:1: rule__FullJvmFormalParameter__ParameterTypeAssignment_0 : ( ruleJvmTypeReference ) ;
     public final void rule__FullJvmFormalParameter__ParameterTypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26803:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:26804:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28387:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28388:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:26804:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:26805:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28388:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28389:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getParameterTypeJvmTypeReferenceParserRuleCall_0_0()); 
@@ -87088,17 +92181,17 @@
 
 
     // $ANTLR start "rule__FullJvmFormalParameter__NameAssignment_1"
-    // InternalDataDSL.g:26814:1: rule__FullJvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
+    // InternalDataDSL.g:28398:1: rule__FullJvmFormalParameter__NameAssignment_1 : ( ruleValidID ) ;
     public final void rule__FullJvmFormalParameter__NameAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26818:1: ( ( ruleValidID ) )
-            // InternalDataDSL.g:26819:2: ( ruleValidID )
+            // InternalDataDSL.g:28402:1: ( ( ruleValidID ) )
+            // InternalDataDSL.g:28403:2: ( ruleValidID )
             {
-            // InternalDataDSL.g:26819:2: ( ruleValidID )
-            // InternalDataDSL.g:26820:3: ruleValidID
+            // InternalDataDSL.g:28403:2: ( ruleValidID )
+            // InternalDataDSL.g:28404:3: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getFullJvmFormalParameterAccess().getNameValidIDParserRuleCall_1_0()); 
@@ -87133,17 +92226,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_1"
-    // InternalDataDSL.g:26829:1: rule__XFeatureCall__TypeArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28413:1: rule__XFeatureCall__TypeArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XFeatureCall__TypeArgumentsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26833:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:26834:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28417:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28418:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:26834:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:26835:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28418:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28419:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
@@ -87178,17 +92271,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__TypeArgumentsAssignment_1_2_1"
-    // InternalDataDSL.g:26844:1: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28428:1: rule__XFeatureCall__TypeArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XFeatureCall__TypeArgumentsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26848:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:26849:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28432:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28433:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:26849:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:26850:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28433:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28434:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
@@ -87223,23 +92316,23 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureAssignment_2"
-    // InternalDataDSL.g:26859:1: rule__XFeatureCall__FeatureAssignment_2 : ( ( ruleIdOrSuper ) ) ;
+    // InternalDataDSL.g:28443:1: rule__XFeatureCall__FeatureAssignment_2 : ( ( ruleIdOrSuper ) ) ;
     public final void rule__XFeatureCall__FeatureAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26863:1: ( ( ( ruleIdOrSuper ) ) )
-            // InternalDataDSL.g:26864:2: ( ( ruleIdOrSuper ) )
+            // InternalDataDSL.g:28447:1: ( ( ( ruleIdOrSuper ) ) )
+            // InternalDataDSL.g:28448:2: ( ( ruleIdOrSuper ) )
             {
-            // InternalDataDSL.g:26864:2: ( ( ruleIdOrSuper ) )
-            // InternalDataDSL.g:26865:3: ( ruleIdOrSuper )
+            // InternalDataDSL.g:28448:2: ( ( ruleIdOrSuper ) )
+            // InternalDataDSL.g:28449:3: ( ruleIdOrSuper )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:26866:3: ( ruleIdOrSuper )
-            // InternalDataDSL.g:26867:4: ruleIdOrSuper
+            // InternalDataDSL.g:28450:3: ( ruleIdOrSuper )
+            // InternalDataDSL.g:28451:4: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementIdOrSuperParserRuleCall_2_0_1()); 
@@ -87280,28 +92373,28 @@
 
 
     // $ANTLR start "rule__XFeatureCall__ExplicitOperationCallAssignment_3_0"
-    // InternalDataDSL.g:26878:1: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 : ( ( '(' ) ) ;
+    // InternalDataDSL.g:28462:1: rule__XFeatureCall__ExplicitOperationCallAssignment_3_0 : ( ( '(' ) ) ;
     public final void rule__XFeatureCall__ExplicitOperationCallAssignment_3_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26882:1: ( ( ( '(' ) ) )
-            // InternalDataDSL.g:26883:2: ( ( '(' ) )
+            // InternalDataDSL.g:28466:1: ( ( ( '(' ) ) )
+            // InternalDataDSL.g:28467:2: ( ( '(' ) )
             {
-            // InternalDataDSL.g:26883:2: ( ( '(' ) )
-            // InternalDataDSL.g:26884:3: ( '(' )
+            // InternalDataDSL.g:28467:2: ( ( '(' ) )
+            // InternalDataDSL.g:28468:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
             }
-            // InternalDataDSL.g:26885:3: ( '(' )
-            // InternalDataDSL.g:26886:4: '('
+            // InternalDataDSL.g:28469:3: ( '(' )
+            // InternalDataDSL.g:28470:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0()); 
             }
@@ -87333,17 +92426,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0"
-    // InternalDataDSL.g:26897:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 : ( ruleXShortClosure ) ;
+    // InternalDataDSL.g:28481:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26901:1: ( ( ruleXShortClosure ) )
-            // InternalDataDSL.g:26902:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:28485:1: ( ( ruleXShortClosure ) )
+            // InternalDataDSL.g:28486:2: ( ruleXShortClosure )
             {
-            // InternalDataDSL.g:26902:2: ( ruleXShortClosure )
-            // InternalDataDSL.g:26903:3: ruleXShortClosure
+            // InternalDataDSL.g:28486:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:28487:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0()); 
@@ -87378,17 +92471,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0"
-    // InternalDataDSL.g:26912:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28496:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26916:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26917:2: ( ruleXExpression )
+            // InternalDataDSL.g:28500:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28501:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26917:2: ( ruleXExpression )
-            // InternalDataDSL.g:26918:3: ruleXExpression
+            // InternalDataDSL.g:28501:2: ( ruleXExpression )
+            // InternalDataDSL.g:28502:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0()); 
@@ -87423,17 +92516,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1"
-    // InternalDataDSL.g:26927:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28511:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26931:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:26932:2: ( ruleXExpression )
+            // InternalDataDSL.g:28515:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28516:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:26932:2: ( ruleXExpression )
-            // InternalDataDSL.g:26933:3: ruleXExpression
+            // InternalDataDSL.g:28516:2: ( ruleXExpression )
+            // InternalDataDSL.g:28517:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0()); 
@@ -87468,17 +92561,17 @@
 
 
     // $ANTLR start "rule__XFeatureCall__FeatureCallArgumentsAssignment_4"
-    // InternalDataDSL.g:26942:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_4 : ( ruleXClosure ) ;
+    // InternalDataDSL.g:28526:1: rule__XFeatureCall__FeatureCallArgumentsAssignment_4 : ( ruleXClosure ) ;
     public final void rule__XFeatureCall__FeatureCallArgumentsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26946:1: ( ( ruleXClosure ) )
-            // InternalDataDSL.g:26947:2: ( ruleXClosure )
+            // InternalDataDSL.g:28530:1: ( ( ruleXClosure ) )
+            // InternalDataDSL.g:28531:2: ( ruleXClosure )
             {
-            // InternalDataDSL.g:26947:2: ( ruleXClosure )
-            // InternalDataDSL.g:26948:3: ruleXClosure
+            // InternalDataDSL.g:28531:2: ( ruleXClosure )
+            // InternalDataDSL.g:28532:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXClosureParserRuleCall_4_0()); 
@@ -87513,23 +92606,23 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ConstructorAssignment_2"
-    // InternalDataDSL.g:26957:1: rule__XConstructorCall__ConstructorAssignment_2 : ( ( ruleQualifiedName ) ) ;
+    // InternalDataDSL.g:28541:1: rule__XConstructorCall__ConstructorAssignment_2 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XConstructorCall__ConstructorAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26961:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalDataDSL.g:26962:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28545:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalDataDSL.g:28546:2: ( ( ruleQualifiedName ) )
             {
-            // InternalDataDSL.g:26962:2: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:26963:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28546:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28547:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0()); 
             }
-            // InternalDataDSL.g:26964:3: ( ruleQualifiedName )
-            // InternalDataDSL.g:26965:4: ruleQualifiedName
+            // InternalDataDSL.g:28548:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28549:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorQualifiedNameParserRuleCall_2_0_1()); 
@@ -87570,17 +92663,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_1"
-    // InternalDataDSL.g:26976:1: rule__XConstructorCall__TypeArgumentsAssignment_3_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28560:1: rule__XConstructorCall__TypeArgumentsAssignment_3_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XConstructorCall__TypeArgumentsAssignment_3_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26980:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:26981:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28564:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28565:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:26981:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:26982:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28565:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28566:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0()); 
@@ -87615,17 +92708,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__TypeArgumentsAssignment_3_2_1"
-    // InternalDataDSL.g:26991:1: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28575:1: rule__XConstructorCall__TypeArgumentsAssignment_3_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__XConstructorCall__TypeArgumentsAssignment_3_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:26995:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:26996:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28579:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28580:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:26996:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:26997:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28580:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28581:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0()); 
@@ -87660,28 +92753,28 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0"
-    // InternalDataDSL.g:27006:1: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 : ( ( '(' ) ) ;
+    // InternalDataDSL.g:28590:1: rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0 : ( ( '(' ) ) ;
     public final void rule__XConstructorCall__ExplicitConstructorCallAssignment_4_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27010:1: ( ( ( '(' ) ) )
-            // InternalDataDSL.g:27011:2: ( ( '(' ) )
+            // InternalDataDSL.g:28594:1: ( ( ( '(' ) ) )
+            // InternalDataDSL.g:28595:2: ( ( '(' ) )
             {
-            // InternalDataDSL.g:27011:2: ( ( '(' ) )
-            // InternalDataDSL.g:27012:3: ( '(' )
+            // InternalDataDSL.g:28595:2: ( ( '(' ) )
+            // InternalDataDSL.g:28596:3: ( '(' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
             }
-            // InternalDataDSL.g:27013:3: ( '(' )
-            // InternalDataDSL.g:27014:4: '('
+            // InternalDataDSL.g:28597:3: ( '(' )
+            // InternalDataDSL.g:28598:4: '('
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
             }
-            match(input,122,FOLLOW_2); if (state.failed) return ;
+            match(input,128,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0()); 
             }
@@ -87713,17 +92806,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_0"
-    // InternalDataDSL.g:27025:1: rule__XConstructorCall__ArgumentsAssignment_4_1_0 : ( ruleXShortClosure ) ;
+    // InternalDataDSL.g:28609:1: rule__XConstructorCall__ArgumentsAssignment_4_1_0 : ( ruleXShortClosure ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27029:1: ( ( ruleXShortClosure ) )
-            // InternalDataDSL.g:27030:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:28613:1: ( ( ruleXShortClosure ) )
+            // InternalDataDSL.g:28614:2: ( ruleXShortClosure )
             {
-            // InternalDataDSL.g:27030:2: ( ruleXShortClosure )
-            // InternalDataDSL.g:27031:3: ruleXShortClosure
+            // InternalDataDSL.g:28614:2: ( ruleXShortClosure )
+            // InternalDataDSL.g:28615:3: ruleXShortClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0()); 
@@ -87758,17 +92851,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_0"
-    // InternalDataDSL.g:27040:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28624:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_0 : ( ruleXExpression ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27044:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27045:2: ( ruleXExpression )
+            // InternalDataDSL.g:28628:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28629:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27045:2: ( ruleXExpression )
-            // InternalDataDSL.g:27046:3: ruleXExpression
+            // InternalDataDSL.g:28629:2: ( ruleXExpression )
+            // InternalDataDSL.g:28630:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0()); 
@@ -87803,17 +92896,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1"
-    // InternalDataDSL.g:27055:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28639:1: rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1 : ( ruleXExpression ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_4_1_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27059:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27060:2: ( ruleXExpression )
+            // InternalDataDSL.g:28643:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28644:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27060:2: ( ruleXExpression )
-            // InternalDataDSL.g:27061:3: ruleXExpression
+            // InternalDataDSL.g:28644:2: ( ruleXExpression )
+            // InternalDataDSL.g:28645:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0()); 
@@ -87848,17 +92941,17 @@
 
 
     // $ANTLR start "rule__XConstructorCall__ArgumentsAssignment_5"
-    // InternalDataDSL.g:27070:1: rule__XConstructorCall__ArgumentsAssignment_5 : ( ruleXClosure ) ;
+    // InternalDataDSL.g:28654:1: rule__XConstructorCall__ArgumentsAssignment_5 : ( ruleXClosure ) ;
     public final void rule__XConstructorCall__ArgumentsAssignment_5() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27074:1: ( ( ruleXClosure ) )
-            // InternalDataDSL.g:27075:2: ( ruleXClosure )
+            // InternalDataDSL.g:28658:1: ( ( ruleXClosure ) )
+            // InternalDataDSL.g:28659:2: ( ruleXClosure )
             {
-            // InternalDataDSL.g:27075:2: ( ruleXClosure )
-            // InternalDataDSL.g:27076:3: ruleXClosure
+            // InternalDataDSL.g:28659:2: ( ruleXClosure )
+            // InternalDataDSL.g:28660:3: ruleXClosure
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXConstructorCallAccess().getArgumentsXClosureParserRuleCall_5_0()); 
@@ -87893,28 +92986,28 @@
 
 
     // $ANTLR start "rule__XBooleanLiteral__IsTrueAssignment_1_1"
-    // InternalDataDSL.g:27085:1: rule__XBooleanLiteral__IsTrueAssignment_1_1 : ( ( 'true' ) ) ;
+    // InternalDataDSL.g:28669:1: rule__XBooleanLiteral__IsTrueAssignment_1_1 : ( ( 'true' ) ) ;
     public final void rule__XBooleanLiteral__IsTrueAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27089:1: ( ( ( 'true' ) ) )
-            // InternalDataDSL.g:27090:2: ( ( 'true' ) )
+            // InternalDataDSL.g:28673:1: ( ( ( 'true' ) ) )
+            // InternalDataDSL.g:28674:2: ( ( 'true' ) )
             {
-            // InternalDataDSL.g:27090:2: ( ( 'true' ) )
-            // InternalDataDSL.g:27091:3: ( 'true' )
+            // InternalDataDSL.g:28674:2: ( ( 'true' ) )
+            // InternalDataDSL.g:28675:3: ( 'true' )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
             }
-            // InternalDataDSL.g:27092:3: ( 'true' )
-            // InternalDataDSL.g:27093:4: 'true'
+            // InternalDataDSL.g:28676:3: ( 'true' )
+            // InternalDataDSL.g:28677:4: 'true'
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
             }
-            match(input,166,FOLLOW_2); if (state.failed) return ;
+            match(input,179,FOLLOW_2); if (state.failed) return ;
             if ( state.backtracking==0 ) {
                after(grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0()); 
             }
@@ -87946,17 +93039,17 @@
 
 
     // $ANTLR start "rule__XNumberLiteral__ValueAssignment_1"
-    // InternalDataDSL.g:27104:1: rule__XNumberLiteral__ValueAssignment_1 : ( ruleNumber ) ;
+    // InternalDataDSL.g:28688:1: rule__XNumberLiteral__ValueAssignment_1 : ( ruleNumber ) ;
     public final void rule__XNumberLiteral__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27108:1: ( ( ruleNumber ) )
-            // InternalDataDSL.g:27109:2: ( ruleNumber )
+            // InternalDataDSL.g:28692:1: ( ( ruleNumber ) )
+            // InternalDataDSL.g:28693:2: ( ruleNumber )
             {
-            // InternalDataDSL.g:27109:2: ( ruleNumber )
-            // InternalDataDSL.g:27110:3: ruleNumber
+            // InternalDataDSL.g:28693:2: ( ruleNumber )
+            // InternalDataDSL.g:28694:3: ruleNumber
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXNumberLiteralAccess().getValueNumberParserRuleCall_1_0()); 
@@ -87991,17 +93084,17 @@
 
 
     // $ANTLR start "rule__XStringLiteral__ValueAssignment_1"
-    // InternalDataDSL.g:27119:1: rule__XStringLiteral__ValueAssignment_1 : ( RULE_STRING ) ;
+    // InternalDataDSL.g:28703:1: rule__XStringLiteral__ValueAssignment_1 : ( RULE_STRING ) ;
     public final void rule__XStringLiteral__ValueAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27123:1: ( ( RULE_STRING ) )
-            // InternalDataDSL.g:27124:2: ( RULE_STRING )
+            // InternalDataDSL.g:28707:1: ( ( RULE_STRING ) )
+            // InternalDataDSL.g:28708:2: ( RULE_STRING )
             {
-            // InternalDataDSL.g:27124:2: ( RULE_STRING )
-            // InternalDataDSL.g:27125:3: RULE_STRING
+            // InternalDataDSL.g:28708:2: ( RULE_STRING )
+            // InternalDataDSL.g:28709:3: RULE_STRING
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXStringLiteralAccess().getValueSTRINGTerminalRuleCall_1_0()); 
@@ -88032,23 +93125,23 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__TypeAssignment_3"
-    // InternalDataDSL.g:27134:1: rule__XTypeLiteral__TypeAssignment_3 : ( ( ruleQualifiedName ) ) ;
+    // InternalDataDSL.g:28718:1: rule__XTypeLiteral__TypeAssignment_3 : ( ( ruleQualifiedName ) ) ;
     public final void rule__XTypeLiteral__TypeAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27138:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalDataDSL.g:27139:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28722:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalDataDSL.g:28723:2: ( ( ruleQualifiedName ) )
             {
-            // InternalDataDSL.g:27139:2: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:27140:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28723:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28724:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0()); 
             }
-            // InternalDataDSL.g:27141:3: ( ruleQualifiedName )
-            // InternalDataDSL.g:27142:4: ruleQualifiedName
+            // InternalDataDSL.g:28725:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28726:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeQualifiedNameParserRuleCall_3_0_1()); 
@@ -88089,17 +93182,17 @@
 
 
     // $ANTLR start "rule__XTypeLiteral__ArrayDimensionsAssignment_4"
-    // InternalDataDSL.g:27153:1: rule__XTypeLiteral__ArrayDimensionsAssignment_4 : ( ruleArrayBrackets ) ;
+    // InternalDataDSL.g:28737:1: rule__XTypeLiteral__ArrayDimensionsAssignment_4 : ( ruleArrayBrackets ) ;
     public final void rule__XTypeLiteral__ArrayDimensionsAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27157:1: ( ( ruleArrayBrackets ) )
-            // InternalDataDSL.g:27158:2: ( ruleArrayBrackets )
+            // InternalDataDSL.g:28741:1: ( ( ruleArrayBrackets ) )
+            // InternalDataDSL.g:28742:2: ( ruleArrayBrackets )
             {
-            // InternalDataDSL.g:27158:2: ( ruleArrayBrackets )
-            // InternalDataDSL.g:27159:3: ruleArrayBrackets
+            // InternalDataDSL.g:28742:2: ( ruleArrayBrackets )
+            // InternalDataDSL.g:28743:3: ruleArrayBrackets
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0()); 
@@ -88134,17 +93227,17 @@
 
 
     // $ANTLR start "rule__XThrowExpression__ExpressionAssignment_2"
-    // InternalDataDSL.g:27168:1: rule__XThrowExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28752:1: rule__XThrowExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XThrowExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27172:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27173:2: ( ruleXExpression )
+            // InternalDataDSL.g:28756:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28757:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27173:2: ( ruleXExpression )
-            // InternalDataDSL.g:27174:3: ruleXExpression
+            // InternalDataDSL.g:28757:2: ( ruleXExpression )
+            // InternalDataDSL.g:28758:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXThrowExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -88179,17 +93272,17 @@
 
 
     // $ANTLR start "rule__XReturnExpression__ExpressionAssignment_2"
-    // InternalDataDSL.g:27183:1: rule__XReturnExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28767:1: rule__XReturnExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XReturnExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27187:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27188:2: ( ruleXExpression )
+            // InternalDataDSL.g:28771:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28772:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27188:2: ( ruleXExpression )
-            // InternalDataDSL.g:27189:3: ruleXExpression
+            // InternalDataDSL.g:28772:2: ( ruleXExpression )
+            // InternalDataDSL.g:28773:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXReturnExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -88224,17 +93317,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__ExpressionAssignment_2"
-    // InternalDataDSL.g:27198:1: rule__XTryCatchFinallyExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28782:1: rule__XTryCatchFinallyExpression__ExpressionAssignment_2 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__ExpressionAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27202:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27203:2: ( ruleXExpression )
+            // InternalDataDSL.g:28786:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28787:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27203:2: ( ruleXExpression )
-            // InternalDataDSL.g:27204:3: ruleXExpression
+            // InternalDataDSL.g:28787:2: ( ruleXExpression )
+            // InternalDataDSL.g:28788:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0()); 
@@ -88269,17 +93362,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0"
-    // InternalDataDSL.g:27213:1: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 : ( ruleXCatchClause ) ;
+    // InternalDataDSL.g:28797:1: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 : ( ruleXCatchClause ) ;
     public final void rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27217:1: ( ( ruleXCatchClause ) )
-            // InternalDataDSL.g:27218:2: ( ruleXCatchClause )
+            // InternalDataDSL.g:28801:1: ( ( ruleXCatchClause ) )
+            // InternalDataDSL.g:28802:2: ( ruleXCatchClause )
             {
-            // InternalDataDSL.g:27218:2: ( ruleXCatchClause )
-            // InternalDataDSL.g:27219:3: ruleXCatchClause
+            // InternalDataDSL.g:28802:2: ( ruleXCatchClause )
+            // InternalDataDSL.g:28803:3: ruleXCatchClause
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0()); 
@@ -88314,17 +93407,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1"
-    // InternalDataDSL.g:27228:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28812:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_0_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27232:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27233:2: ( ruleXExpression )
+            // InternalDataDSL.g:28816:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28817:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27233:2: ( ruleXExpression )
-            // InternalDataDSL.g:27234:3: ruleXExpression
+            // InternalDataDSL.g:28817:2: ( ruleXExpression )
+            // InternalDataDSL.g:28818:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_0_1_1_0()); 
@@ -88359,17 +93452,17 @@
 
 
     // $ANTLR start "rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1"
-    // InternalDataDSL.g:27243:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28827:1: rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1 : ( ruleXExpression ) ;
     public final void rule__XTryCatchFinallyExpression__FinallyExpressionAssignment_3_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27247:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27248:2: ( ruleXExpression )
+            // InternalDataDSL.g:28831:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28832:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27248:2: ( ruleXExpression )
-            // InternalDataDSL.g:27249:3: ruleXExpression
+            // InternalDataDSL.g:28832:2: ( ruleXExpression )
+            // InternalDataDSL.g:28833:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyExpressionXExpressionParserRuleCall_3_1_1_0()); 
@@ -88404,17 +93497,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__ParamAssignment_1"
-    // InternalDataDSL.g:27258:1: rule__XSynchronizedExpression__ParamAssignment_1 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28842:1: rule__XSynchronizedExpression__ParamAssignment_1 : ( ruleXExpression ) ;
     public final void rule__XSynchronizedExpression__ParamAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27262:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27263:2: ( ruleXExpression )
+            // InternalDataDSL.g:28846:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28847:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27263:2: ( ruleXExpression )
-            // InternalDataDSL.g:27264:3: ruleXExpression
+            // InternalDataDSL.g:28847:2: ( ruleXExpression )
+            // InternalDataDSL.g:28848:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0()); 
@@ -88449,17 +93542,17 @@
 
 
     // $ANTLR start "rule__XSynchronizedExpression__ExpressionAssignment_3"
-    // InternalDataDSL.g:27273:1: rule__XSynchronizedExpression__ExpressionAssignment_3 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28857:1: rule__XSynchronizedExpression__ExpressionAssignment_3 : ( ruleXExpression ) ;
     public final void rule__XSynchronizedExpression__ExpressionAssignment_3() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27277:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27278:2: ( ruleXExpression )
+            // InternalDataDSL.g:28861:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28862:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27278:2: ( ruleXExpression )
-            // InternalDataDSL.g:27279:3: ruleXExpression
+            // InternalDataDSL.g:28862:2: ( ruleXExpression )
+            // InternalDataDSL.g:28863:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXSynchronizedExpressionAccess().getExpressionXExpressionParserRuleCall_3_0()); 
@@ -88494,17 +93587,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__DeclaredParamAssignment_2"
-    // InternalDataDSL.g:27288:1: rule__XCatchClause__DeclaredParamAssignment_2 : ( ruleFullJvmFormalParameter ) ;
+    // InternalDataDSL.g:28872:1: rule__XCatchClause__DeclaredParamAssignment_2 : ( ruleFullJvmFormalParameter ) ;
     public final void rule__XCatchClause__DeclaredParamAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27292:1: ( ( ruleFullJvmFormalParameter ) )
-            // InternalDataDSL.g:27293:2: ( ruleFullJvmFormalParameter )
+            // InternalDataDSL.g:28876:1: ( ( ruleFullJvmFormalParameter ) )
+            // InternalDataDSL.g:28877:2: ( ruleFullJvmFormalParameter )
             {
-            // InternalDataDSL.g:27293:2: ( ruleFullJvmFormalParameter )
-            // InternalDataDSL.g:27294:3: ruleFullJvmFormalParameter
+            // InternalDataDSL.g:28877:2: ( ruleFullJvmFormalParameter )
+            // InternalDataDSL.g:28878:3: ruleFullJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0()); 
@@ -88539,17 +93632,17 @@
 
 
     // $ANTLR start "rule__XCatchClause__ExpressionAssignment_4"
-    // InternalDataDSL.g:27303:1: rule__XCatchClause__ExpressionAssignment_4 : ( ruleXExpression ) ;
+    // InternalDataDSL.g:28887:1: rule__XCatchClause__ExpressionAssignment_4 : ( ruleXExpression ) ;
     public final void rule__XCatchClause__ExpressionAssignment_4() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27307:1: ( ( ruleXExpression ) )
-            // InternalDataDSL.g:27308:2: ( ruleXExpression )
+            // InternalDataDSL.g:28891:1: ( ( ruleXExpression ) )
+            // InternalDataDSL.g:28892:2: ( ruleXExpression )
             {
-            // InternalDataDSL.g:27308:2: ( ruleXExpression )
-            // InternalDataDSL.g:27309:3: ruleXExpression
+            // InternalDataDSL.g:28892:2: ( ruleXExpression )
+            // InternalDataDSL.g:28893:3: ruleXExpression
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXCatchClauseAccess().getExpressionXExpressionParserRuleCall_4_0()); 
@@ -88584,17 +93677,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0"
-    // InternalDataDSL.g:27318:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28902:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27322:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27323:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28906:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28907:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27323:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27324:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28907:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28908:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0()); 
@@ -88629,17 +93722,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1"
-    // InternalDataDSL.g:27333:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28917:1: rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ParamTypesAssignment_0_1_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27337:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27338:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28921:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28922:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27338:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27339:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28922:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28923:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0()); 
@@ -88674,17 +93767,17 @@
 
 
     // $ANTLR start "rule__XFunctionTypeRef__ReturnTypeAssignment_2"
-    // InternalDataDSL.g:27348:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:28932:1: rule__XFunctionTypeRef__ReturnTypeAssignment_2 : ( ruleJvmTypeReference ) ;
     public final void rule__XFunctionTypeRef__ReturnTypeAssignment_2() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27352:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27353:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28936:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:28937:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27353:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27354:3: ruleJvmTypeReference
+            // InternalDataDSL.g:28937:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:28938:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXFunctionTypeRefAccess().getReturnTypeJvmTypeReferenceParserRuleCall_2_0()); 
@@ -88719,23 +93812,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_0"
-    // InternalDataDSL.g:27363:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
+    // InternalDataDSL.g:28947:1: rule__JvmParameterizedTypeReference__TypeAssignment_0 : ( ( ruleQualifiedName ) ) ;
     public final void rule__JvmParameterizedTypeReference__TypeAssignment_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27367:1: ( ( ( ruleQualifiedName ) ) )
-            // InternalDataDSL.g:27368:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28951:1: ( ( ( ruleQualifiedName ) ) )
+            // InternalDataDSL.g:28952:2: ( ( ruleQualifiedName ) )
             {
-            // InternalDataDSL.g:27368:2: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:27369:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28952:2: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:28953:3: ( ruleQualifiedName )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0()); 
             }
-            // InternalDataDSL.g:27370:3: ( ruleQualifiedName )
-            // InternalDataDSL.g:27371:4: ruleQualifiedName
+            // InternalDataDSL.g:28954:3: ( ruleQualifiedName )
+            // InternalDataDSL.g:28955:4: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeQualifiedNameParserRuleCall_0_0_1()); 
@@ -88776,17 +93869,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1"
-    // InternalDataDSL.g:27382:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28966:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27386:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:27387:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28970:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28971:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:27387:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:27388:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28971:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28972:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0()); 
@@ -88821,17 +93914,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1"
-    // InternalDataDSL.g:27397:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:28981:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27401:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:27402:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28985:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:28986:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:27402:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:27403:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:28986:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:28987:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0()); 
@@ -88866,23 +93959,23 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1"
-    // InternalDataDSL.g:27412:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
+    // InternalDataDSL.g:28996:1: rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1 : ( ( ruleValidID ) ) ;
     public final void rule__JvmParameterizedTypeReference__TypeAssignment_1_4_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27416:1: ( ( ( ruleValidID ) ) )
-            // InternalDataDSL.g:27417:2: ( ( ruleValidID ) )
+            // InternalDataDSL.g:29000:1: ( ( ( ruleValidID ) ) )
+            // InternalDataDSL.g:29001:2: ( ( ruleValidID ) )
             {
-            // InternalDataDSL.g:27417:2: ( ( ruleValidID ) )
-            // InternalDataDSL.g:27418:3: ( ruleValidID )
+            // InternalDataDSL.g:29001:2: ( ( ruleValidID ) )
+            // InternalDataDSL.g:29002:3: ( ruleValidID )
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0()); 
             }
-            // InternalDataDSL.g:27419:3: ( ruleValidID )
-            // InternalDataDSL.g:27420:4: ruleValidID
+            // InternalDataDSL.g:29003:3: ( ruleValidID )
+            // InternalDataDSL.g:29004:4: ruleValidID
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeValidIDParserRuleCall_1_4_1_0_1()); 
@@ -88923,17 +94016,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1"
-    // InternalDataDSL.g:27431:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:29015:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27435:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:27436:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:29019:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:29020:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:27436:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:27437:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:29020:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:29021:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0()); 
@@ -88968,17 +94061,17 @@
 
 
     // $ANTLR start "rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1"
-    // InternalDataDSL.g:27446:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
+    // InternalDataDSL.g:29030:1: rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1 : ( ruleJvmArgumentTypeReference ) ;
     public final void rule__JvmParameterizedTypeReference__ArgumentsAssignment_1_4_2_2_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27450:1: ( ( ruleJvmArgumentTypeReference ) )
-            // InternalDataDSL.g:27451:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:29034:1: ( ( ruleJvmArgumentTypeReference ) )
+            // InternalDataDSL.g:29035:2: ( ruleJvmArgumentTypeReference )
             {
-            // InternalDataDSL.g:27451:2: ( ruleJvmArgumentTypeReference )
-            // InternalDataDSL.g:27452:3: ruleJvmArgumentTypeReference
+            // InternalDataDSL.g:29035:2: ( ruleJvmArgumentTypeReference )
+            // InternalDataDSL.g:29036:3: ruleJvmArgumentTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0()); 
@@ -89013,17 +94106,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0"
-    // InternalDataDSL.g:27461:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
+    // InternalDataDSL.g:29045:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0 : ( ruleJvmUpperBound ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27465:1: ( ( ruleJvmUpperBound ) )
-            // InternalDataDSL.g:27466:2: ( ruleJvmUpperBound )
+            // InternalDataDSL.g:29049:1: ( ( ruleJvmUpperBound ) )
+            // InternalDataDSL.g:29050:2: ( ruleJvmUpperBound )
             {
-            // InternalDataDSL.g:27466:2: ( ruleJvmUpperBound )
-            // InternalDataDSL.g:27467:3: ruleJvmUpperBound
+            // InternalDataDSL.g:29050:2: ( ruleJvmUpperBound )
+            // InternalDataDSL.g:29051:3: ruleJvmUpperBound
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0()); 
@@ -89058,17 +94151,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1"
-    // InternalDataDSL.g:27476:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
+    // InternalDataDSL.g:29060:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1 : ( ruleJvmUpperBoundAnded ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_0_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27480:1: ( ( ruleJvmUpperBoundAnded ) )
-            // InternalDataDSL.g:27481:2: ( ruleJvmUpperBoundAnded )
+            // InternalDataDSL.g:29064:1: ( ( ruleJvmUpperBoundAnded ) )
+            // InternalDataDSL.g:29065:2: ( ruleJvmUpperBoundAnded )
             {
-            // InternalDataDSL.g:27481:2: ( ruleJvmUpperBoundAnded )
-            // InternalDataDSL.g:27482:3: ruleJvmUpperBoundAnded
+            // InternalDataDSL.g:29065:2: ( ruleJvmUpperBoundAnded )
+            // InternalDataDSL.g:29066:3: ruleJvmUpperBoundAnded
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0()); 
@@ -89103,17 +94196,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0"
-    // InternalDataDSL.g:27491:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
+    // InternalDataDSL.g:29075:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0 : ( ruleJvmLowerBound ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_0() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27495:1: ( ( ruleJvmLowerBound ) )
-            // InternalDataDSL.g:27496:2: ( ruleJvmLowerBound )
+            // InternalDataDSL.g:29079:1: ( ( ruleJvmLowerBound ) )
+            // InternalDataDSL.g:29080:2: ( ruleJvmLowerBound )
             {
-            // InternalDataDSL.g:27496:2: ( ruleJvmLowerBound )
-            // InternalDataDSL.g:27497:3: ruleJvmLowerBound
+            // InternalDataDSL.g:29080:2: ( ruleJvmLowerBound )
+            // InternalDataDSL.g:29081:3: ruleJvmLowerBound
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0()); 
@@ -89148,17 +94241,17 @@
 
 
     // $ANTLR start "rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1"
-    // InternalDataDSL.g:27506:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
+    // InternalDataDSL.g:29090:1: rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1 : ( ruleJvmLowerBoundAnded ) ;
     public final void rule__JvmWildcardTypeReference__ConstraintsAssignment_2_1_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27510:1: ( ( ruleJvmLowerBoundAnded ) )
-            // InternalDataDSL.g:27511:2: ( ruleJvmLowerBoundAnded )
+            // InternalDataDSL.g:29094:1: ( ( ruleJvmLowerBoundAnded ) )
+            // InternalDataDSL.g:29095:2: ( ruleJvmLowerBoundAnded )
             {
-            // InternalDataDSL.g:27511:2: ( ruleJvmLowerBoundAnded )
-            // InternalDataDSL.g:27512:3: ruleJvmLowerBoundAnded
+            // InternalDataDSL.g:29095:2: ( ruleJvmLowerBoundAnded )
+            // InternalDataDSL.g:29096:3: ruleJvmLowerBoundAnded
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0()); 
@@ -89193,17 +94286,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBound__TypeReferenceAssignment_1"
-    // InternalDataDSL.g:27521:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:29105:1: rule__JvmUpperBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmUpperBound__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27525:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27526:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29109:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:29110:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27526:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27527:3: ruleJvmTypeReference
+            // InternalDataDSL.g:29110:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29111:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -89238,17 +94331,17 @@
 
 
     // $ANTLR start "rule__JvmUpperBoundAnded__TypeReferenceAssignment_1"
-    // InternalDataDSL.g:27536:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:29120:1: rule__JvmUpperBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmUpperBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27540:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27541:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29124:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:29125:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27541:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27542:3: ruleJvmTypeReference
+            // InternalDataDSL.g:29125:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29126:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmUpperBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -89283,17 +94376,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBound__TypeReferenceAssignment_1"
-    // InternalDataDSL.g:27551:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:29135:1: rule__JvmLowerBound__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmLowerBound__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27555:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27556:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29139:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:29140:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27556:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27557:3: ruleJvmTypeReference
+            // InternalDataDSL.g:29140:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29141:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -89328,17 +94421,17 @@
 
 
     // $ANTLR start "rule__JvmLowerBoundAnded__TypeReferenceAssignment_1"
-    // InternalDataDSL.g:27566:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
+    // InternalDataDSL.g:29150:1: rule__JvmLowerBoundAnded__TypeReferenceAssignment_1 : ( ruleJvmTypeReference ) ;
     public final void rule__JvmLowerBoundAnded__TypeReferenceAssignment_1() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27570:1: ( ( ruleJvmTypeReference ) )
-            // InternalDataDSL.g:27571:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29154:1: ( ( ruleJvmTypeReference ) )
+            // InternalDataDSL.g:29155:2: ( ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:27571:2: ( ruleJvmTypeReference )
-            // InternalDataDSL.g:27572:3: ruleJvmTypeReference
+            // InternalDataDSL.g:29155:2: ( ruleJvmTypeReference )
+            // InternalDataDSL.g:29156:3: ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getJvmLowerBoundAndedAccess().getTypeReferenceJvmTypeReferenceParserRuleCall_1_0()); 
@@ -89373,17 +94466,17 @@
 
 
     // $ANTLR start "rule__XImportSection__ImportDeclarationsAssignment"
-    // InternalDataDSL.g:27581:1: rule__XImportSection__ImportDeclarationsAssignment : ( ruleXImportDeclaration ) ;
+    // InternalDataDSL.g:29165:1: rule__XImportSection__ImportDeclarationsAssignment : ( ruleXImportDeclaration ) ;
     public final void rule__XImportSection__ImportDeclarationsAssignment() throws RecognitionException {
 
         		int stackSize = keepStackSize();
         	
         try {
-            // InternalDataDSL.g:27585:1: ( ( ruleXImportDeclaration ) )
-            // InternalDataDSL.g:27586:2: ( ruleXImportDeclaration )
+            // InternalDataDSL.g:29169:1: ( ( ruleXImportDeclaration ) )
+            // InternalDataDSL.g:29170:2: ( ruleXImportDeclaration )
             {
-            // InternalDataDSL.g:27586:2: ( ruleXImportDeclaration )
-            // InternalDataDSL.g:27587:3: ruleXImportDeclaration
+            // InternalDataDSL.g:29170:2: ( ruleXImportDeclaration )
+            // InternalDataDSL.g:29171:3: ruleXImportDeclaration
             {
             if ( state.backtracking==0 ) {
                before(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0()); 
@@ -89416,19 +94509,19 @@
     }
     // $ANTLR end "rule__XImportSection__ImportDeclarationsAssignment"
 
-    // $ANTLR start synpred12_InternalDataDSL
-    public final void synpred12_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3035:2: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) )
-        // InternalDataDSL.g:3035:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+    // $ANTLR start synpred21_InternalDataDSL
+    public final void synpred21_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3284:2: ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) )
+        // InternalDataDSL.g:3284:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
         {
-        // InternalDataDSL.g:3035:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
-        // InternalDataDSL.g:3036:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        // InternalDataDSL.g:3284:2: ( ( rule__XAnnotation__Group_3_1_0__0 ) )
+        // InternalDataDSL.g:3285:3: ( rule__XAnnotation__Group_3_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationAccess().getGroup_3_1_0()); 
         }
-        // InternalDataDSL.g:3037:3: ( rule__XAnnotation__Group_3_1_0__0 )
-        // InternalDataDSL.g:3037:4: rule__XAnnotation__Group_3_1_0__0
+        // InternalDataDSL.g:3286:3: ( rule__XAnnotation__Group_3_1_0__0 )
+        // InternalDataDSL.g:3286:4: rule__XAnnotation__Group_3_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotation__Group_3_1_0__0();
@@ -89444,21 +94537,21 @@
 
         }
     }
-    // $ANTLR end synpred12_InternalDataDSL
+    // $ANTLR end synpred21_InternalDataDSL
 
-    // $ANTLR start synpred13_InternalDataDSL
-    public final void synpred13_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3056:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) )
-        // InternalDataDSL.g:3056:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+    // $ANTLR start synpred22_InternalDataDSL
+    public final void synpred22_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3305:2: ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) )
+        // InternalDataDSL.g:3305:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
         {
-        // InternalDataDSL.g:3056:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
-        // InternalDataDSL.g:3057:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        // InternalDataDSL.g:3305:2: ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) )
+        // InternalDataDSL.g:3306:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getGroup_0()); 
         }
-        // InternalDataDSL.g:3058:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
-        // InternalDataDSL.g:3058:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
+        // InternalDataDSL.g:3307:3: ( rule__XAnnotationElementValueOrCommaList__Group_0__0 )
+        // InternalDataDSL.g:3307:4: rule__XAnnotationElementValueOrCommaList__Group_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotationElementValueOrCommaList__Group_0__0();
@@ -89474,21 +94567,21 @@
 
         }
     }
-    // $ANTLR end synpred13_InternalDataDSL
+    // $ANTLR end synpred22_InternalDataDSL
 
-    // $ANTLR start synpred14_InternalDataDSL
-    public final void synpred14_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3077:2: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) )
-        // InternalDataDSL.g:3077:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+    // $ANTLR start synpred23_InternalDataDSL
+    public final void synpred23_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3326:2: ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) )
+        // InternalDataDSL.g:3326:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
         {
-        // InternalDataDSL.g:3077:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
-        // InternalDataDSL.g:3078:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        // InternalDataDSL.g:3326:2: ( ( rule__XAnnotationElementValue__Group_0__0 ) )
+        // InternalDataDSL.g:3327:3: ( rule__XAnnotationElementValue__Group_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXAnnotationElementValueAccess().getGroup_0()); 
         }
-        // InternalDataDSL.g:3079:3: ( rule__XAnnotationElementValue__Group_0__0 )
-        // InternalDataDSL.g:3079:4: rule__XAnnotationElementValue__Group_0__0
+        // InternalDataDSL.g:3328:3: ( rule__XAnnotationElementValue__Group_0__0 )
+        // InternalDataDSL.g:3328:4: rule__XAnnotationElementValue__Group_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XAnnotationElementValue__Group_0__0();
@@ -89504,21 +94597,21 @@
 
         }
     }
-    // $ANTLR end synpred14_InternalDataDSL
+    // $ANTLR end synpred23_InternalDataDSL
 
-    // $ANTLR start synpred39_InternalDataDSL
-    public final void synpred39_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3362:2: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) )
-        // InternalDataDSL.g:3362:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+    // $ANTLR start synpred48_InternalDataDSL
+    public final void synpred48_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3611:2: ( ( ( rule__OpOther__Group_6_1_0__0 ) ) )
+        // InternalDataDSL.g:3611:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
         {
-        // InternalDataDSL.g:3362:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
-        // InternalDataDSL.g:3363:3: ( rule__OpOther__Group_6_1_0__0 )
+        // InternalDataDSL.g:3611:2: ( ( rule__OpOther__Group_6_1_0__0 ) )
+        // InternalDataDSL.g:3612:3: ( rule__OpOther__Group_6_1_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getOpOtherAccess().getGroup_6_1_0()); 
         }
-        // InternalDataDSL.g:3364:3: ( rule__OpOther__Group_6_1_0__0 )
-        // InternalDataDSL.g:3364:4: rule__OpOther__Group_6_1_0__0
+        // InternalDataDSL.g:3613:3: ( rule__OpOther__Group_6_1_0__0 )
+        // InternalDataDSL.g:3613:4: rule__OpOther__Group_6_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__OpOther__Group_6_1_0__0();
@@ -89534,15 +94627,15 @@
 
         }
     }
-    // $ANTLR end synpred39_InternalDataDSL
+    // $ANTLR end synpred48_InternalDataDSL
 
-    // $ANTLR start synpred40_InternalDataDSL
-    public final void synpred40_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3368:2: ( ( '<' ) )
-        // InternalDataDSL.g:3368:2: ( '<' )
+    // $ANTLR start synpred49_InternalDataDSL
+    public final void synpred49_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3617:2: ( ( '<' ) )
+        // InternalDataDSL.g:3617:2: ( '<' )
         {
-        // InternalDataDSL.g:3368:2: ( '<' )
-        // InternalDataDSL.g:3369:3: '<'
+        // InternalDataDSL.g:3617:2: ( '<' )
+        // InternalDataDSL.g:3618:3: '<'
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_1()); 
@@ -89554,21 +94647,21 @@
 
         }
     }
-    // $ANTLR end synpred40_InternalDataDSL
+    // $ANTLR end synpred49_InternalDataDSL
 
-    // $ANTLR start synpred53_InternalDataDSL
-    public final void synpred53_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3581:2: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) )
-        // InternalDataDSL.g:3581:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+    // $ANTLR start synpred62_InternalDataDSL
+    public final void synpred62_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3830:2: ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) )
+        // InternalDataDSL.g:3830:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
         {
-        // InternalDataDSL.g:3581:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
-        // InternalDataDSL.g:3582:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        // InternalDataDSL.g:3830:2: ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) )
+        // InternalDataDSL.g:3831:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsAssignment_1_1_3_1_0()); 
         }
-        // InternalDataDSL.g:3583:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
-        // InternalDataDSL.g:3583:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
+        // InternalDataDSL.g:3832:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 )
+        // InternalDataDSL.g:3832:4: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0();
@@ -89584,21 +94677,21 @@
 
         }
     }
-    // $ANTLR end synpred53_InternalDataDSL
+    // $ANTLR end synpred62_InternalDataDSL
 
-    // $ANTLR start synpred61_InternalDataDSL
-    public final void synpred61_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3644:2: ( ( ( ruleXForLoopExpression ) ) )
-        // InternalDataDSL.g:3644:2: ( ( ruleXForLoopExpression ) )
+    // $ANTLR start synpred70_InternalDataDSL
+    public final void synpred70_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3893:2: ( ( ( ruleXForLoopExpression ) ) )
+        // InternalDataDSL.g:3893:2: ( ( ruleXForLoopExpression ) )
         {
-        // InternalDataDSL.g:3644:2: ( ( ruleXForLoopExpression ) )
-        // InternalDataDSL.g:3645:3: ( ruleXForLoopExpression )
+        // InternalDataDSL.g:3893:2: ( ( ruleXForLoopExpression ) )
+        // InternalDataDSL.g:3894:3: ( ruleXForLoopExpression )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXPrimaryExpressionAccess().getXForLoopExpressionParserRuleCall_7()); 
         }
-        // InternalDataDSL.g:3646:3: ( ruleXForLoopExpression )
-        // InternalDataDSL.g:3646:4: ruleXForLoopExpression
+        // InternalDataDSL.g:3895:3: ( ruleXForLoopExpression )
+        // InternalDataDSL.g:3895:4: ruleXForLoopExpression
         {
         pushFollow(FOLLOW_2);
         ruleXForLoopExpression();
@@ -89614,15 +94707,15 @@
 
         }
     }
-    // $ANTLR end synpred61_InternalDataDSL
+    // $ANTLR end synpred70_InternalDataDSL
 
-    // $ANTLR start synpred62_InternalDataDSL
-    public final void synpred62_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3650:2: ( ( ruleXBasicForLoopExpression ) )
-        // InternalDataDSL.g:3650:2: ( ruleXBasicForLoopExpression )
+    // $ANTLR start synpred71_InternalDataDSL
+    public final void synpred71_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:3899:2: ( ( ruleXBasicForLoopExpression ) )
+        // InternalDataDSL.g:3899:2: ( ruleXBasicForLoopExpression )
         {
-        // InternalDataDSL.g:3650:2: ( ruleXBasicForLoopExpression )
-        // InternalDataDSL.g:3651:3: ruleXBasicForLoopExpression
+        // InternalDataDSL.g:3899:2: ( ruleXBasicForLoopExpression )
+        // InternalDataDSL.g:3900:3: ruleXBasicForLoopExpression
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXPrimaryExpressionAccess().getXBasicForLoopExpressionParserRuleCall_8()); 
@@ -89638,21 +94731,21 @@
 
         }
     }
-    // $ANTLR end synpred62_InternalDataDSL
+    // $ANTLR end synpred71_InternalDataDSL
 
-    // $ANTLR start synpred75_InternalDataDSL
-    public final void synpred75_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3773:2: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) )
-        // InternalDataDSL.g:3773:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+    // $ANTLR start synpred84_InternalDataDSL
+    public final void synpred84_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:4022:2: ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) )
+        // InternalDataDSL.g:4022:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
         {
-        // InternalDataDSL.g:3773:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
-        // InternalDataDSL.g:3774:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        // InternalDataDSL.g:4022:2: ( ( rule__XSwitchExpression__Group_2_0__0 ) )
+        // InternalDataDSL.g:4023:3: ( rule__XSwitchExpression__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXSwitchExpressionAccess().getGroup_2_0()); 
         }
-        // InternalDataDSL.g:3775:3: ( rule__XSwitchExpression__Group_2_0__0 )
-        // InternalDataDSL.g:3775:4: rule__XSwitchExpression__Group_2_0__0
+        // InternalDataDSL.g:4024:3: ( rule__XSwitchExpression__Group_2_0__0 )
+        // InternalDataDSL.g:4024:4: rule__XSwitchExpression__Group_2_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XSwitchExpression__Group_2_0__0();
@@ -89668,21 +94761,21 @@
 
         }
     }
-    // $ANTLR end synpred75_InternalDataDSL
+    // $ANTLR end synpred84_InternalDataDSL
 
-    // $ANTLR start synpred79_InternalDataDSL
-    public final void synpred79_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3857:2: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) )
-        // InternalDataDSL.g:3857:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+    // $ANTLR start synpred88_InternalDataDSL
+    public final void synpred88_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:4106:2: ( ( ( rule__XVariableDeclaration__Group_2_0__0 ) ) )
+        // InternalDataDSL.g:4106:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
         {
-        // InternalDataDSL.g:3857:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
-        // InternalDataDSL.g:3858:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        // InternalDataDSL.g:4106:2: ( ( rule__XVariableDeclaration__Group_2_0__0 ) )
+        // InternalDataDSL.g:4107:3: ( rule__XVariableDeclaration__Group_2_0__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXVariableDeclarationAccess().getGroup_2_0()); 
         }
-        // InternalDataDSL.g:3859:3: ( rule__XVariableDeclaration__Group_2_0__0 )
-        // InternalDataDSL.g:3859:4: rule__XVariableDeclaration__Group_2_0__0
+        // InternalDataDSL.g:4108:3: ( rule__XVariableDeclaration__Group_2_0__0 )
+        // InternalDataDSL.g:4108:4: rule__XVariableDeclaration__Group_2_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XVariableDeclaration__Group_2_0__0();
@@ -89698,21 +94791,21 @@
 
         }
     }
-    // $ANTLR end synpred79_InternalDataDSL
+    // $ANTLR end synpred88_InternalDataDSL
 
-    // $ANTLR start synpred80_InternalDataDSL
-    public final void synpred80_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3878:2: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) )
-        // InternalDataDSL.g:3878:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+    // $ANTLR start synpred89_InternalDataDSL
+    public final void synpred89_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:4127:2: ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) )
+        // InternalDataDSL.g:4127:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
         {
-        // InternalDataDSL.g:3878:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
-        // InternalDataDSL.g:3879:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        // InternalDataDSL.g:4127:2: ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) )
+        // InternalDataDSL.g:4128:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsAssignment_3_1_0()); 
         }
-        // InternalDataDSL.g:3880:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
-        // InternalDataDSL.g:3880:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
+        // InternalDataDSL.g:4129:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 )
+        // InternalDataDSL.g:4129:4: rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0();
@@ -89728,21 +94821,21 @@
 
         }
     }
-    // $ANTLR end synpred80_InternalDataDSL
+    // $ANTLR end synpred89_InternalDataDSL
 
-    // $ANTLR start synpred86_InternalDataDSL
-    public final void synpred86_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3959:2: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) )
-        // InternalDataDSL.g:3959:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+    // $ANTLR start synpred95_InternalDataDSL
+    public final void synpred95_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:4208:2: ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) )
+        // InternalDataDSL.g:4208:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
         {
-        // InternalDataDSL.g:3959:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
-        // InternalDataDSL.g:3960:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        // InternalDataDSL.g:4208:2: ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) )
+        // InternalDataDSL.g:4209:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getXConstructorCallAccess().getArgumentsAssignment_4_1_0()); 
         }
-        // InternalDataDSL.g:3961:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
-        // InternalDataDSL.g:3961:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
+        // InternalDataDSL.g:4210:3: ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 )
+        // InternalDataDSL.g:4210:4: rule__XConstructorCall__ArgumentsAssignment_4_1_0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__ArgumentsAssignment_4_1_0();
@@ -89758,165 +94851,15 @@
 
         }
     }
-    // $ANTLR end synpred86_InternalDataDSL
-
-    // $ANTLR start synpred170_InternalDataDSL
-    public final void synpred170_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:11890:3: ( rule__XAssignment__Group_1_1__0 )
-        // InternalDataDSL.g:11890:3: rule__XAssignment__Group_1_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XAssignment__Group_1_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred170_InternalDataDSL
-
-    // $ANTLR start synpred172_InternalDataDSL
-    public final void synpred172_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:12241:3: ( rule__XOrExpression__Group_1__0 )
-        // InternalDataDSL.g:12241:3: rule__XOrExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XOrExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred172_InternalDataDSL
-
-    // $ANTLR start synpred173_InternalDataDSL
-    public final void synpred173_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:12430:3: ( rule__XAndExpression__Group_1__0 )
-        // InternalDataDSL.g:12430:3: rule__XAndExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XAndExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred173_InternalDataDSL
-
-    // $ANTLR start synpred174_InternalDataDSL
-    public final void synpred174_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:12619:3: ( rule__XEqualityExpression__Group_1__0 )
-        // InternalDataDSL.g:12619:3: rule__XEqualityExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XEqualityExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred174_InternalDataDSL
-
-    // $ANTLR start synpred175_InternalDataDSL
-    public final void synpred175_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:12808:3: ( rule__XRelationalExpression__Alternatives_1 )
-        // InternalDataDSL.g:12808:3: rule__XRelationalExpression__Alternatives_1
-        {
-        pushFollow(FOLLOW_2);
-        rule__XRelationalExpression__Alternatives_1();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred175_InternalDataDSL
-
-    // $ANTLR start synpred176_InternalDataDSL
-    public final void synpred176_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:13186:3: ( rule__XOtherOperatorExpression__Group_1__0 )
-        // InternalDataDSL.g:13186:3: rule__XOtherOperatorExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XOtherOperatorExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred176_InternalDataDSL
-
-    // $ANTLR start synpred177_InternalDataDSL
-    public final void synpred177_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:13699:3: ( rule__XAdditiveExpression__Group_1__0 )
-        // InternalDataDSL.g:13699:3: rule__XAdditiveExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XAdditiveExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred177_InternalDataDSL
-
-    // $ANTLR start synpred178_InternalDataDSL
-    public final void synpred178_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:13888:3: ( rule__XMultiplicativeExpression__Group_1__0 )
-        // InternalDataDSL.g:13888:3: rule__XMultiplicativeExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XMultiplicativeExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred178_InternalDataDSL
-
-    // $ANTLR start synpred179_InternalDataDSL
-    public final void synpred179_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:14158:3: ( rule__XCastedExpression__Group_1__0 )
-        // InternalDataDSL.g:14158:3: rule__XCastedExpression__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XCastedExpression__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred179_InternalDataDSL
-
-    // $ANTLR start synpred180_InternalDataDSL
-    public final void synpred180_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:14347:3: ( rule__XPostfixOperation__Group_1__0 )
-        // InternalDataDSL.g:14347:3: rule__XPostfixOperation__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XPostfixOperation__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred180_InternalDataDSL
+    // $ANTLR end synpred95_InternalDataDSL
 
     // $ANTLR start synpred181_InternalDataDSL
     public final void synpred181_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:14482:3: ( rule__XMemberFeatureCall__Alternatives_1 )
-        // InternalDataDSL.g:14482:3: rule__XMemberFeatureCall__Alternatives_1
+        // InternalDataDSL.g:12976:3: ( rule__XAssignment__Group_1_1__0 )
+        // InternalDataDSL.g:12976:3: rule__XAssignment__Group_1_1__0
         {
         pushFollow(FOLLOW_2);
-        rule__XMemberFeatureCall__Alternatives_1();
+        rule__XAssignment__Group_1_1__0();
 
         state._fsp--;
         if (state.failed) return ;
@@ -89927,11 +94870,11 @@
 
     // $ANTLR start synpred183_InternalDataDSL
     public final void synpred183_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:14780:3: ( rule__XMemberFeatureCall__Group_1_1_3__0 )
-        // InternalDataDSL.g:14780:3: rule__XMemberFeatureCall__Group_1_1_3__0
+        // InternalDataDSL.g:13327:3: ( rule__XOrExpression__Group_1__0 )
+        // InternalDataDSL.g:13327:3: rule__XOrExpression__Group_1__0
         {
         pushFollow(FOLLOW_2);
-        rule__XMemberFeatureCall__Group_1_1_3__0();
+        rule__XOrExpression__Group_1__0();
 
         state._fsp--;
         if (state.failed) return ;
@@ -89942,8 +94885,158 @@
 
     // $ANTLR start synpred184_InternalDataDSL
     public final void synpred184_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:14806:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )
-        // InternalDataDSL.g:14806:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
+        // InternalDataDSL.g:13516:3: ( rule__XAndExpression__Group_1__0 )
+        // InternalDataDSL.g:13516:3: rule__XAndExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAndExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred184_InternalDataDSL
+
+    // $ANTLR start synpred185_InternalDataDSL
+    public final void synpred185_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:13705:3: ( rule__XEqualityExpression__Group_1__0 )
+        // InternalDataDSL.g:13705:3: rule__XEqualityExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XEqualityExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred185_InternalDataDSL
+
+    // $ANTLR start synpred186_InternalDataDSL
+    public final void synpred186_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:13894:3: ( rule__XRelationalExpression__Alternatives_1 )
+        // InternalDataDSL.g:13894:3: rule__XRelationalExpression__Alternatives_1
+        {
+        pushFollow(FOLLOW_2);
+        rule__XRelationalExpression__Alternatives_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred186_InternalDataDSL
+
+    // $ANTLR start synpred187_InternalDataDSL
+    public final void synpred187_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:14272:3: ( rule__XOtherOperatorExpression__Group_1__0 )
+        // InternalDataDSL.g:14272:3: rule__XOtherOperatorExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XOtherOperatorExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred187_InternalDataDSL
+
+    // $ANTLR start synpred188_InternalDataDSL
+    public final void synpred188_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:14785:3: ( rule__XAdditiveExpression__Group_1__0 )
+        // InternalDataDSL.g:14785:3: rule__XAdditiveExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XAdditiveExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred188_InternalDataDSL
+
+    // $ANTLR start synpred189_InternalDataDSL
+    public final void synpred189_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:14974:3: ( rule__XMultiplicativeExpression__Group_1__0 )
+        // InternalDataDSL.g:14974:3: rule__XMultiplicativeExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMultiplicativeExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred189_InternalDataDSL
+
+    // $ANTLR start synpred190_InternalDataDSL
+    public final void synpred190_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:15244:3: ( rule__XCastedExpression__Group_1__0 )
+        // InternalDataDSL.g:15244:3: rule__XCastedExpression__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XCastedExpression__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred190_InternalDataDSL
+
+    // $ANTLR start synpred191_InternalDataDSL
+    public final void synpred191_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:15433:3: ( rule__XPostfixOperation__Group_1__0 )
+        // InternalDataDSL.g:15433:3: rule__XPostfixOperation__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XPostfixOperation__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred191_InternalDataDSL
+
+    // $ANTLR start synpred192_InternalDataDSL
+    public final void synpred192_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:15568:3: ( rule__XMemberFeatureCall__Alternatives_1 )
+        // InternalDataDSL.g:15568:3: rule__XMemberFeatureCall__Alternatives_1
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__Alternatives_1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred192_InternalDataDSL
+
+    // $ANTLR start synpred194_InternalDataDSL
+    public final void synpred194_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:15866:3: ( rule__XMemberFeatureCall__Group_1_1_3__0 )
+        // InternalDataDSL.g:15866:3: rule__XMemberFeatureCall__Group_1_1_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XMemberFeatureCall__Group_1_1_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred194_InternalDataDSL
+
+    // $ANTLR start synpred195_InternalDataDSL
+    public final void synpred195_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:15892:3: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )
+        // InternalDataDSL.g:15892:3: rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4
         {
         pushFollow(FOLLOW_2);
         rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4();
@@ -89953,12 +95046,12 @@
 
         }
     }
-    // $ANTLR end synpred184_InternalDataDSL
+    // $ANTLR end synpred195_InternalDataDSL
 
-    // $ANTLR start synpred192_InternalDataDSL
-    public final void synpred192_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:15779:3: ( rule__XClosure__Group_1__0 )
-        // InternalDataDSL.g:15779:3: rule__XClosure__Group_1__0
+    // $ANTLR start synpred203_InternalDataDSL
+    public final void synpred203_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:16865:3: ( rule__XClosure__Group_1__0 )
+        // InternalDataDSL.g:16865:3: rule__XClosure__Group_1__0
         {
         pushFollow(FOLLOW_2);
         rule__XClosure__Group_1__0();
@@ -89968,12 +95061,12 @@
 
         }
     }
-    // $ANTLR end synpred192_InternalDataDSL
+    // $ANTLR end synpred203_InternalDataDSL
 
-    // $ANTLR start synpred199_InternalDataDSL
-    public final void synpred199_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:16750:3: ( rule__XIfExpression__Group_6__0 )
-        // InternalDataDSL.g:16750:3: rule__XIfExpression__Group_6__0
+    // $ANTLR start synpred210_InternalDataDSL
+    public final void synpred210_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:17836:3: ( rule__XIfExpression__Group_6__0 )
+        // InternalDataDSL.g:17836:3: rule__XIfExpression__Group_6__0
         {
         pushFollow(FOLLOW_2);
         rule__XIfExpression__Group_6__0();
@@ -89983,12 +95076,12 @@
 
         }
     }
-    // $ANTLR end synpred199_InternalDataDSL
+    // $ANTLR end synpred210_InternalDataDSL
 
-    // $ANTLR start synpred202_InternalDataDSL
-    public final void synpred202_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:17210:3: ( rule__XSwitchExpression__Group_2_1_0__0 )
-        // InternalDataDSL.g:17210:3: rule__XSwitchExpression__Group_2_1_0__0
+    // $ANTLR start synpred213_InternalDataDSL
+    public final void synpred213_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:18296:3: ( rule__XSwitchExpression__Group_2_1_0__0 )
+        // InternalDataDSL.g:18296:3: rule__XSwitchExpression__Group_2_1_0__0
         {
         pushFollow(FOLLOW_2);
         rule__XSwitchExpression__Group_2_1_0__0();
@@ -89998,12 +95091,12 @@
 
         }
     }
-    // $ANTLR end synpred202_InternalDataDSL
+    // $ANTLR end synpred213_InternalDataDSL
 
-    // $ANTLR start synpred215_InternalDataDSL
-    public final void synpred215_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:19343:3: ( rule__XFeatureCall__Group_3__0 )
-        // InternalDataDSL.g:19343:3: rule__XFeatureCall__Group_3__0
+    // $ANTLR start synpred226_InternalDataDSL
+    public final void synpred226_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:20429:3: ( rule__XFeatureCall__Group_3__0 )
+        // InternalDataDSL.g:20429:3: rule__XFeatureCall__Group_3__0
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__Group_3__0();
@@ -90013,12 +95106,12 @@
 
         }
     }
-    // $ANTLR end synpred215_InternalDataDSL
+    // $ANTLR end synpred226_InternalDataDSL
 
-    // $ANTLR start synpred216_InternalDataDSL
-    public final void synpred216_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:19369:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )
-        // InternalDataDSL.g:19369:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
+    // $ANTLR start synpred227_InternalDataDSL
+    public final void synpred227_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:20455:3: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )
+        // InternalDataDSL.g:20455:3: rule__XFeatureCall__FeatureCallArgumentsAssignment_4
         {
         pushFollow(FOLLOW_2);
         rule__XFeatureCall__FeatureCallArgumentsAssignment_4();
@@ -90028,12 +95121,12 @@
 
         }
     }
-    // $ANTLR end synpred216_InternalDataDSL
+    // $ANTLR end synpred227_InternalDataDSL
 
-    // $ANTLR start synpred220_InternalDataDSL
-    public final void synpred220_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:19829:3: ( rule__XConstructorCall__Group_3__0 )
-        // InternalDataDSL.g:19829:3: rule__XConstructorCall__Group_3__0
+    // $ANTLR start synpred231_InternalDataDSL
+    public final void synpred231_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:20915:3: ( rule__XConstructorCall__Group_3__0 )
+        // InternalDataDSL.g:20915:3: rule__XConstructorCall__Group_3__0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__Group_3__0();
@@ -90043,12 +95136,12 @@
 
         }
     }
-    // $ANTLR end synpred220_InternalDataDSL
+    // $ANTLR end synpred231_InternalDataDSL
 
-    // $ANTLR start synpred221_InternalDataDSL
-    public final void synpred221_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:19856:3: ( rule__XConstructorCall__Group_4__0 )
-        // InternalDataDSL.g:19856:3: rule__XConstructorCall__Group_4__0
+    // $ANTLR start synpred232_InternalDataDSL
+    public final void synpred232_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:20942:3: ( rule__XConstructorCall__Group_4__0 )
+        // InternalDataDSL.g:20942:3: rule__XConstructorCall__Group_4__0
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__Group_4__0();
@@ -90058,12 +95151,12 @@
 
         }
     }
-    // $ANTLR end synpred221_InternalDataDSL
+    // $ANTLR end synpred232_InternalDataDSL
 
-    // $ANTLR start synpred222_InternalDataDSL
-    public final void synpred222_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:19882:3: ( rule__XConstructorCall__ArgumentsAssignment_5 )
-        // InternalDataDSL.g:19882:3: rule__XConstructorCall__ArgumentsAssignment_5
+    // $ANTLR start synpred233_InternalDataDSL
+    public final void synpred233_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:20968:3: ( rule__XConstructorCall__ArgumentsAssignment_5 )
+        // InternalDataDSL.g:20968:3: rule__XConstructorCall__ArgumentsAssignment_5
         {
         pushFollow(FOLLOW_2);
         rule__XConstructorCall__ArgumentsAssignment_5();
@@ -90073,105 +95166,15 @@
 
         }
     }
-    // $ANTLR end synpred222_InternalDataDSL
-
-    // $ANTLR start synpred227_InternalDataDSL
-    public final void synpred227_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:20773:3: ( rule__XReturnExpression__ExpressionAssignment_2 )
-        // InternalDataDSL.g:20773:3: rule__XReturnExpression__ExpressionAssignment_2
-        {
-        pushFollow(FOLLOW_2);
-        rule__XReturnExpression__ExpressionAssignment_2();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred227_InternalDataDSL
-
-    // $ANTLR start synpred228_InternalDataDSL
-    public final void synpred228_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:20915:4: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
-        // InternalDataDSL.g:20915:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred228_InternalDataDSL
-
-    // $ANTLR start synpred229_InternalDataDSL
-    public final void synpred229_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:20942:3: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )
-        // InternalDataDSL.g:20942:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__XTryCatchFinallyExpression__Group_3_0_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred229_InternalDataDSL
-
-    // $ANTLR start synpred230_InternalDataDSL
-    public final void synpred230_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:21455:3: ( rule__QualifiedName__Group_1__0 )
-        // InternalDataDSL.g:21455:3: rule__QualifiedName__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__QualifiedName__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred230_InternalDataDSL
-
-    // $ANTLR start synpred232_InternalDataDSL
-    public final void synpred232_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:21671:3: ( rule__JvmTypeReference__Group_0_1__0 )
-        // InternalDataDSL.g:21671:3: rule__JvmTypeReference__Group_0_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__JvmTypeReference__Group_0_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred232_InternalDataDSL
-
-    // $ANTLR start synpred236_InternalDataDSL
-    public final void synpred236_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:22130:3: ( rule__JvmParameterizedTypeReference__Group_1__0 )
-        // InternalDataDSL.g:22130:3: rule__JvmParameterizedTypeReference__Group_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__JvmParameterizedTypeReference__Group_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred236_InternalDataDSL
+    // $ANTLR end synpred233_InternalDataDSL
 
     // $ANTLR start synpred238_InternalDataDSL
     public final void synpred238_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:22265:3: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )
-        // InternalDataDSL.g:22265:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+        // InternalDataDSL.g:21859:3: ( rule__XReturnExpression__ExpressionAssignment_2 )
+        // InternalDataDSL.g:21859:3: rule__XReturnExpression__ExpressionAssignment_2
         {
         pushFollow(FOLLOW_2);
-        rule__JvmParameterizedTypeReference__Group_1_4__0();
+        rule__XReturnExpression__ExpressionAssignment_2();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90182,8 +95185,98 @@
 
     // $ANTLR start synpred239_InternalDataDSL
     public final void synpred239_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:22400:3: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )
-        // InternalDataDSL.g:22400:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
+        // InternalDataDSL.g:22001:4: ( rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0 )
+        // InternalDataDSL.g:22001:4: rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XTryCatchFinallyExpression__CatchClausesAssignment_3_0_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred239_InternalDataDSL
+
+    // $ANTLR start synpred240_InternalDataDSL
+    public final void synpred240_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:22028:3: ( rule__XTryCatchFinallyExpression__Group_3_0_1__0 )
+        // InternalDataDSL.g:22028:3: rule__XTryCatchFinallyExpression__Group_3_0_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__XTryCatchFinallyExpression__Group_3_0_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred240_InternalDataDSL
+
+    // $ANTLR start synpred241_InternalDataDSL
+    public final void synpred241_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:22541:3: ( rule__QualifiedName__Group_1__0 )
+        // InternalDataDSL.g:22541:3: rule__QualifiedName__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__QualifiedName__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred241_InternalDataDSL
+
+    // $ANTLR start synpred243_InternalDataDSL
+    public final void synpred243_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:22757:3: ( rule__JvmTypeReference__Group_0_1__0 )
+        // InternalDataDSL.g:22757:3: rule__JvmTypeReference__Group_0_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmTypeReference__Group_0_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred243_InternalDataDSL
+
+    // $ANTLR start synpred247_InternalDataDSL
+    public final void synpred247_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:23216:3: ( rule__JvmParameterizedTypeReference__Group_1__0 )
+        // InternalDataDSL.g:23216:3: rule__JvmParameterizedTypeReference__Group_1__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmParameterizedTypeReference__Group_1__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred247_InternalDataDSL
+
+    // $ANTLR start synpred249_InternalDataDSL
+    public final void synpred249_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:23351:3: ( rule__JvmParameterizedTypeReference__Group_1_4__0 )
+        // InternalDataDSL.g:23351:3: rule__JvmParameterizedTypeReference__Group_1_4__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__JvmParameterizedTypeReference__Group_1_4__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred249_InternalDataDSL
+
+    // $ANTLR start synpred250_InternalDataDSL
+    public final void synpred250_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:23486:3: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )
+        // InternalDataDSL.g:23486:3: rule__JvmParameterizedTypeReference__Group_1_4_2__0
         {
         pushFollow(FOLLOW_2);
         rule__JvmParameterizedTypeReference__Group_1_4_2__0();
@@ -90193,12 +95286,12 @@
 
         }
     }
-    // $ANTLR end synpred239_InternalDataDSL
+    // $ANTLR end synpred250_InternalDataDSL
 
-    // $ANTLR start synpred244_InternalDataDSL
-    public final void synpred244_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23198:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )
-        // InternalDataDSL.g:23198:2: rule__DataInterchangeFileXML__UnorderedGroup_3__0
+    // $ANTLR start synpred255_InternalDataDSL
+    public final void synpred255_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24284:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__0 )
+        // InternalDataDSL.g:24284:2: rule__DataInterchangeFileXML__UnorderedGroup_3__0
         {
         pushFollow(FOLLOW_2);
         rule__DataInterchangeFileXML__UnorderedGroup_3__0();
@@ -90208,32 +95301,32 @@
 
         }
     }
-    // $ANTLR end synpred244_InternalDataDSL
+    // $ANTLR end synpred255_InternalDataDSL
 
-    // $ANTLR start synpred245_InternalDataDSL
-    public final void synpred245_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23213:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) )
-        // InternalDataDSL.g:23213:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
+    // $ANTLR start synpred256_InternalDataDSL
+    public final void synpred256_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24299:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) ) )
+        // InternalDataDSL.g:24299:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
         {
-        // InternalDataDSL.g:23213:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
-        // InternalDataDSL.g:23214:4: {...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
+        // InternalDataDSL.g:24299:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) ) )
+        // InternalDataDSL.g:24300:4: {...}? => ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred245_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0)");
+            throw new FailedPredicateException(input, "synpred256_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0)");
         }
-        // InternalDataDSL.g:23214:118: ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
-        // InternalDataDSL.g:23215:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
+        // InternalDataDSL.g:24300:118: ( ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) ) )
+        // InternalDataDSL.g:24301:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0);
-        // InternalDataDSL.g:23221:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
-        // InternalDataDSL.g:23222:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
+        // InternalDataDSL.g:24307:5: ( ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 ) )
+        // InternalDataDSL.g:24308:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getDataInterchangeFileXMLAccess().getByAttributeAssignment_3_0()); 
         }
-        // InternalDataDSL.g:23223:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
-        // InternalDataDSL.g:23223:7: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0
+        // InternalDataDSL.g:24309:6: ( rule__DataInterchangeFileXML__ByAttributeAssignment_3_0 )
+        // InternalDataDSL.g:24309:7: rule__DataInterchangeFileXML__ByAttributeAssignment_3_0
         {
         pushFollow(FOLLOW_2);
         rule__DataInterchangeFileXML__ByAttributeAssignment_3_0();
@@ -90255,32 +95348,32 @@
 
         }
     }
-    // $ANTLR end synpred245_InternalDataDSL
+    // $ANTLR end synpred256_InternalDataDSL
 
-    // $ANTLR start synpred246_InternalDataDSL
-    public final void synpred246_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23228:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) )
-        // InternalDataDSL.g:23228:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
+    // $ANTLR start synpred257_InternalDataDSL
+    public final void synpred257_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24314:3: ( ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) ) )
+        // InternalDataDSL.g:24314:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
         {
-        // InternalDataDSL.g:23228:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
-        // InternalDataDSL.g:23229:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
+        // InternalDataDSL.g:24314:3: ({...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) ) )
+        // InternalDataDSL.g:24315:4: {...}? => ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
         {
         if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred246_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1)");
+            throw new FailedPredicateException(input, "synpred257_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1)");
         }
-        // InternalDataDSL.g:23229:118: ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
-        // InternalDataDSL.g:23230:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
+        // InternalDataDSL.g:24315:118: ( ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) ) )
+        // InternalDataDSL.g:24316:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
         {
         getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1);
-        // InternalDataDSL.g:23236:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
-        // InternalDataDSL.g:23237:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
+        // InternalDataDSL.g:24322:5: ( ( rule__DataInterchangeFileXML__Group_3_1__0 ) )
+        // InternalDataDSL.g:24323:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
         {
         if ( state.backtracking==0 ) {
            before(grammarAccess.getDataInterchangeFileXMLAccess().getGroup_3_1()); 
         }
-        // InternalDataDSL.g:23238:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
-        // InternalDataDSL.g:23238:7: rule__DataInterchangeFileXML__Group_3_1__0
+        // InternalDataDSL.g:24324:6: ( rule__DataInterchangeFileXML__Group_3_1__0 )
+        // InternalDataDSL.g:24324:7: rule__DataInterchangeFileXML__Group_3_1__0
         {
         pushFollow(FOLLOW_2);
         rule__DataInterchangeFileXML__Group_3_1__0();
@@ -90302,340 +95395,15 @@
 
         }
     }
-    // $ANTLR end synpred246_InternalDataDSL
-
-    // $ANTLR start synpred247_InternalDataDSL
-    public final void synpred247_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23272:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )
-        // InternalDataDSL.g:23272:2: rule__DataInterchangeFileXML__UnorderedGroup_3__1
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileXML__UnorderedGroup_3__1();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred247_InternalDataDSL
-
-    // $ANTLR start synpred248_InternalDataDSL
-    public final void synpred248_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23284:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )
-        // InternalDataDSL.g:23284:2: rule__DataInterchangeFileXML__UnorderedGroup_3__2
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileXML__UnorderedGroup_3__2();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred248_InternalDataDSL
-
-    // $ANTLR start synpred249_InternalDataDSL
-    public final void synpred249_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23308:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )
-        // InternalDataDSL.g:23308:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred249_InternalDataDSL
-
-    // $ANTLR start synpred250_InternalDataDSL
-    public final void synpred250_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23323:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) )
-        // InternalDataDSL.g:23323:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
-        {
-        // InternalDataDSL.g:23323:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
-        // InternalDataDSL.g:23324:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
-        {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
-            if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred250_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0)");
-        }
-        // InternalDataDSL.g:23324:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
-        // InternalDataDSL.g:23325:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
-        {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0);
-        // InternalDataDSL.g:23331:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
-        // InternalDataDSL.g:23332:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
-        {
-        if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_0()); 
-        }
-        // InternalDataDSL.g:23333:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
-        // InternalDataDSL.g:23333:7: rule__DataInterchangeFileCSV__Group_3_0__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__Group_3_0__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-    }
-    // $ANTLR end synpred250_InternalDataDSL
-
-    // $ANTLR start synpred251_InternalDataDSL
-    public final void synpred251_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23338:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) )
-        // InternalDataDSL.g:23338:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
-        {
-        // InternalDataDSL.g:23338:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
-        // InternalDataDSL.g:23339:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
-        {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
-            if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred251_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1)");
-        }
-        // InternalDataDSL.g:23339:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
-        // InternalDataDSL.g:23340:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
-        {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1);
-        // InternalDataDSL.g:23346:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
-        // InternalDataDSL.g:23347:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
-        {
-        if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_1()); 
-        }
-        // InternalDataDSL.g:23348:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
-        // InternalDataDSL.g:23348:7: rule__DataInterchangeFileCSV__Group_3_1__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__Group_3_1__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-    }
-    // $ANTLR end synpred251_InternalDataDSL
-
-    // $ANTLR start synpred252_InternalDataDSL
-    public final void synpred252_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23353:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) )
-        // InternalDataDSL.g:23353:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
-        {
-        // InternalDataDSL.g:23353:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
-        // InternalDataDSL.g:23354:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
-        {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
-            if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred252_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2)");
-        }
-        // InternalDataDSL.g:23354:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
-        // InternalDataDSL.g:23355:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
-        {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2);
-        // InternalDataDSL.g:23361:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
-        // InternalDataDSL.g:23362:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
-        {
-        if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_2()); 
-        }
-        // InternalDataDSL.g:23363:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
-        // InternalDataDSL.g:23363:7: rule__DataInterchangeFileCSV__Group_3_2__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__Group_3_2__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-    }
-    // $ANTLR end synpred252_InternalDataDSL
-
-    // $ANTLR start synpred253_InternalDataDSL
-    public final void synpred253_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23368:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) )
-        // InternalDataDSL.g:23368:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
-        {
-        // InternalDataDSL.g:23368:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
-        // InternalDataDSL.g:23369:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
-        {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
-            if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred253_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3)");
-        }
-        // InternalDataDSL.g:23369:118: ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
-        // InternalDataDSL.g:23370:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
-        {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3);
-        // InternalDataDSL.g:23376:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
-        // InternalDataDSL.g:23377:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
-        {
-        if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileCSVAccess().getIndentAssignment_3_3()); 
-        }
-        // InternalDataDSL.g:23378:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
-        // InternalDataDSL.g:23378:7: rule__DataInterchangeFileCSV__IndentAssignment_3_3
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__IndentAssignment_3_3();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-    }
-    // $ANTLR end synpred253_InternalDataDSL
-
-    // $ANTLR start synpred254_InternalDataDSL
-    public final void synpred254_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23383:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) )
-        // InternalDataDSL.g:23383:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
-        {
-        // InternalDataDSL.g:23383:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
-        // InternalDataDSL.g:23384:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
-        {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
-            if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred254_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4)");
-        }
-        // InternalDataDSL.g:23384:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
-        // InternalDataDSL.g:23385:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
-        {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4);
-        // InternalDataDSL.g:23391:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
-        // InternalDataDSL.g:23392:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
-        {
-        if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_4()); 
-        }
-        // InternalDataDSL.g:23393:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
-        // InternalDataDSL.g:23393:7: rule__DataInterchangeFileCSV__Group_3_4__0
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__Group_3_4__0();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-
-
-        }
-    }
-    // $ANTLR end synpred254_InternalDataDSL
-
-    // $ANTLR start synpred255_InternalDataDSL
-    public final void synpred255_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23427:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )
-        // InternalDataDSL.g:23427:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__1
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__1();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred255_InternalDataDSL
-
-    // $ANTLR start synpred256_InternalDataDSL
-    public final void synpred256_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23439:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )
-        // InternalDataDSL.g:23439:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__2
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__2();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
-    // $ANTLR end synpred256_InternalDataDSL
-
-    // $ANTLR start synpred257_InternalDataDSL
-    public final void synpred257_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23451:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )
-        // InternalDataDSL.g:23451:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__3
-        {
-        pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__3();
-
-        state._fsp--;
-        if (state.failed) return ;
-
-        }
-    }
     // $ANTLR end synpred257_InternalDataDSL
 
     // $ANTLR start synpred258_InternalDataDSL
     public final void synpred258_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23463:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )
-        // InternalDataDSL.g:23463:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__4
+        // InternalDataDSL.g:24358:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__1 )
+        // InternalDataDSL.g:24358:2: rule__DataInterchangeFileXML__UnorderedGroup_3__1
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__4();
+        rule__DataInterchangeFileXML__UnorderedGroup_3__1();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90646,11 +95414,11 @@
 
     // $ANTLR start synpred259_InternalDataDSL
     public final void synpred259_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23475:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )
-        // InternalDataDSL.g:23475:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__5
+        // InternalDataDSL.g:24370:2: ( rule__DataInterchangeFileXML__UnorderedGroup_3__2 )
+        // InternalDataDSL.g:24370:2: rule__DataInterchangeFileXML__UnorderedGroup_3__2
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileCSV__UnorderedGroup_3__5();
+        rule__DataInterchangeFileXML__UnorderedGroup_3__2();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90661,11 +95429,11 @@
 
     // $ANTLR start synpred260_InternalDataDSL
     public final void synpred260_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23499:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )
-        // InternalDataDSL.g:23499:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__0
+        // InternalDataDSL.g:24394:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__0 )
+        // InternalDataDSL.g:24394:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__0
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileEDI__UnorderedGroup_3__0();
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__0();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90676,31 +95444,31 @@
 
     // $ANTLR start synpred261_InternalDataDSL
     public final void synpred261_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23514:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) )
-        // InternalDataDSL.g:23514:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
+        // InternalDataDSL.g:24409:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) ) )
+        // InternalDataDSL.g:24409:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
         {
-        // InternalDataDSL.g:23514:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
-        // InternalDataDSL.g:23515:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
+        // InternalDataDSL.g:24409:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) ) )
+        // InternalDataDSL.g:24410:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
         {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred261_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0)");
+            throw new FailedPredicateException(input, "synpred261_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0)");
         }
-        // InternalDataDSL.g:23515:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
-        // InternalDataDSL.g:23516:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
+        // InternalDataDSL.g:24410:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) ) )
+        // InternalDataDSL.g:24411:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
         {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0);
-        // InternalDataDSL.g:23522:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
-        // InternalDataDSL.g:23523:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0);
+        // InternalDataDSL.g:24417:5: ( ( rule__DataInterchangeFileCSV__Group_3_0__0 ) )
+        // InternalDataDSL.g:24418:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
         {
         if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_0()); 
+           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_0()); 
         }
-        // InternalDataDSL.g:23524:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
-        // InternalDataDSL.g:23524:7: rule__DataInterchangeFileEDI__Group_3_0__0
+        // InternalDataDSL.g:24419:6: ( rule__DataInterchangeFileCSV__Group_3_0__0 )
+        // InternalDataDSL.g:24419:7: rule__DataInterchangeFileCSV__Group_3_0__0
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileEDI__Group_3_0__0();
+        rule__DataInterchangeFileCSV__Group_3_0__0();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90723,61 +95491,125 @@
 
     // $ANTLR start synpred262_InternalDataDSL
     public final void synpred262_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23558:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )
-        // InternalDataDSL.g:23558:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__1
+        // InternalDataDSL.g:24424:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) ) )
+        // InternalDataDSL.g:24424:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
+        {
+        // InternalDataDSL.g:24424:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) ) )
+        // InternalDataDSL.g:24425:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred262_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1)");
+        }
+        // InternalDataDSL.g:24425:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) ) )
+        // InternalDataDSL.g:24426:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1);
+        // InternalDataDSL.g:24432:5: ( ( rule__DataInterchangeFileCSV__Group_3_1__0 ) )
+        // InternalDataDSL.g:24433:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_1()); 
+        }
+        // InternalDataDSL.g:24434:6: ( rule__DataInterchangeFileCSV__Group_3_1__0 )
+        // InternalDataDSL.g:24434:7: rule__DataInterchangeFileCSV__Group_3_1__0
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeFileEDI__UnorderedGroup_3__1();
+        rule__DataInterchangeFileCSV__Group_3_1__0();
 
         state._fsp--;
         if (state.failed) return ;
 
         }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
     }
     // $ANTLR end synpred262_InternalDataDSL
 
     // $ANTLR start synpred263_InternalDataDSL
     public final void synpred263_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23582:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__0 )
-        // InternalDataDSL.g:23582:2: rule__DataInterchangeLookup__UnorderedGroup_10__0
+        // InternalDataDSL.g:24439:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) ) )
+        // InternalDataDSL.g:24439:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
+        {
+        // InternalDataDSL.g:24439:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) ) )
+        // InternalDataDSL.g:24440:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred263_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2)");
+        }
+        // InternalDataDSL.g:24440:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) ) )
+        // InternalDataDSL.g:24441:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2);
+        // InternalDataDSL.g:24447:5: ( ( rule__DataInterchangeFileCSV__Group_3_2__0 ) )
+        // InternalDataDSL.g:24448:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_2()); 
+        }
+        // InternalDataDSL.g:24449:6: ( rule__DataInterchangeFileCSV__Group_3_2__0 )
+        // InternalDataDSL.g:24449:7: rule__DataInterchangeFileCSV__Group_3_2__0
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeLookup__UnorderedGroup_10__0();
+        rule__DataInterchangeFileCSV__Group_3_2__0();
 
         state._fsp--;
         if (state.failed) return ;
 
         }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
     }
     // $ANTLR end synpred263_InternalDataDSL
 
     // $ANTLR start synpred264_InternalDataDSL
     public final void synpred264_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23597:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) ) )
-        // InternalDataDSL.g:23597:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) )
+        // InternalDataDSL.g:24454:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) ) )
+        // InternalDataDSL.g:24454:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
         {
-        // InternalDataDSL.g:23597:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) ) )
-        // InternalDataDSL.g:23598:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) )
+        // InternalDataDSL.g:24454:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) ) )
+        // InternalDataDSL.g:24455:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
         {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred264_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0)");
+            throw new FailedPredicateException(input, "synpred264_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3)");
         }
-        // InternalDataDSL.g:23598:118: ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) ) )
-        // InternalDataDSL.g:23599:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) )
+        // InternalDataDSL.g:24455:118: ( ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) ) )
+        // InternalDataDSL.g:24456:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
         {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0);
-        // InternalDataDSL.g:23605:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 ) )
-        // InternalDataDSL.g:23606:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 )
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3);
+        // InternalDataDSL.g:24462:5: ( ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 ) )
+        // InternalDataDSL.g:24463:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
         {
         if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_10_0()); 
+           before(grammarAccess.getDataInterchangeFileCSVAccess().getIndentAssignment_3_3()); 
         }
-        // InternalDataDSL.g:23607:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_10_0 )
-        // InternalDataDSL.g:23607:7: rule__DataInterchangeLookup__AllowNoResultAssignment_10_0
+        // InternalDataDSL.g:24464:6: ( rule__DataInterchangeFileCSV__IndentAssignment_3_3 )
+        // InternalDataDSL.g:24464:7: rule__DataInterchangeFileCSV__IndentAssignment_3_3
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeLookup__AllowNoResultAssignment_10_0();
+        rule__DataInterchangeFileCSV__IndentAssignment_3_3();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90800,31 +95632,31 @@
 
     // $ANTLR start synpred265_InternalDataDSL
     public final void synpred265_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23612:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) ) )
-        // InternalDataDSL.g:23612:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) )
+        // InternalDataDSL.g:24469:3: ( ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) ) )
+        // InternalDataDSL.g:24469:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
         {
-        // InternalDataDSL.g:23612:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) ) )
-        // InternalDataDSL.g:23613:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) )
+        // InternalDataDSL.g:24469:3: ({...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) ) )
+        // InternalDataDSL.g:24470:4: {...}? => ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
         {
-        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
             if (state.backtracking>0) {state.failed=true; return ;}
-            throw new FailedPredicateException(input, "synpred265_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1)");
+            throw new FailedPredicateException(input, "synpred265_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4)");
         }
-        // InternalDataDSL.g:23613:118: ( ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) ) )
-        // InternalDataDSL.g:23614:5: ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) )
+        // InternalDataDSL.g:24470:118: ( ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) ) )
+        // InternalDataDSL.g:24471:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
         {
-        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1);
-        // InternalDataDSL.g:23620:5: ( ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 ) )
-        // InternalDataDSL.g:23621:6: ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 )
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4);
+        // InternalDataDSL.g:24477:5: ( ( rule__DataInterchangeFileCSV__Group_3_4__0 ) )
+        // InternalDataDSL.g:24478:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
         {
         if ( state.backtracking==0 ) {
-           before(grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAssignment_10_1()); 
+           before(grammarAccess.getDataInterchangeFileCSVAccess().getGroup_3_4()); 
         }
-        // InternalDataDSL.g:23622:6: ( rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1 )
-        // InternalDataDSL.g:23622:7: rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1
+        // InternalDataDSL.g:24479:6: ( rule__DataInterchangeFileCSV__Group_3_4__0 )
+        // InternalDataDSL.g:24479:7: rule__DataInterchangeFileCSV__Group_3_4__0
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeLookup__AllowNonuniqueResultAssignment_10_1();
+        rule__DataInterchangeFileCSV__Group_3_4__0();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90847,11 +95679,11 @@
 
     // $ANTLR start synpred266_InternalDataDSL
     public final void synpred266_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23656:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__1 )
-        // InternalDataDSL.g:23656:2: rule__DataInterchangeLookup__UnorderedGroup_10__1
+        // InternalDataDSL.g:24513:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__1 )
+        // InternalDataDSL.g:24513:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__1
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeLookup__UnorderedGroup_10__1();
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__1();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90862,11 +95694,11 @@
 
     // $ANTLR start synpred267_InternalDataDSL
     public final void synpred267_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:23668:2: ( rule__DataInterchangeLookup__UnorderedGroup_10__2 )
-        // InternalDataDSL.g:23668:2: rule__DataInterchangeLookup__UnorderedGroup_10__2
+        // InternalDataDSL.g:24525:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__2 )
+        // InternalDataDSL.g:24525:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__2
         {
         pushFollow(FOLLOW_2);
-        rule__DataInterchangeLookup__UnorderedGroup_10__2();
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__2();
 
         state._fsp--;
         if (state.failed) return ;
@@ -90875,22 +95707,361 @@
     }
     // $ANTLR end synpred267_InternalDataDSL
 
+    // $ANTLR start synpred268_InternalDataDSL
+    public final void synpred268_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24537:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__3 )
+        // InternalDataDSL.g:24537:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__3
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__3();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred268_InternalDataDSL
+
+    // $ANTLR start synpred269_InternalDataDSL
+    public final void synpred269_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24549:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__4 )
+        // InternalDataDSL.g:24549:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__4
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__4();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred269_InternalDataDSL
+
+    // $ANTLR start synpred270_InternalDataDSL
+    public final void synpred270_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24561:2: ( rule__DataInterchangeFileCSV__UnorderedGroup_3__5 )
+        // InternalDataDSL.g:24561:2: rule__DataInterchangeFileCSV__UnorderedGroup_3__5
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileCSV__UnorderedGroup_3__5();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred270_InternalDataDSL
+
+    // $ANTLR start synpred271_InternalDataDSL
+    public final void synpred271_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24585:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__0 )
+        // InternalDataDSL.g:24585:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileEDI__UnorderedGroup_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred271_InternalDataDSL
+
+    // $ANTLR start synpred272_InternalDataDSL
+    public final void synpred272_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24600:3: ( ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) ) )
+        // InternalDataDSL.g:24600:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
+        {
+        // InternalDataDSL.g:24600:3: ({...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) ) )
+        // InternalDataDSL.g:24601:4: {...}? => ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred272_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalDataDSL.g:24601:118: ( ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) ) )
+        // InternalDataDSL.g:24602:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0);
+        // InternalDataDSL.g:24608:5: ( ( rule__DataInterchangeFileEDI__Group_3_0__0 ) )
+        // InternalDataDSL.g:24609:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeFileEDIAccess().getGroup_3_0()); 
+        }
+        // InternalDataDSL.g:24610:6: ( rule__DataInterchangeFileEDI__Group_3_0__0 )
+        // InternalDataDSL.g:24610:7: rule__DataInterchangeFileEDI__Group_3_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileEDI__Group_3_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred272_InternalDataDSL
+
+    // $ANTLR start synpred273_InternalDataDSL
+    public final void synpred273_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24644:2: ( rule__DataInterchangeFileEDI__UnorderedGroup_3__1 )
+        // InternalDataDSL.g:24644:2: rule__DataInterchangeFileEDI__UnorderedGroup_3__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileEDI__UnorderedGroup_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred273_InternalDataDSL
+
+    // $ANTLR start synpred274_InternalDataDSL
+    public final void synpred274_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24668:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__0 )
+        // InternalDataDSL.g:24668:2: rule__DataInterchangeFileFixed__UnorderedGroup_3__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileFixed__UnorderedGroup_3__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred274_InternalDataDSL
+
+    // $ANTLR start synpred275_InternalDataDSL
+    public final void synpred275_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24683:3: ( ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) ) )
+        // InternalDataDSL.g:24683:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) )
+        {
+        // InternalDataDSL.g:24683:3: ({...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) ) )
+        // InternalDataDSL.g:24684:4: {...}? => ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred275_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0)");
+        }
+        // InternalDataDSL.g:24684:120: ( ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) ) )
+        // InternalDataDSL.g:24685:5: ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0);
+        // InternalDataDSL.g:24691:5: ( ( rule__DataInterchangeFileFixed__Group_3_0__0 ) )
+        // InternalDataDSL.g:24692:6: ( rule__DataInterchangeFileFixed__Group_3_0__0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeFileFixedAccess().getGroup_3_0()); 
+        }
+        // InternalDataDSL.g:24693:6: ( rule__DataInterchangeFileFixed__Group_3_0__0 )
+        // InternalDataDSL.g:24693:7: rule__DataInterchangeFileFixed__Group_3_0__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileFixed__Group_3_0__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred275_InternalDataDSL
+
+    // $ANTLR start synpred276_InternalDataDSL
+    public final void synpred276_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24727:2: ( rule__DataInterchangeFileFixed__UnorderedGroup_3__1 )
+        // InternalDataDSL.g:24727:2: rule__DataInterchangeFileFixed__UnorderedGroup_3__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFileFixed__UnorderedGroup_3__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred276_InternalDataDSL
+
+    // $ANTLR start synpred277_InternalDataDSL
+    public final void synpred277_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24751:2: ( rule__DataInterchangeLookup__UnorderedGroup_9__0 )
+        // InternalDataDSL.g:24751:2: rule__DataInterchangeLookup__UnorderedGroup_9__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeLookup__UnorderedGroup_9__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred277_InternalDataDSL
+
+    // $ANTLR start synpred278_InternalDataDSL
+    public final void synpred278_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24766:3: ( ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) ) )
+        // InternalDataDSL.g:24766:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) )
+        {
+        // InternalDataDSL.g:24766:3: ({...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) ) )
+        // InternalDataDSL.g:24767:4: {...}? => ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred278_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0)");
+        }
+        // InternalDataDSL.g:24767:117: ( ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) ) )
+        // InternalDataDSL.g:24768:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0);
+        // InternalDataDSL.g:24774:5: ( ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 ) )
+        // InternalDataDSL.g:24775:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAssignment_9_0()); 
+        }
+        // InternalDataDSL.g:24776:6: ( rule__DataInterchangeLookup__AllowNoResultAssignment_9_0 )
+        // InternalDataDSL.g:24776:7: rule__DataInterchangeLookup__AllowNoResultAssignment_9_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeLookup__AllowNoResultAssignment_9_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred278_InternalDataDSL
+
+    // $ANTLR start synpred279_InternalDataDSL
+    public final void synpred279_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24810:2: ( rule__DataInterchangeLookup__UnorderedGroup_9__1 )
+        // InternalDataDSL.g:24810:2: rule__DataInterchangeLookup__UnorderedGroup_9__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeLookup__UnorderedGroup_9__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred279_InternalDataDSL
+
+    // $ANTLR start synpred280_InternalDataDSL
+    public final void synpred280_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24834:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )
+        // InternalDataDSL.g:24834:2: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred280_InternalDataDSL
+
+    // $ANTLR start synpred281_InternalDataDSL
+    public final void synpred281_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24849:3: ( ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) ) )
+        // InternalDataDSL.g:24849:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) )
+        {
+        // InternalDataDSL.g:24849:3: ({...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) ) )
+        // InternalDataDSL.g:24850:4: {...}? => ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) )
+        {
+        if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+            if (state.backtracking>0) {state.failed=true; return ;}
+            throw new FailedPredicateException(input, "synpred281_InternalDataDSL", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0)");
+        }
+        // InternalDataDSL.g:24850:129: ( ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) ) )
+        // InternalDataDSL.g:24851:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) )
+        {
+        getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0);
+        // InternalDataDSL.g:24857:5: ( ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 ) )
+        // InternalDataDSL.g:24858:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 )
+        {
+        if ( state.backtracking==0 ) {
+           before(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getAlternatives_5_0()); 
+        }
+        // InternalDataDSL.g:24859:6: ( rule__DataInterchangeFixedColumnMapping__Alternatives_5_0 )
+        // InternalDataDSL.g:24859:7: rule__DataInterchangeFixedColumnMapping__Alternatives_5_0
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFixedColumnMapping__Alternatives_5_0();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+
+
+        }
+    }
+    // $ANTLR end synpred281_InternalDataDSL
+
+    // $ANTLR start synpred282_InternalDataDSL
+    public final void synpred282_InternalDataDSL_fragment() throws RecognitionException {   
+        // InternalDataDSL.g:24893:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )
+        // InternalDataDSL.g:24893:2: rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1
+        {
+        pushFollow(FOLLOW_2);
+        rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1();
+
+        state._fsp--;
+        if (state.failed) return ;
+
+        }
+    }
+    // $ANTLR end synpred282_InternalDataDSL
+
     // Delegated rules
 
-    public final boolean synpred221_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred221_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
     public final boolean synpred62_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
@@ -90905,11 +96076,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred248_InternalDataDSL() {
+    public final boolean synpred279_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred248_InternalDataDSL_fragment(); // can never throw exception
+            synpred279_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -90919,39 +96090,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred252_InternalDataDSL() {
+    public final boolean synpred89_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred252_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred175_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred175_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred245_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred245_InternalDataDSL_fragment(); // can never throw exception
+            synpred89_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -90975,11 +96118,25 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred172_InternalDataDSL() {
+    public final boolean synpred189_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred172_InternalDataDSL_fragment(); // can never throw exception
+            synpred189_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred231_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred231_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91003,6 +96160,20 @@
         state.failed=false;
         return success;
     }
+    public final boolean synpred48_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred48_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
     public final boolean synpred265_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
@@ -91017,25 +96188,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred75_InternalDataDSL() {
+    public final boolean synpred269_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred75_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred79_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred79_InternalDataDSL_fragment(); // can never throw exception
+            synpred269_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91059,11 +96216,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred14_InternalDataDSL() {
+    public final boolean synpred272_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred14_InternalDataDSL_fragment(); // can never throw exception
+            synpred272_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91073,11 +96230,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred179_InternalDataDSL() {
+    public final boolean synpred185_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred179_InternalDataDSL_fragment(); // can never throw exception
+            synpred185_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91087,11 +96244,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred176_InternalDataDSL() {
+    public final boolean synpred188_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred176_InternalDataDSL_fragment(); // can never throw exception
+            synpred188_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91101,11 +96258,53 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred228_InternalDataDSL() {
+    public final boolean synpred210_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred228_InternalDataDSL_fragment(); // can never throw exception
+            synpred210_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred241_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred241_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred213_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred213_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred70_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred70_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91129,11 +96328,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred222_InternalDataDSL() {
+    public final boolean synpred282_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred222_InternalDataDSL_fragment(); // can never throw exception
+            synpred282_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91143,11 +96342,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred220_InternalDataDSL() {
+    public final boolean synpred273_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred220_InternalDataDSL_fragment(); // can never throw exception
+            synpred273_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91157,53 +96356,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred13_InternalDataDSL() {
+    public final boolean synpred190_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred13_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred61_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred61_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred246_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred246_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
-    public final boolean synpred178_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred178_InternalDataDSL_fragment(); // can never throw exception
+            synpred190_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91227,11 +96384,53 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred40_InternalDataDSL() {
+    public final boolean synpred22_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred40_InternalDataDSL_fragment(); // can never throw exception
+            synpred22_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred276_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred276_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred270_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred270_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred49_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred49_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91297,20 +96496,6 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred199_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred199_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
     public final boolean synpred267_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
@@ -91325,11 +96510,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred236_InternalDataDSL() {
+    public final boolean synpred271_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred236_InternalDataDSL_fragment(); // can never throw exception
+            synpred271_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91339,11 +96524,39 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred12_InternalDataDSL() {
+    public final boolean synpred233_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred12_InternalDataDSL_fragment(); // can never throw exception
+            synpred233_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred240_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred240_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred187_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred187_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91367,11 +96580,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred202_InternalDataDSL() {
+    public final boolean synpred191_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred202_InternalDataDSL_fragment(); // can never throw exception
+            synpred191_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91395,11 +96608,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred53_InternalDataDSL() {
+    public final boolean synpred274_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred53_InternalDataDSL_fragment(); // can never throw exception
+            synpred274_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91409,11 +96622,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred229_InternalDataDSL() {
+    public final boolean synpred84_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred229_InternalDataDSL_fragment(); // can never throw exception
+            synpred84_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91423,11 +96636,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred39_InternalDataDSL() {
+    public final boolean synpred243_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred39_InternalDataDSL_fragment(); // can never throw exception
+            synpred243_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91465,11 +96678,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred253_InternalDataDSL() {
+    public final boolean synpred281_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred253_InternalDataDSL_fragment(); // can never throw exception
+            synpred281_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91479,11 +96692,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred173_InternalDataDSL() {
+    public final boolean synpred226_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred173_InternalDataDSL_fragment(); // can never throw exception
+            synpred226_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91493,11 +96706,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred216_InternalDataDSL() {
+    public final boolean synpred194_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred216_InternalDataDSL_fragment(); // can never throw exception
+            synpred194_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91507,11 +96720,25 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred170_InternalDataDSL() {
+    public final boolean synpred88_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred170_InternalDataDSL_fragment(); // can never throw exception
+            synpred88_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred278_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred278_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91535,11 +96762,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred244_InternalDataDSL() {
+    public final boolean synpred23_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred244_InternalDataDSL_fragment(); // can never throw exception
+            synpred23_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91549,11 +96776,25 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred180_InternalDataDSL() {
+    public final boolean synpred275_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred180_InternalDataDSL_fragment(); // can never throw exception
+            synpred275_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred195_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred195_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91633,20 +96874,6 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred251_InternalDataDSL() {
-        state.backtracking++;
-        int start = input.mark();
-        try {
-            synpred251_InternalDataDSL_fragment(); // can never throw exception
-        } catch (RecognitionException re) {
-            System.err.println("impossible: "+re);
-        }
-        boolean success = !state.failed;
-        input.rewind(start);
-        state.backtracking--;
-        state.failed=false;
-        return success;
-    }
     public final boolean synpred183_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
@@ -91661,11 +96888,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred254_InternalDataDSL() {
+    public final boolean synpred268_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred254_InternalDataDSL_fragment(); // can never throw exception
+            synpred268_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91675,11 +96902,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred215_InternalDataDSL() {
+    public final boolean synpred186_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred215_InternalDataDSL_fragment(); // can never throw exception
+            synpred186_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91689,11 +96916,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred80_InternalDataDSL() {
+    public final boolean synpred95_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred80_InternalDataDSL_fragment(); // can never throw exception
+            synpred95_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91703,11 +96930,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred177_InternalDataDSL() {
+    public final boolean synpred203_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred177_InternalDataDSL_fragment(); // can never throw exception
+            synpred203_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91717,11 +96944,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred86_InternalDataDSL() {
+    public final boolean synpred21_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred86_InternalDataDSL_fragment(); // can never throw exception
+            synpred21_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91731,11 +96958,25 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred174_InternalDataDSL() {
+    public final boolean synpred277_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred174_InternalDataDSL_fragment(); // can never throw exception
+            synpred277_InternalDataDSL_fragment(); // can never throw exception
+        } catch (RecognitionException re) {
+            System.err.println("impossible: "+re);
+        }
+        boolean success = !state.failed;
+        input.rewind(start);
+        state.backtracking--;
+        state.failed=false;
+        return success;
+    }
+    public final boolean synpred280_InternalDataDSL() {
+        state.backtracking++;
+        int start = input.mark();
+        try {
+            synpred280_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91759,11 +97000,11 @@
         state.failed=false;
         return success;
     }
-    public final boolean synpred230_InternalDataDSL() {
+    public final boolean synpred71_InternalDataDSL() {
         state.backtracking++;
         int start = input.mark();
         try {
-            synpred230_InternalDataDSL_fragment(); // can never throw exception
+            synpred71_InternalDataDSL_fragment(); // can never throw exception
         } catch (RecognitionException re) {
             System.err.println("impossible: "+re);
         }
@@ -91789,45 +97030,47 @@
     }
 
 
-    protected DFA7 dfa7 = new DFA7(this);
-    protected DFA9 dfa9 = new DFA9(this);
     protected DFA10 dfa10 = new DFA10(this);
-    protected DFA11 dfa11 = new DFA11(this);
-    protected DFA18 dfa18 = new DFA18(this);
-    protected DFA26 dfa26 = new DFA26(this);
+    protected DFA12 dfa12 = new DFA12(this);
+    protected DFA13 dfa13 = new DFA13(this);
+    protected DFA14 dfa14 = new DFA14(this);
+    protected DFA21 dfa21 = new DFA21(this);
     protected DFA29 dfa29 = new DFA29(this);
-    protected DFA30 dfa30 = new DFA30(this);
+    protected DFA32 dfa32 = new DFA32(this);
     protected DFA33 dfa33 = new DFA33(this);
-    protected DFA38 dfa38 = new DFA38(this);
+    protected DFA36 dfa36 = new DFA36(this);
     protected DFA41 dfa41 = new DFA41(this);
-    protected DFA110 dfa110 = new DFA110(this);
-    protected DFA116 dfa116 = new DFA116(this);
-    protected DFA123 dfa123 = new DFA123(this);
-    protected DFA124 dfa124 = new DFA124(this);
-    protected DFA132 dfa132 = new DFA132(this);
-    protected DFA142 dfa142 = new DFA142(this);
-    protected DFA155 dfa155 = new DFA155(this);
-    protected DFA156 dfa156 = new DFA156(this);
+    protected DFA44 dfa44 = new DFA44(this);
+    protected DFA115 dfa115 = new DFA115(this);
+    protected DFA121 dfa121 = new DFA121(this);
+    protected DFA128 dfa128 = new DFA128(this);
+    protected DFA129 dfa129 = new DFA129(this);
+    protected DFA137 dfa137 = new DFA137(this);
+    protected DFA147 dfa147 = new DFA147(this);
     protected DFA160 dfa160 = new DFA160(this);
     protected DFA161 dfa161 = new DFA161(this);
-    protected DFA162 dfa162 = new DFA162(this);
+    protected DFA165 dfa165 = new DFA165(this);
+    protected DFA166 dfa166 = new DFA166(this);
     protected DFA167 dfa167 = new DFA167(this);
-    protected DFA176 dfa176 = new DFA176(this);
-    protected DFA179 dfa179 = new DFA179(this);
+    protected DFA172 dfa172 = new DFA172(this);
+    protected DFA181 dfa181 = new DFA181(this);
+    protected DFA184 dfa184 = new DFA184(this);
+    protected DFA209 dfa209 = new DFA209(this);
+    protected DFA211 dfa211 = new DFA211(this);
     static final String dfa_1s = "\10\uffff";
     static final String dfa_2s = "\2\uffff\1\5\3\uffff\1\5\1\uffff";
     static final String dfa_3s = "\1\5\1\uffff\1\53\1\uffff\1\5\1\uffff\1\53\1\uffff";
-    static final String dfa_4s = "\1\u00a1\1\uffff\1\170\1\uffff\1\44\1\uffff\1\170\1\uffff";
+    static final String dfa_4s = "\1\u00ae\1\uffff\1\176\1\uffff\1\44\1\uffff\1\176\1\uffff";
     static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\uffff\1\3";
     static final String dfa_6s = "\10\uffff}>";
     static final String[] dfa_7s = {
-            "\1\2\50\uffff\1\1\162\uffff\1\3",
+            "\1\2\50\uffff\1\1\177\uffff\1\3",
             "",
-            "\1\4\3\uffff\1\5\31\uffff\1\5\56\uffff\1\5",
+            "\1\4\3\uffff\1\5\31\uffff\1\5\64\uffff\1\5",
             "",
             "\1\6\36\uffff\1\7",
             "",
-            "\1\4\3\uffff\1\5\31\uffff\1\5\56\uffff\1\5",
+            "\1\4\3\uffff\1\5\31\uffff\1\5\64\uffff\1\5",
             ""
     };
 
@@ -91839,11 +97082,11 @@
     static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
     static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);
 
-    class DFA7 extends DFA {
+    class DFA10 extends DFA {
 
-        public DFA7(BaseRecognizer recognizer) {
+        public DFA10(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 7;
+            this.decisionNumber = 10;
             this.eot = dfa_1;
             this.eof = dfa_2;
             this.min = dfa_3;
@@ -91853,16 +97096,16 @@
             this.transition = dfa_7;
         }
         public String getDescription() {
-            return "2976:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );";
+            return "3225:1: rule__XImportDeclaration__Alternatives_2 : ( ( ( rule__XImportDeclaration__Group_2_0__0 ) ) | ( ( rule__XImportDeclaration__ImportedTypeAssignment_2_1 ) ) | ( ( rule__XImportDeclaration__ImportedNamespaceAssignment_2_2 ) ) | ( ( rule__XImportDeclaration__Group_2_3__0 ) ) );";
         }
     }
     static final String dfa_8s = "\43\uffff";
     static final String dfa_9s = "\1\4\1\0\41\uffff";
-    static final String dfa_10s = "\1\u00a6\1\0\41\uffff";
+    static final String dfa_10s = "\1\u00b3\1\0\41\uffff";
     static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\1";
     static final String dfa_12s = "\1\uffff\1\0\41\uffff}>";
     static final String[] dfa_13s = {
-            "\1\2\1\1\3\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\32\uffff\1\2\23\uffff\2\2\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\25\uffff\1\2",
+            "\1\2\1\1\3\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\34\uffff\1\2\27\uffff\2\2\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\34\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -91906,11 +97149,11 @@
     static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
     static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);
 
-    class DFA9 extends DFA {
+    class DFA12 extends DFA {
 
-        public DFA9(BaseRecognizer recognizer) {
+        public DFA12(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 9;
+            this.decisionNumber = 12;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_9;
@@ -91920,37 +97163,37 @@
             this.transition = dfa_13;
         }
         public String getDescription() {
-            return "3030:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
+            return "3279:1: rule__XAnnotation__Alternatives_3_1 : ( ( ( rule__XAnnotation__Group_3_1_0__0 ) ) | ( ( rule__XAnnotation__ValueAssignment_3_1_1 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA9_1 = input.LA(1);
+                        int LA12_1 = input.LA(1);
 
                          
-                        int index9_1 = input.index();
+                        int index12_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred12_InternalDataDSL()) ) {s = 34;}
+                        if ( (synpred21_InternalDataDSL()) ) {s = 34;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index9_1);
+                        input.seek(index12_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 9, _s, input);
+                new NoViableAltException(getDescription(), 12, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_14s = {
-            "\5\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\32\uffff\1\2\23\uffff\2\2\3\uffff\1\1\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\25\uffff\1\2",
+            "\5\2\22\uffff\1\2\6\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\34\uffff\1\2\27\uffff\2\2\3\uffff\1\1\1\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\34\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -91988,11 +97231,11 @@
     };
     static final short[][] dfa_14 = unpackEncodedStringArray(dfa_14s);
 
-    class DFA10 extends DFA {
+    class DFA13 extends DFA {
 
-        public DFA10(BaseRecognizer recognizer) {
+        public DFA13(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 10;
+            this.decisionNumber = 13;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_9;
@@ -92002,41 +97245,41 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "3051:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
+            return "3300:1: rule__XAnnotationElementValueOrCommaList__Alternatives : ( ( ( rule__XAnnotationElementValueOrCommaList__Group_0__0 ) ) | ( ( rule__XAnnotationElementValueOrCommaList__Group_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA10_1 = input.LA(1);
+                        int LA13_1 = input.LA(1);
 
                          
-                        int index10_1 = input.index();
+                        int index13_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred13_InternalDataDSL()) ) {s = 34;}
+                        if ( (synpred22_InternalDataDSL()) ) {s = 34;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index10_1);
+                        input.seek(index13_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 10, _s, input);
+                new NoViableAltException(getDescription(), 13, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA11 extends DFA {
+    class DFA14 extends DFA {
 
-        public DFA11(BaseRecognizer recognizer) {
+        public DFA14(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 11;
+            this.decisionNumber = 14;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_9;
@@ -92046,31 +97289,31 @@
             this.transition = dfa_14;
         }
         public String getDescription() {
-            return "3072:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
+            return "3321:1: rule__XAnnotationElementValue__Alternatives : ( ( ( rule__XAnnotationElementValue__Group_0__0 ) ) | ( ruleXAnnotationOrExpression ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA11_1 = input.LA(1);
+                        int LA14_1 = input.LA(1);
 
                          
-                        int index11_1 = input.index();
+                        int index14_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred14_InternalDataDSL()) ) {s = 34;}
+                        if ( (synpred23_InternalDataDSL()) ) {s = 34;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index11_1);
+                        input.seek(index14_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 11, _s, input);
+                new NoViableAltException(getDescription(), 14, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -92101,11 +97344,11 @@
     static final short[] dfa_19 = DFA.unpackEncodedString(dfa_19s);
     static final short[][] dfa_20 = unpackEncodedStringArray(dfa_20s);
 
-    class DFA18 extends DFA {
+    class DFA21 extends DFA {
 
-        public DFA18(BaseRecognizer recognizer) {
+        public DFA21(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 18;
+            this.decisionNumber = 21;
             this.eot = dfa_15;
             this.eof = dfa_15;
             this.min = dfa_16;
@@ -92115,25 +97358,25 @@
             this.transition = dfa_20;
         }
         public String getDescription() {
-            return "3273:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
+            return "3522:1: rule__OpOther__Alternatives : ( ( '->' ) | ( '..<' ) | ( ( rule__OpOther__Group_2__0 ) ) | ( '..' ) | ( '=>' ) | ( ( rule__OpOther__Group_5__0 ) ) | ( ( rule__OpOther__Group_6__0 ) ) | ( '<>' ) | ( '?:' ) );";
         }
     }
     static final String dfa_21s = "\12\uffff";
     static final String dfa_22s = "\4\uffff\5\3\1\uffff";
     static final String dfa_23s = "\1\53\2\5\1\uffff\5\4\1\uffff";
-    static final String dfa_24s = "\1\u00a3\2\61\1\uffff\5\u00a6\1\uffff";
+    static final String dfa_24s = "\1\u00b0\2\61\1\uffff\5\u00b3\1\uffff";
     static final String dfa_25s = "\3\uffff\1\2\5\uffff\1\1";
     static final String dfa_26s = "\12\uffff}>";
     static final String[] dfa_27s = {
-            "\1\1\166\uffff\1\2\1\3",
+            "\1\1\u0083\uffff\1\2\1\3",
             "\1\4\25\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
             "\1\4\25\uffff\1\3\21\uffff\1\5\1\6\1\7\1\10\1\3",
             "",
-            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\31\uffff\1\3\15\uffff\1\3\4\uffff\1\3\1\uffff\30\3\20\uffff\2\3\1\uffff\2\3",
-            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\31\uffff\1\3\15\uffff\1\3\4\uffff\1\3\1\uffff\30\3\20\uffff\2\3\1\uffff\2\3",
-            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\31\uffff\1\3\15\uffff\1\3\4\uffff\1\3\1\uffff\30\3\20\uffff\2\3\1\uffff\2\3",
-            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\31\uffff\1\3\15\uffff\1\3\4\uffff\1\3\1\uffff\30\3\20\uffff\2\3\1\uffff\2\3",
-            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\31\uffff\1\3\15\uffff\1\3\4\uffff\1\3\1\uffff\30\3\20\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\33\uffff\1\3\17\uffff\1\3\6\uffff\1\3\1\uffff\30\3\27\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\33\uffff\1\3\17\uffff\1\3\6\uffff\1\3\1\uffff\30\3\27\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\33\uffff\1\3\17\uffff\1\3\6\uffff\1\3\1\uffff\30\3\27\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\33\uffff\1\3\17\uffff\1\3\6\uffff\1\3\1\uffff\30\3\27\uffff\2\3\1\uffff\2\3",
+            "\5\3\4\uffff\1\11\45\3\27\uffff\2\3\33\uffff\1\3\17\uffff\1\3\6\uffff\1\3\1\uffff\30\3\27\uffff\2\3\1\uffff\2\3",
             ""
     };
 
@@ -92145,11 +97388,11 @@
     static final short[] dfa_26 = DFA.unpackEncodedString(dfa_26s);
     static final short[][] dfa_27 = unpackEncodedStringArray(dfa_27s);
 
-    class DFA26 extends DFA {
+    class DFA29 extends DFA {
 
-        public DFA26(BaseRecognizer recognizer) {
+        public DFA29(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 26;
+            this.decisionNumber = 29;
             this.eot = dfa_21;
             this.eof = dfa_22;
             this.min = dfa_23;
@@ -92159,15 +97402,15 @@
             this.transition = dfa_27;
         }
         public String getDescription() {
-            return "3507:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
+            return "3756:1: rule__XMemberFeatureCall__Alternatives_1 : ( ( ( rule__XMemberFeatureCall__Group_1_0__0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1__0 ) ) );";
         }
     }
     static final String dfa_28s = "\1\4\2\0\40\uffff";
-    static final String dfa_29s = "\1\u00a6\2\0\40\uffff";
+    static final String dfa_29s = "\1\u00b3\2\0\40\uffff";
     static final String dfa_30s = "\3\uffff\1\1\1\uffff\1\2\35\uffff";
     static final String dfa_31s = "\1\uffff\1\0\1\1\40\uffff}>";
     static final String[] dfa_32s = {
-            "\1\5\1\1\3\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4\uffff\6\5\27\uffff\1\5\32\uffff\1\5\24\uffff\1\2\3\uffff\2\5\1\uffff\1\5\1\uffff\1\5\3\uffff\10\5\1\uffff\1\5\23\uffff\1\3\1\uffff\1\5",
+            "\1\5\1\1\3\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\4\uffff\6\5\27\uffff\1\5\34\uffff\1\5\30\uffff\1\2\3\uffff\2\5\1\uffff\1\5\1\uffff\1\5\3\uffff\10\5\1\uffff\1\5\32\uffff\1\3\1\uffff\1\5",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -92209,11 +97452,11 @@
     static final short[] dfa_31 = DFA.unpackEncodedString(dfa_31s);
     static final short[][] dfa_32 = unpackEncodedStringArray(dfa_32s);
 
-    class DFA29 extends DFA {
+    class DFA32 extends DFA {
 
-        public DFA29(BaseRecognizer recognizer) {
+        public DFA32(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 29;
+            this.decisionNumber = 32;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_28;
@@ -92223,57 +97466,57 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "3576:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
+            return "3825:1: rule__XMemberFeatureCall__Alternatives_1_1_3_1 : ( ( ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_3_1_0 ) ) | ( ( rule__XMemberFeatureCall__Group_1_1_3_1_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA29_1 = input.LA(1);
+                        int LA32_1 = input.LA(1);
 
                          
-                        int index29_1 = input.index();
+                        int index32_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred53_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred62_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index29_1);
+                        input.seek(index32_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA29_2 = input.LA(1);
+                        int LA32_2 = input.LA(1);
 
                          
-                        int index29_2 = input.index();
+                        int index32_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred53_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred62_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index29_2);
+                        input.seek(index32_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 29, _s, input);
+                new NoViableAltException(getDescription(), 32, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_33s = "\40\uffff";
     static final String dfa_34s = "\1\4\26\uffff\1\0\10\uffff";
-    static final String dfa_35s = "\1\u00a6\26\uffff\1\0\10\uffff";
+    static final String dfa_35s = "\1\u00b3\26\uffff\1\0\10\uffff";
     static final String dfa_36s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
     static final String dfa_37s = "\27\uffff\1\0\10\uffff}>";
     static final String[] dfa_38s = {
-            "\1\14\1\5\3\14\22\uffff\1\5\21\uffff\5\5\1\14\27\uffff\1\2\32\uffff\1\27\24\uffff\1\35\3\uffff\2\14\1\uffff\1\26\1\uffff\1\3\3\uffff\1\30\1\31\1\1\2\14\1\32\1\33\1\34\1\uffff\1\4\25\uffff\1\14",
+            "\1\14\1\5\3\14\22\uffff\1\5\21\uffff\5\5\1\14\27\uffff\1\2\34\uffff\1\27\30\uffff\1\35\3\uffff\2\14\1\uffff\1\26\1\uffff\1\3\3\uffff\1\30\1\31\1\1\2\14\1\32\1\33\1\34\1\uffff\1\4\34\uffff\1\14",
             "",
             "",
             "",
@@ -92314,11 +97557,11 @@
     static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
     static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);
 
-    class DFA30 extends DFA {
+    class DFA33 extends DFA {
 
-        public DFA30(BaseRecognizer recognizer) {
+        public DFA33(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 30;
+            this.decisionNumber = 33;
             this.eot = dfa_33;
             this.eof = dfa_33;
             this.min = dfa_34;
@@ -92328,37 +97571,37 @@
             this.transition = dfa_38;
         }
         public String getDescription() {
-            return "3597:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
+            return "3846:1: rule__XPrimaryExpression__Alternatives : ( ( ruleXConstructorCall ) | ( ruleXBlockExpression ) | ( ruleXSwitchExpression ) | ( ( ruleXSynchronizedExpression ) ) | ( ruleXFeatureCall ) | ( ruleXLiteral ) | ( ruleXIfExpression ) | ( ( ruleXForLoopExpression ) ) | ( ruleXBasicForLoopExpression ) | ( ruleXWhileExpression ) | ( ruleXDoWhileExpression ) | ( ruleXThrowExpression ) | ( ruleXReturnExpression ) | ( ruleXTryCatchFinallyExpression ) | ( ruleXParenthesizedExpression ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA30_23 = input.LA(1);
+                        int LA33_23 = input.LA(1);
 
                          
-                        int index30_23 = input.index();
+                        int index33_23 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred61_InternalDataDSL()) ) {s = 30;}
+                        if ( (synpred70_InternalDataDSL()) ) {s = 30;}
 
-                        else if ( (synpred62_InternalDataDSL()) ) {s = 31;}
+                        else if ( (synpred71_InternalDataDSL()) ) {s = 31;}
 
                          
-                        input.seek(index30_23);
+                        input.seek(index33_23);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 30, _s, input);
+                new NoViableAltException(getDescription(), 33, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_39s = {
-            "\5\2\22\uffff\1\2\3\uffff\1\2\2\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\32\uffff\1\2\24\uffff\1\1\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\25\uffff\1\2",
+            "\5\2\22\uffff\1\2\3\uffff\1\2\2\uffff\2\2\4\uffff\1\2\4\uffff\6\2\27\uffff\1\2\34\uffff\1\2\30\uffff\1\1\3\uffff\2\2\1\uffff\1\2\1\uffff\1\2\3\uffff\10\2\1\uffff\1\2\34\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -92396,11 +97639,11 @@
     };
     static final short[][] dfa_39 = unpackEncodedStringArray(dfa_39s);
 
-    class DFA33 extends DFA {
+    class DFA36 extends DFA {
 
-        public DFA33(BaseRecognizer recognizer) {
+        public DFA36(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 33;
+            this.decisionNumber = 36;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_9;
@@ -92410,90 +97653,31 @@
             this.transition = dfa_39;
         }
         public String getDescription() {
-            return "3768:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
+            return "4017:1: rule__XSwitchExpression__Alternatives_2 : ( ( ( rule__XSwitchExpression__Group_2_0__0 ) ) | ( ( rule__XSwitchExpression__Group_2_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA33_1 = input.LA(1);
+                        int LA36_1 = input.LA(1);
 
                          
-                        int index33_1 = input.index();
+                        int index36_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred75_InternalDataDSL()) ) {s = 34;}
+                        if ( (synpred84_InternalDataDSL()) ) {s = 34;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index33_1);
+                        input.seek(index36_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 33, _s, input);
-            error(nvae);
-            throw nvae;
-        }
-    }
-
-    class DFA38 extends DFA {
-
-        public DFA38(BaseRecognizer recognizer) {
-            this.recognizer = recognizer;
-            this.decisionNumber = 38;
-            this.eot = dfa_8;
-            this.eof = dfa_8;
-            this.min = dfa_28;
-            this.max = dfa_29;
-            this.accept = dfa_30;
-            this.special = dfa_31;
-            this.transition = dfa_32;
-        }
-        public String getDescription() {
-            return "3873:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
-        }
-        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
-            TokenStream input = (TokenStream)_input;
-        	int _s = s;
-            switch ( s ) {
-                    case 0 : 
-                        int LA38_1 = input.LA(1);
-
-                         
-                        int index38_1 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred80_InternalDataDSL()) ) {s = 3;}
-
-                        else if ( (true) ) {s = 5;}
-
-                         
-                        input.seek(index38_1);
-                        if ( s>=0 ) return s;
-                        break;
-                    case 1 : 
-                        int LA38_2 = input.LA(1);
-
-                         
-                        int index38_2 = input.index();
-                        input.rewind();
-                        s = -1;
-                        if ( (synpred80_InternalDataDSL()) ) {s = 3;}
-
-                        else if ( (true) ) {s = 5;}
-
-                         
-                        input.seek(index38_2);
-                        if ( s>=0 ) return s;
-                        break;
-            }
-            if (state.backtracking>0) {state.failed=true; return -1;}
-            NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 38, _s, input);
+                new NoViableAltException(getDescription(), 36, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -92513,7 +97697,7 @@
             this.transition = dfa_32;
         }
         public String getDescription() {
-            return "3954:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
+            return "4122:1: rule__XFeatureCall__Alternatives_3_1 : ( ( ( rule__XFeatureCall__FeatureCallArgumentsAssignment_3_1_0 ) ) | ( ( rule__XFeatureCall__Group_3_1_1__0 ) ) );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
@@ -92526,7 +97710,7 @@
                         int index41_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred86_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred89_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
@@ -92541,7 +97725,7 @@
                         int index41_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred86_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred89_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
@@ -92557,13 +97741,72 @@
             throw nvae;
         }
     }
+
+    class DFA44 extends DFA {
+
+        public DFA44(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 44;
+            this.eot = dfa_8;
+            this.eof = dfa_8;
+            this.min = dfa_28;
+            this.max = dfa_29;
+            this.accept = dfa_30;
+            this.special = dfa_31;
+            this.transition = dfa_32;
+        }
+        public String getDescription() {
+            return "4203:1: rule__XConstructorCall__Alternatives_4_1 : ( ( ( rule__XConstructorCall__ArgumentsAssignment_4_1_0 ) ) | ( ( rule__XConstructorCall__Group_4_1_1__0 ) ) );";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA44_1 = input.LA(1);
+
+                         
+                        int index44_1 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred95_InternalDataDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index44_1);
+                        if ( s>=0 ) return s;
+                        break;
+                    case 1 : 
+                        int LA44_2 = input.LA(1);
+
+                         
+                        int index44_2 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( (synpred95_InternalDataDSL()) ) {s = 3;}
+
+                        else if ( (true) ) {s = 5;}
+
+                         
+                        input.seek(index44_2);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 44, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
     static final String dfa_40s = "\1\10\11\uffff";
     static final String dfa_41s = "\1\4\7\0\2\uffff";
-    static final String dfa_42s = "\1\u00a6\7\0\2\uffff";
+    static final String dfa_42s = "\1\u00b3\7\0\2\uffff";
     static final String dfa_43s = "\10\uffff\1\2\1\1";
-    static final String dfa_44s = "\1\uffff\1\2\1\5\1\6\1\0\1\3\1\4\1\1\2\uffff}>";
+    static final String dfa_44s = "\1\uffff\1\3\1\6\1\0\1\2\1\4\1\1\1\5\2\uffff}>";
     static final String[] dfa_45s = {
-            "\5\10\5\uffff\2\10\1\1\1\2\1\3\1\4\1\5\5\10\1\7\1\6\27\10\27\uffff\2\10\31\uffff\1\10\15\uffff\1\10\4\uffff\1\10\1\uffff\30\10\20\uffff\2\10\1\uffff\2\10",
+            "\5\10\5\uffff\2\10\1\1\1\2\1\3\1\4\1\5\5\10\1\7\1\6\27\10\27\uffff\2\10\33\uffff\1\10\17\uffff\1\10\6\uffff\1\10\1\uffff\30\10\27\uffff\2\10\1\uffff\2\10",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -92581,11 +97824,11 @@
     static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
     static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
 
-    class DFA110 extends DFA {
+    class DFA115 extends DFA {
 
-        public DFA110(BaseRecognizer recognizer) {
+        public DFA115(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 110;
+            this.decisionNumber = 115;
             this.eot = dfa_21;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -92595,132 +97838,132 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "11890:2: ( rule__XAssignment__Group_1_1__0 )?";
+            return "12976:2: ( rule__XAssignment__Group_1_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA110_4 = input.LA(1);
+                        int LA115_3 = input.LA(1);
 
                          
-                        int index110_4 = input.index();
+                        int index115_3 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_4);
+                        input.seek(index115_3);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA110_7 = input.LA(1);
+                        int LA115_6 = input.LA(1);
 
                          
-                        int index110_7 = input.index();
+                        int index115_6 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_7);
+                        input.seek(index115_6);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA110_1 = input.LA(1);
+                        int LA115_4 = input.LA(1);
 
                          
-                        int index110_1 = input.index();
+                        int index115_4 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_1);
+                        input.seek(index115_4);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA110_5 = input.LA(1);
+                        int LA115_1 = input.LA(1);
 
                          
-                        int index110_5 = input.index();
+                        int index115_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_5);
+                        input.seek(index115_1);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA110_6 = input.LA(1);
+                        int LA115_5 = input.LA(1);
 
                          
-                        int index110_6 = input.index();
+                        int index115_5 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_6);
+                        input.seek(index115_5);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA110_2 = input.LA(1);
+                        int LA115_7 = input.LA(1);
 
                          
-                        int index110_2 = input.index();
+                        int index115_7 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_2);
+                        input.seek(index115_7);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA110_3 = input.LA(1);
+                        int LA115_2 = input.LA(1);
 
                          
-                        int index110_3 = input.index();
+                        int index115_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred170_InternalDataDSL()) ) {s = 9;}
+                        if ( (synpred181_InternalDataDSL()) ) {s = 9;}
 
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index110_3);
+                        input.seek(index115_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 110, _s, input);
+                new NoViableAltException(getDescription(), 115, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_46s = "\1\1\12\uffff";
     static final String dfa_47s = "\1\4\1\uffff\10\0\1\uffff";
-    static final String dfa_48s = "\1\u00a6\1\uffff\10\0\1\uffff";
+    static final String dfa_48s = "\1\u00b3\1\uffff\10\0\1\uffff";
     static final String dfa_49s = "\1\uffff\1\2\10\uffff\1\1";
-    static final String dfa_50s = "\2\uffff\1\4\1\7\1\6\1\0\1\2\1\3\1\5\1\1\1\uffff}>";
+    static final String dfa_50s = "\2\uffff\1\5\1\6\1\1\1\2\1\4\1\0\1\7\1\3\1\uffff}>";
     static final String[] dfa_51s = {
-            "\5\1\5\uffff\14\1\1\3\1\2\1\4\1\5\1\6\1\7\1\10\1\11\21\1\27\uffff\2\1\31\uffff\1\1\15\uffff\1\1\4\uffff\1\1\1\uffff\30\1\20\uffff\2\1\1\uffff\2\1",
+            "\5\1\5\uffff\14\1\1\3\1\2\1\4\1\5\1\6\1\7\1\10\1\11\21\1\27\uffff\2\1\33\uffff\1\1\17\uffff\1\1\6\uffff\1\1\1\uffff\30\1\27\uffff\2\1\1\uffff\2\1",
             "",
             "\1\uffff",
             "\1\uffff",
@@ -92739,11 +97982,11 @@
     static final short[] dfa_50 = DFA.unpackEncodedString(dfa_50s);
     static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
 
-    class DFA116 extends DFA {
+    class DFA121 extends DFA {
 
-        public DFA116(BaseRecognizer recognizer) {
+        public DFA121(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 116;
+            this.decisionNumber = 121;
             this.eot = dfa_15;
             this.eof = dfa_46;
             this.min = dfa_47;
@@ -92753,136 +97996,136 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "()* loopback of 13186:2: ( rule__XOtherOperatorExpression__Group_1__0 )*";
+            return "()* loopback of 14272:2: ( rule__XOtherOperatorExpression__Group_1__0 )*";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA116_5 = input.LA(1);
+                        int LA121_7 = input.LA(1);
 
                          
-                        int index116_5 = input.index();
+                        int index121_7 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_5);
+                        input.seek(index121_7);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA116_9 = input.LA(1);
+                        int LA121_4 = input.LA(1);
 
                          
-                        int index116_9 = input.index();
+                        int index121_4 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_9);
+                        input.seek(index121_4);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA116_6 = input.LA(1);
+                        int LA121_5 = input.LA(1);
 
                          
-                        int index116_6 = input.index();
+                        int index121_5 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_6);
+                        input.seek(index121_5);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA116_7 = input.LA(1);
+                        int LA121_9 = input.LA(1);
 
                          
-                        int index116_7 = input.index();
+                        int index121_9 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_7);
+                        input.seek(index121_9);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA116_2 = input.LA(1);
+                        int LA121_6 = input.LA(1);
 
                          
-                        int index116_2 = input.index();
+                        int index121_6 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_2);
+                        input.seek(index121_6);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA116_8 = input.LA(1);
+                        int LA121_2 = input.LA(1);
 
                          
-                        int index116_8 = input.index();
+                        int index121_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_8);
+                        input.seek(index121_2);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA116_4 = input.LA(1);
+                        int LA121_3 = input.LA(1);
 
                          
-                        int index116_4 = input.index();
+                        int index121_3 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_4);
+                        input.seek(index121_3);
                         if ( s>=0 ) return s;
                         break;
                     case 7 : 
-                        int LA116_3 = input.LA(1);
+                        int LA121_8 = input.LA(1);
 
                          
-                        int index116_3 = input.index();
+                        int index121_8 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred176_InternalDataDSL()) ) {s = 10;}
+                        if ( (synpred187_InternalDataDSL()) ) {s = 10;}
 
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index116_3);
+                        input.seek(index121_8);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 116, _s, input);
+                new NoViableAltException(getDescription(), 121, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -92890,11 +98133,11 @@
     static final String dfa_52s = "\116\uffff";
     static final String dfa_53s = "\1\2\115\uffff";
     static final String dfa_54s = "\1\4\1\0\114\uffff";
-    static final String dfa_55s = "\1\u00a6\1\0\114\uffff";
+    static final String dfa_55s = "\1\u00b3\1\0\114\uffff";
     static final String dfa_56s = "\2\uffff\1\2\112\uffff\1\1";
     static final String dfa_57s = "\1\uffff\1\0\114\uffff}>";
     static final String[] dfa_58s = {
-            "\5\2\5\uffff\45\2\27\uffff\2\2\31\uffff\1\2\15\uffff\1\2\4\uffff\1\2\1\uffff\1\1\27\2\20\uffff\2\2\1\uffff\2\2",
+            "\5\2\5\uffff\45\2\27\uffff\2\2\33\uffff\1\2\17\uffff\1\2\6\uffff\1\2\1\uffff\1\1\27\2\27\uffff\2\2\1\uffff\2\2",
             "\1\uffff",
             "",
             "",
@@ -92982,11 +98225,11 @@
     static final short[] dfa_57 = DFA.unpackEncodedString(dfa_57s);
     static final short[][] dfa_58 = unpackEncodedStringArray(dfa_58s);
 
-    class DFA123 extends DFA {
+    class DFA128 extends DFA {
 
-        public DFA123(BaseRecognizer recognizer) {
+        public DFA128(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 123;
+            this.decisionNumber = 128;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -92996,37 +98239,37 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "14780:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
+            return "15866:2: ( rule__XMemberFeatureCall__Group_1_1_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA123_1 = input.LA(1);
+                        int LA128_1 = input.LA(1);
 
                          
-                        int index123_1 = input.index();
+                        int index128_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred183_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred194_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index123_1);
+                        input.seek(index128_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 123, _s, input);
+                new NoViableAltException(getDescription(), 128, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_59s = {
-            "\5\2\5\uffff\45\2\27\uffff\2\2\31\uffff\1\2\15\uffff\1\2\4\uffff\1\2\1\uffff\5\2\1\1\22\2\20\uffff\2\2\1\uffff\2\2",
+            "\5\2\5\uffff\45\2\27\uffff\2\2\33\uffff\1\2\17\uffff\1\2\6\uffff\1\2\1\uffff\5\2\1\1\22\2\27\uffff\2\2\1\uffff\2\2",
             "\1\uffff",
             "",
             "",
@@ -93107,11 +98350,11 @@
     };
     static final short[][] dfa_59 = unpackEncodedStringArray(dfa_59s);
 
-    class DFA124 extends DFA {
+    class DFA129 extends DFA {
 
-        public DFA124(BaseRecognizer recognizer) {
+        public DFA129(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 124;
+            this.decisionNumber = 129;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93121,42 +98364,42 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "14806:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
+            return "15892:2: ( rule__XMemberFeatureCall__MemberCallArgumentsAssignment_1_1_4 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA124_1 = input.LA(1);
+                        int LA129_1 = input.LA(1);
 
                          
-                        int index124_1 = input.index();
+                        int index129_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred184_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred195_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index124_1);
+                        input.seek(index129_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 124, _s, input);
+                new NoViableAltException(getDescription(), 129, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_60s = "\46\uffff";
     static final String dfa_61s = "\1\4\2\0\43\uffff";
-    static final String dfa_62s = "\1\u00a6\2\0\43\uffff";
+    static final String dfa_62s = "\1\u00b3\2\0\43\uffff";
     static final String dfa_63s = "\3\uffff\1\1\1\uffff\1\2\40\uffff";
     static final String dfa_64s = "\1\uffff\1\0\1\1\43\uffff}>";
     static final String[] dfa_65s = {
-            "\1\5\1\1\3\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\3\uffff\7\5\27\uffff\1\5\32\uffff\1\5\24\uffff\1\2\2\uffff\3\5\1\uffff\1\5\1\uffff\1\5\3\uffff\10\5\1\uffff\1\5\23\uffff\1\3\2\5",
+            "\1\5\1\1\3\5\22\uffff\1\5\3\uffff\1\3\2\uffff\2\5\4\uffff\1\5\3\uffff\7\5\27\uffff\1\5\34\uffff\1\5\30\uffff\1\2\2\uffff\3\5\1\uffff\1\5\1\uffff\1\5\3\uffff\10\5\1\uffff\1\5\32\uffff\1\3\2\5",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -93203,11 +98446,11 @@
     static final short[] dfa_64 = DFA.unpackEncodedString(dfa_64s);
     static final short[][] dfa_65 = unpackEncodedStringArray(dfa_65s);
 
-    class DFA132 extends DFA {
+    class DFA137 extends DFA {
 
-        public DFA132(BaseRecognizer recognizer) {
+        public DFA137(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 132;
+            this.decisionNumber = 137;
             this.eot = dfa_60;
             this.eof = dfa_60;
             this.min = dfa_61;
@@ -93217,57 +98460,57 @@
             this.transition = dfa_65;
         }
         public String getDescription() {
-            return "15779:2: ( rule__XClosure__Group_1__0 )?";
+            return "16865:2: ( rule__XClosure__Group_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA132_1 = input.LA(1);
+                        int LA137_1 = input.LA(1);
 
                          
-                        int index132_1 = input.index();
+                        int index137_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred192_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred203_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index132_1);
+                        input.seek(index137_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA132_2 = input.LA(1);
+                        int LA137_2 = input.LA(1);
 
                          
-                        int index132_2 = input.index();
+                        int index137_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred192_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred203_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index132_2);
+                        input.seek(index137_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 132, _s, input);
+                new NoViableAltException(getDescription(), 137, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_66s = "\42\uffff";
     static final String dfa_67s = "\1\4\2\0\37\uffff";
-    static final String dfa_68s = "\1\u00a6\2\0\37\uffff";
+    static final String dfa_68s = "\1\u00b3\2\0\37\uffff";
     static final String dfa_69s = "\3\uffff\1\1\1\2\35\uffff";
     static final String dfa_70s = "\1\uffff\1\0\1\1\37\uffff}>";
     static final String[] dfa_71s = {
-            "\1\4\1\1\3\4\22\uffff\1\4\3\uffff\1\3\2\uffff\2\4\4\uffff\1\4\4\uffff\6\4\27\uffff\1\4\32\uffff\1\4\24\uffff\1\2\3\uffff\2\4\1\uffff\1\4\1\uffff\1\4\3\uffff\10\4\1\uffff\1\4\25\uffff\1\4",
+            "\1\4\1\1\3\4\22\uffff\1\4\3\uffff\1\3\2\uffff\2\4\4\uffff\1\4\4\uffff\6\4\27\uffff\1\4\34\uffff\1\4\30\uffff\1\2\3\uffff\2\4\1\uffff\1\4\1\uffff\1\4\3\uffff\10\4\1\uffff\1\4\34\uffff\1\4",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -93310,11 +98553,11 @@
     static final short[] dfa_70 = DFA.unpackEncodedString(dfa_70s);
     static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
 
-    class DFA142 extends DFA {
+    class DFA147 extends DFA {
 
-        public DFA142(BaseRecognizer recognizer) {
+        public DFA147(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 142;
+            this.decisionNumber = 147;
             this.eot = dfa_66;
             this.eof = dfa_66;
             this.min = dfa_67;
@@ -93324,56 +98567,56 @@
             this.transition = dfa_71;
         }
         public String getDescription() {
-            return "17210:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
+            return "18296:2: ( rule__XSwitchExpression__Group_2_1_0__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA142_1 = input.LA(1);
+                        int LA147_1 = input.LA(1);
 
                          
-                        int index142_1 = input.index();
+                        int index147_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred202_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred213_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 4;}
 
                          
-                        input.seek(index142_1);
+                        input.seek(index147_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA142_2 = input.LA(1);
+                        int LA147_2 = input.LA(1);
 
                          
-                        int index142_2 = input.index();
+                        int index147_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred202_InternalDataDSL()) ) {s = 3;}
+                        if ( (synpred213_InternalDataDSL()) ) {s = 3;}
 
                         else if ( (true) ) {s = 4;}
 
                          
-                        input.seek(index142_2);
+                        input.seek(index147_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 142, _s, input);
+                new NoViableAltException(getDescription(), 147, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA155 extends DFA {
+    class DFA160 extends DFA {
 
-        public DFA155(BaseRecognizer recognizer) {
+        public DFA160(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 155;
+            this.decisionNumber = 160;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93383,41 +98626,41 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "19343:2: ( rule__XFeatureCall__Group_3__0 )?";
+            return "20429:2: ( rule__XFeatureCall__Group_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA155_1 = input.LA(1);
+                        int LA160_1 = input.LA(1);
 
                          
-                        int index155_1 = input.index();
+                        int index160_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred215_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred226_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index155_1);
+                        input.seek(index160_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 155, _s, input);
+                new NoViableAltException(getDescription(), 160, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA156 extends DFA {
+    class DFA161 extends DFA {
 
-        public DFA156(BaseRecognizer recognizer) {
+        public DFA161(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 156;
+            this.decisionNumber = 161;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93427,37 +98670,37 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "19369:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
+            return "20455:2: ( rule__XFeatureCall__FeatureCallArgumentsAssignment_4 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA156_1 = input.LA(1);
+                        int LA161_1 = input.LA(1);
 
                          
-                        int index156_1 = input.index();
+                        int index161_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred216_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index156_1);
+                        input.seek(index161_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 156, _s, input);
+                new NoViableAltException(getDescription(), 161, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_72s = {
-            "\5\2\5\uffff\15\2\1\1\27\2\27\uffff\2\2\31\uffff\1\2\15\uffff\1\2\4\uffff\1\2\1\uffff\30\2\20\uffff\2\2\1\uffff\2\2",
+            "\5\2\5\uffff\15\2\1\1\27\2\27\uffff\2\2\33\uffff\1\2\17\uffff\1\2\6\uffff\1\2\1\uffff\30\2\27\uffff\2\2\1\uffff\2\2",
             "\1\uffff",
             "",
             "",
@@ -93538,11 +98781,11 @@
     };
     static final short[][] dfa_72 = unpackEncodedStringArray(dfa_72s);
 
-    class DFA160 extends DFA {
+    class DFA165 extends DFA {
 
-        public DFA160(BaseRecognizer recognizer) {
+        public DFA165(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 160;
+            this.decisionNumber = 165;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93552,41 +98795,41 @@
             this.transition = dfa_72;
         }
         public String getDescription() {
-            return "19829:2: ( rule__XConstructorCall__Group_3__0 )?";
+            return "20915:2: ( rule__XConstructorCall__Group_3__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA160_1 = input.LA(1);
+                        int LA165_1 = input.LA(1);
 
                          
-                        int index160_1 = input.index();
+                        int index165_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred220_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred231_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index160_1);
+                        input.seek(index165_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 160, _s, input);
+                new NoViableAltException(getDescription(), 165, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA161 extends DFA {
+    class DFA166 extends DFA {
 
-        public DFA161(BaseRecognizer recognizer) {
+        public DFA166(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 161;
+            this.decisionNumber = 166;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93596,41 +98839,41 @@
             this.transition = dfa_58;
         }
         public String getDescription() {
-            return "19856:2: ( rule__XConstructorCall__Group_4__0 )?";
+            return "20942:2: ( rule__XConstructorCall__Group_4__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA161_1 = input.LA(1);
+                        int LA166_1 = input.LA(1);
 
                          
-                        int index161_1 = input.index();
+                        int index166_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred221_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred232_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index161_1);
+                        input.seek(index166_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 161, _s, input);
+                new NoViableAltException(getDescription(), 166, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA162 extends DFA {
+    class DFA167 extends DFA {
 
-        public DFA162(BaseRecognizer recognizer) {
+        public DFA167(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 162;
+            this.decisionNumber = 167;
             this.eot = dfa_52;
             this.eof = dfa_53;
             this.min = dfa_54;
@@ -93640,42 +98883,42 @@
             this.transition = dfa_59;
         }
         public String getDescription() {
-            return "19882:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
+            return "20968:2: ( rule__XConstructorCall__ArgumentsAssignment_5 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA162_1 = input.LA(1);
+                        int LA167_1 = input.LA(1);
 
                          
-                        int index162_1 = input.index();
+                        int index167_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred222_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred233_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index162_1);
+                        input.seek(index167_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 162, _s, input);
+                new NoViableAltException(getDescription(), 167, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_73s = "\1\41\115\uffff";
     static final String dfa_74s = "\1\4\40\0\55\uffff";
-    static final String dfa_75s = "\1\u00a6\40\0\55\uffff";
+    static final String dfa_75s = "\1\u00b3\40\0\55\uffff";
     static final String dfa_76s = "\41\uffff\1\2\53\uffff\1\1";
     static final String dfa_77s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
     static final String[] dfa_78s = {
-            "\1\27\1\1\1\23\1\24\1\25\5\uffff\15\41\1\15\6\41\1\10\1\7\4\41\1\6\4\41\1\2\1\3\1\4\1\5\1\16\1\21\27\uffff\1\12\1\41\31\uffff\1\32\15\uffff\1\41\4\uffff\1\41\1\uffff\1\40\3\41\1\17\1\20\1\41\1\31\1\41\1\13\3\41\1\33\1\34\1\11\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41\20\uffff\2\41\1\uffff\1\41\1\22",
+            "\1\27\1\1\1\23\1\24\1\25\5\uffff\15\41\1\15\6\41\1\10\1\7\4\41\1\6\4\41\1\2\1\3\1\4\1\5\1\16\1\21\27\uffff\1\12\1\41\33\uffff\1\32\17\uffff\1\41\6\uffff\1\41\1\uffff\1\40\3\41\1\17\1\20\1\41\1\31\1\41\1\13\3\41\1\33\1\34\1\11\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41\27\uffff\2\41\1\uffff\1\41\1\22",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -93761,11 +99004,11 @@
     static final short[] dfa_77 = DFA.unpackEncodedString(dfa_77s);
     static final short[][] dfa_78 = unpackEncodedStringArray(dfa_78s);
 
-    class DFA167 extends DFA {
+    class DFA172 extends DFA {
 
-        public DFA167(BaseRecognizer recognizer) {
+        public DFA172(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 167;
+            this.decisionNumber = 172;
             this.eot = dfa_52;
             this.eof = dfa_73;
             this.min = dfa_74;
@@ -93775,496 +99018,496 @@
             this.transition = dfa_78;
         }
         public String getDescription() {
-            return "20773:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
+            return "21859:2: ( rule__XReturnExpression__ExpressionAssignment_2 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA167_1 = input.LA(1);
+                        int LA172_1 = input.LA(1);
 
                          
-                        int index167_1 = input.index();
+                        int index172_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_1);
+                        input.seek(index172_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA167_2 = input.LA(1);
+                        int LA172_2 = input.LA(1);
 
                          
-                        int index167_2 = input.index();
+                        int index172_2 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_2);
+                        input.seek(index172_2);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA167_3 = input.LA(1);
+                        int LA172_3 = input.LA(1);
 
                          
-                        int index167_3 = input.index();
+                        int index172_3 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_3);
+                        input.seek(index172_3);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA167_4 = input.LA(1);
+                        int LA172_4 = input.LA(1);
 
                          
-                        int index167_4 = input.index();
+                        int index172_4 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_4);
+                        input.seek(index172_4);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA167_5 = input.LA(1);
+                        int LA172_5 = input.LA(1);
 
                          
-                        int index167_5 = input.index();
+                        int index172_5 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_5);
+                        input.seek(index172_5);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA167_6 = input.LA(1);
+                        int LA172_6 = input.LA(1);
 
                          
-                        int index167_6 = input.index();
+                        int index172_6 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_6);
+                        input.seek(index172_6);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA167_7 = input.LA(1);
+                        int LA172_7 = input.LA(1);
 
                          
-                        int index167_7 = input.index();
+                        int index172_7 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_7);
+                        input.seek(index172_7);
                         if ( s>=0 ) return s;
                         break;
                     case 7 : 
-                        int LA167_8 = input.LA(1);
+                        int LA172_8 = input.LA(1);
 
                          
-                        int index167_8 = input.index();
+                        int index172_8 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_8);
+                        input.seek(index172_8);
                         if ( s>=0 ) return s;
                         break;
                     case 8 : 
-                        int LA167_9 = input.LA(1);
+                        int LA172_9 = input.LA(1);
 
                          
-                        int index167_9 = input.index();
+                        int index172_9 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_9);
+                        input.seek(index172_9);
                         if ( s>=0 ) return s;
                         break;
                     case 9 : 
-                        int LA167_10 = input.LA(1);
+                        int LA172_10 = input.LA(1);
 
                          
-                        int index167_10 = input.index();
+                        int index172_10 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_10);
+                        input.seek(index172_10);
                         if ( s>=0 ) return s;
                         break;
                     case 10 : 
-                        int LA167_11 = input.LA(1);
+                        int LA172_11 = input.LA(1);
 
                          
-                        int index167_11 = input.index();
+                        int index172_11 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_11);
+                        input.seek(index172_11);
                         if ( s>=0 ) return s;
                         break;
                     case 11 : 
-                        int LA167_12 = input.LA(1);
+                        int LA172_12 = input.LA(1);
 
                          
-                        int index167_12 = input.index();
+                        int index172_12 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_12);
+                        input.seek(index172_12);
                         if ( s>=0 ) return s;
                         break;
                     case 12 : 
-                        int LA167_13 = input.LA(1);
+                        int LA172_13 = input.LA(1);
 
                          
-                        int index167_13 = input.index();
+                        int index172_13 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_13);
+                        input.seek(index172_13);
                         if ( s>=0 ) return s;
                         break;
                     case 13 : 
-                        int LA167_14 = input.LA(1);
+                        int LA172_14 = input.LA(1);
 
                          
-                        int index167_14 = input.index();
+                        int index172_14 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_14);
+                        input.seek(index172_14);
                         if ( s>=0 ) return s;
                         break;
                     case 14 : 
-                        int LA167_15 = input.LA(1);
+                        int LA172_15 = input.LA(1);
 
                          
-                        int index167_15 = input.index();
+                        int index172_15 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_15);
+                        input.seek(index172_15);
                         if ( s>=0 ) return s;
                         break;
                     case 15 : 
-                        int LA167_16 = input.LA(1);
+                        int LA172_16 = input.LA(1);
 
                          
-                        int index167_16 = input.index();
+                        int index172_16 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_16);
+                        input.seek(index172_16);
                         if ( s>=0 ) return s;
                         break;
                     case 16 : 
-                        int LA167_17 = input.LA(1);
+                        int LA172_17 = input.LA(1);
 
                          
-                        int index167_17 = input.index();
+                        int index172_17 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_17);
+                        input.seek(index172_17);
                         if ( s>=0 ) return s;
                         break;
                     case 17 : 
-                        int LA167_18 = input.LA(1);
+                        int LA172_18 = input.LA(1);
 
                          
-                        int index167_18 = input.index();
+                        int index172_18 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_18);
+                        input.seek(index172_18);
                         if ( s>=0 ) return s;
                         break;
                     case 18 : 
-                        int LA167_19 = input.LA(1);
+                        int LA172_19 = input.LA(1);
 
                          
-                        int index167_19 = input.index();
+                        int index172_19 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_19);
+                        input.seek(index172_19);
                         if ( s>=0 ) return s;
                         break;
                     case 19 : 
-                        int LA167_20 = input.LA(1);
+                        int LA172_20 = input.LA(1);
 
                          
-                        int index167_20 = input.index();
+                        int index172_20 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_20);
+                        input.seek(index172_20);
                         if ( s>=0 ) return s;
                         break;
                     case 20 : 
-                        int LA167_21 = input.LA(1);
+                        int LA172_21 = input.LA(1);
 
                          
-                        int index167_21 = input.index();
+                        int index172_21 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_21);
+                        input.seek(index172_21);
                         if ( s>=0 ) return s;
                         break;
                     case 21 : 
-                        int LA167_22 = input.LA(1);
+                        int LA172_22 = input.LA(1);
 
                          
-                        int index167_22 = input.index();
+                        int index172_22 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_22);
+                        input.seek(index172_22);
                         if ( s>=0 ) return s;
                         break;
                     case 22 : 
-                        int LA167_23 = input.LA(1);
+                        int LA172_23 = input.LA(1);
 
                          
-                        int index167_23 = input.index();
+                        int index172_23 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_23);
+                        input.seek(index172_23);
                         if ( s>=0 ) return s;
                         break;
                     case 23 : 
-                        int LA167_24 = input.LA(1);
+                        int LA172_24 = input.LA(1);
 
                          
-                        int index167_24 = input.index();
+                        int index172_24 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_24);
+                        input.seek(index172_24);
                         if ( s>=0 ) return s;
                         break;
                     case 24 : 
-                        int LA167_25 = input.LA(1);
+                        int LA172_25 = input.LA(1);
 
                          
-                        int index167_25 = input.index();
+                        int index172_25 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_25);
+                        input.seek(index172_25);
                         if ( s>=0 ) return s;
                         break;
                     case 25 : 
-                        int LA167_26 = input.LA(1);
+                        int LA172_26 = input.LA(1);
 
                          
-                        int index167_26 = input.index();
+                        int index172_26 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_26);
+                        input.seek(index172_26);
                         if ( s>=0 ) return s;
                         break;
                     case 26 : 
-                        int LA167_27 = input.LA(1);
+                        int LA172_27 = input.LA(1);
 
                          
-                        int index167_27 = input.index();
+                        int index172_27 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_27);
+                        input.seek(index172_27);
                         if ( s>=0 ) return s;
                         break;
                     case 27 : 
-                        int LA167_28 = input.LA(1);
+                        int LA172_28 = input.LA(1);
 
                          
-                        int index167_28 = input.index();
+                        int index172_28 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_28);
+                        input.seek(index172_28);
                         if ( s>=0 ) return s;
                         break;
                     case 28 : 
-                        int LA167_29 = input.LA(1);
+                        int LA172_29 = input.LA(1);
 
                          
-                        int index167_29 = input.index();
+                        int index172_29 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_29);
+                        input.seek(index172_29);
                         if ( s>=0 ) return s;
                         break;
                     case 29 : 
-                        int LA167_30 = input.LA(1);
+                        int LA172_30 = input.LA(1);
 
                          
-                        int index167_30 = input.index();
+                        int index172_30 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_30);
+                        input.seek(index172_30);
                         if ( s>=0 ) return s;
                         break;
                     case 30 : 
-                        int LA167_31 = input.LA(1);
+                        int LA172_31 = input.LA(1);
 
                          
-                        int index167_31 = input.index();
+                        int index172_31 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_31);
+                        input.seek(index172_31);
                         if ( s>=0 ) return s;
                         break;
                     case 31 : 
-                        int LA167_32 = input.LA(1);
+                        int LA172_32 = input.LA(1);
 
                          
-                        int index167_32 = input.index();
+                        int index172_32 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred227_InternalDataDSL()) ) {s = 77;}
+                        if ( (synpred238_InternalDataDSL()) ) {s = 77;}
 
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index167_32);
+                        input.seek(index172_32);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 167, _s, input);
+                new NoViableAltException(getDescription(), 172, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -94272,11 +99515,11 @@
     static final String dfa_79s = "\117\uffff";
     static final String dfa_80s = "\1\2\116\uffff";
     static final String dfa_81s = "\1\4\1\0\115\uffff";
-    static final String dfa_82s = "\1\u00a6\1\0\115\uffff";
+    static final String dfa_82s = "\1\u00b3\1\0\115\uffff";
     static final String dfa_83s = "\2\uffff\1\2\113\uffff\1\1";
     static final String dfa_84s = "\1\uffff\1\0\115\uffff}>";
     static final String[] dfa_85s = {
-            "\5\2\5\uffff\15\2\1\1\27\2\27\uffff\2\2\31\uffff\1\2\15\uffff\1\2\4\uffff\1\2\1\uffff\30\2\1\uffff\1\2\16\uffff\2\2\1\uffff\2\2",
+            "\5\2\5\uffff\15\2\1\1\27\2\27\uffff\2\2\33\uffff\1\2\17\uffff\1\2\6\uffff\1\2\1\uffff\30\2\1\uffff\1\2\25\uffff\2\2\1\uffff\2\2",
             "\1\uffff",
             "",
             "",
@@ -94365,11 +99608,11 @@
     static final short[] dfa_84 = DFA.unpackEncodedString(dfa_84s);
     static final short[][] dfa_85 = unpackEncodedStringArray(dfa_85s);
 
-    class DFA176 extends DFA {
+    class DFA181 extends DFA {
 
-        public DFA176(BaseRecognizer recognizer) {
+        public DFA181(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 176;
+            this.decisionNumber = 181;
             this.eot = dfa_79;
             this.eof = dfa_80;
             this.min = dfa_81;
@@ -94379,41 +99622,41 @@
             this.transition = dfa_85;
         }
         public String getDescription() {
-            return "22130:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
+            return "23216:2: ( rule__JvmParameterizedTypeReference__Group_1__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA176_1 = input.LA(1);
+                        int LA181_1 = input.LA(1);
 
                          
-                        int index176_1 = input.index();
+                        int index181_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred236_InternalDataDSL()) ) {s = 78;}
+                        if ( (synpred247_InternalDataDSL()) ) {s = 78;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index176_1);
+                        input.seek(index181_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 176, _s, input);
+                new NoViableAltException(getDescription(), 181, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA179 extends DFA {
+    class DFA184 extends DFA {
 
-        public DFA179(BaseRecognizer recognizer) {
+        public DFA184(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 179;
+            this.decisionNumber = 184;
             this.eot = dfa_79;
             this.eof = dfa_80;
             this.min = dfa_81;
@@ -94423,31 +99666,170 @@
             this.transition = dfa_85;
         }
         public String getDescription() {
-            return "22400:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
+            return "23486:2: ( rule__JvmParameterizedTypeReference__Group_1_4_2__0 )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA179_1 = input.LA(1);
+                        int LA184_1 = input.LA(1);
 
                          
-                        int index179_1 = input.index();
+                        int index184_1 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (synpred239_InternalDataDSL()) ) {s = 78;}
+                        if ( (synpred250_InternalDataDSL()) ) {s = 78;}
 
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index179_1);
+                        input.seek(index184_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 179, _s, input);
+                new NoViableAltException(getDescription(), 184, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+    static final String dfa_86s = "\1\11\11\uffff";
+    static final String dfa_87s = "\1\113\11\uffff";
+    static final String dfa_88s = "\1\u00ad\11\uffff";
+    static final String dfa_89s = "\1\uffff\10\1\1\2";
+    static final String dfa_90s = "\1\0\11\uffff}>";
+    static final String[] dfa_91s = {
+            "\1\11\54\uffff\1\11\1\uffff\1\11\1\uffff\1\11\51\uffff\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            ""
+    };
+    static final short[] dfa_86 = DFA.unpackEncodedString(dfa_86s);
+    static final char[] dfa_87 = DFA.unpackEncodedStringToUnsignedChars(dfa_87s);
+    static final char[] dfa_88 = DFA.unpackEncodedStringToUnsignedChars(dfa_88s);
+    static final short[] dfa_89 = DFA.unpackEncodedString(dfa_89s);
+    static final short[] dfa_90 = DFA.unpackEncodedString(dfa_90s);
+    static final short[][] dfa_91 = unpackEncodedStringArray(dfa_91s);
+
+    class DFA209 extends DFA {
+
+        public DFA209(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 209;
+            this.eot = dfa_21;
+            this.eof = dfa_86;
+            this.min = dfa_87;
+            this.max = dfa_88;
+            this.accept = dfa_89;
+            this.special = dfa_90;
+            this.transition = dfa_91;
+        }
+        public String getDescription() {
+            return "24834:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__0 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA209_0 = input.LA(1);
+
+                         
+                        int index209_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA209_0 == 166 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 1;}
+
+                        else if ( LA209_0 == 167 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 2;}
+
+                        else if ( LA209_0 == 168 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 3;}
+
+                        else if ( LA209_0 == 169 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 4;}
+
+                        else if ( LA209_0 == 170 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 5;}
+
+                        else if ( LA209_0 == 171 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 6;}
+
+                        else if ( LA209_0 == 172 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 7;}
+
+                        else if ( LA209_0 == 173 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 8;}
+
+                        else if ( (LA209_0==EOF||LA209_0==75||LA209_0==120||LA209_0==122||LA209_0==124) ) {s = 9;}
+
+                         
+                        input.seek(index209_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 209, _s, input);
+            error(nvae);
+            throw nvae;
+        }
+    }
+
+    class DFA211 extends DFA {
+
+        public DFA211(BaseRecognizer recognizer) {
+            this.recognizer = recognizer;
+            this.decisionNumber = 211;
+            this.eot = dfa_21;
+            this.eof = dfa_86;
+            this.min = dfa_87;
+            this.max = dfa_88;
+            this.accept = dfa_89;
+            this.special = dfa_90;
+            this.transition = dfa_91;
+        }
+        public String getDescription() {
+            return "24893:2: ( rule__DataInterchangeFixedColumnMapping__UnorderedGroup_5__1 )?";
+        }
+        public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
+            TokenStream input = (TokenStream)_input;
+        	int _s = s;
+            switch ( s ) {
+                    case 0 : 
+                        int LA211_0 = input.LA(1);
+
+                         
+                        int index211_0 = input.index();
+                        input.rewind();
+                        s = -1;
+                        if ( LA211_0 == 166 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 1;}
+
+                        else if ( LA211_0 == 167 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 2;}
+
+                        else if ( LA211_0 == 168 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {s = 3;}
+
+                        else if ( LA211_0 == 169 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 4;}
+
+                        else if ( LA211_0 == 170 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 5;}
+
+                        else if ( LA211_0 == 171 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 6;}
+
+                        else if ( LA211_0 == 172 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 7;}
+
+                        else if ( LA211_0 == 173 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {s = 8;}
+
+                        else if ( (LA211_0==EOF||LA211_0==75||LA211_0==120||LA211_0==122||LA211_0==124) ) {s = 9;}
+
+                         
+                        input.seek(index211_0);
+                        if ( s>=0 ) return s;
+                        break;
+            }
+            if (state.backtracking>0) {state.failed=true; return -1;}
+            NoViableAltException nvae =
+                new NoViableAltException(getDescription(), 211, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -94468,159 +99850,168 @@
     public static final BitSet FOLLOW_12 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002800L});
     public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000002L,0x0000000000002000L});
     public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
-    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000000000L,0x000000000000000EL,0x0000000000100000L});
-    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000000L,0x0000000000014000L,0x0000000000E00000L});
-    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000000000L,0x0000000001120000L});
+    public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000000000L,0x000000000000000EL,0x0000000004000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000000000000L,0x0000000000014000L,0x0000000038000000L});
+    public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000000000000L,0x0000000005120000L});
     public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
-    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000800L});
-    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000002L,0x0000000004000000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000800L});
+    public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x0000000000000002L,0x0000000008000000L});
     public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x0000000000000010L});
     public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000000000080L});
     public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
-    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000000L,0x00000000000C0000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000000000000L,0x00000000000C0000L,0x0000000040000000L});
     public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
-    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000000000000L,0x0000000000EC0000L,0x0000000002000000L});
-    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000000000L,0x00000000000C0000L});
-    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
-    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000004000000L});
-    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
-    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000000L,0x0000000FF8000000L,0x0000000018000000L});
-    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0004100000000800L});
-    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000000002L,0x0004100000000000L});
-    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000800L});
-    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000000002L,0x0000002000000000L});
-    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000800L});
-    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000000002L,0x0000800000000000L});
-    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000000L,0x0050000000000800L});
-    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000000002L,0x0050000000000000L});
-    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000800L});
-    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000000002L,0x0000001000000000L});
-    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000000L,0x0003000000000000L});
-    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
-    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
-    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000000L,0x0000002000000000L});
-    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
-    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000000L,0x0000008010000000L});
-    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000000L,0x0000030000000000L,0x00000000E0000000L});
-    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L,0x00000000C0000000L});
-    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000800L});
-    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000002L,0x0000040000000000L});
-    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
-    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000100000000L});
-    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
-    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000000L,0x0000100000000000L});
-    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0000000000000000L,0x0000000000EC0000L,0x0000000080000000L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0000000000000000L,0x0000000001000000L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0000000000000000L,0x00000000000C0000L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0000000000000000L,0x0000000008000000L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0000000000000000L,0x0000003FF0000000L,0x0000000600000000L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0000000000000000L,0x0020800000000800L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000000002L,0x0020800000000000L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000800L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000000002L,0x0000008000000000L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000800L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000000002L,0x0004000000000000L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0000000000000000L,0x1500000000000800L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000000002L,0x1500000000000000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000800L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0000000000000002L,0x0000004000000000L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000000000L,0x0010080000000000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000000000000000L,0x0000004000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0000000000000000L,0x0000010000000000L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x0000000000000000L,0x0000100000000000L,0x0000000800000000L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L,0x0000001000000000L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000800L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000000L,0x0000200000000000L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000002000000000L});
     public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x0000400000000000L});
     public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000000L,0x0000800000000000L});
-    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0000004100000000L});
-    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x000000000E402000L,0x0000000000000070L});
-    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000180L});
-    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0004100000000000L});
-    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000008000000000L});
-    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0E00000000000000L});
-    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0008000000000000L});
-    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0xF000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0010000000000000L});
-    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0020000000000000L});
-    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000000L,0x0050000000000000L});
-    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0001000000000000L,0x0080000000008000L});
-    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x01F8000000000000L});
-    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000080000000000L});
-    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000080000000002L});
-    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000800000000000L});
-    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000400000000020L,0x0000000000000000L,0x0000000200000000L});
-    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000000L,0x0100000000000000L});
-    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0001000000000020L});
-    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000001000000020L});
-    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0200000000000000L});
-    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000000000000000L,0x0400000000000000L});
-    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0007E10C080001F0L,0xCE00002000000400L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x1000000000000000L});
-    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000002L,0x1000000000000000L});
-    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0007E10C080001F0L,0xC600002000000400L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000002000L});
-    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0007E10C080001F0L,0xE600002000000400L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
-    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
-    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0001E00000000020L});
-    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x000000000C1F0000L});
-    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000008000000L});
-    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000006000000L});
-    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000004002L});
-    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000008002L});
-    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000001E00000L});
-    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000001E00002L});
-    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x000000000E000000L,0x0000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x000000000E000002L,0x0000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000080000020L,0x0400000000000000L});
-    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x00000003FC000000L});
-    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x00000003FC000002L});
-    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000040000000L});
-    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000004000000L});
-    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000088000000L});
-    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000C00000000L});
-    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000C00000002L});
-    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x000000F000000000L});
-    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x000000F000000002L});
-    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x0000010C00000000L});
-    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000002L,0x0008000000000000L});
-    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000060000000000L});
-    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000080000000000L,0x0000000000000000L,0x0000000C00000000L});
-    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000080000000002L,0x0000000000000000L,0x0000000C00000000L});
-    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000080000000000L,0x0000000000000000L,0x0000000400000000L});
-    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x0003E00008000020L});
-    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x8400000000000000L});
-    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000080000020L,0x0400000000000000L,0x0000000000040000L});
-    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000004000000L,0x1000000000000000L});
-    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0007E10C880001F0L,0xCE00002000000400L,0x0000005000017F8AL});
-    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0007E10C080001F0L,0xC600002000000C00L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0007F10C880001F0L,0xC600002000000400L,0x0000007000017F8AL});
-    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
-    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000080000020L,0x0400000000000000L,0x0000001000000000L});
-    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0007F10C080001F2L,0xC600002000000400L,0x0000006000017F8AL});
-    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
-    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
-    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
-    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
-    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0007E10C880001F0L,0xC600002000000400L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000080000020L,0x1400000000000800L,0x0000000000000070L});
-    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000080000022L,0x1400000000000000L,0x0000000000000050L});
-    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
-    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000080000020L,0x1400000000000000L,0x0000000000000050L});
-    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0007F10C080001F0L,0xC700002000000400L,0x0000006000017F8AL});
-    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0007E10C080001F0L,0xC700002000000400L,0x0000004000017F8AL});
-    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0007F10C080001F0L,0xC600002000000400L,0x0000006000017F8AL});
-    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
-    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
-    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0007F10C080001F0L,0xC600002000000C00L,0x0000006000017F8AL});
-    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000100000000000L,0x0000000000000000L,0x0000002000000000L});
-    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
-    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000008000000L,0x8400000000000000L});
-    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0004000000000000L,0x0000000000000000L,0x0000004000000000L});
-    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
-    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x00000000000001C0L});
-    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x00040000000001D0L,0xC000000000000000L,0x0000004000000C00L});
-    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000000L,0x8800000000000000L});
-    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000000002L,0x8000000000000000L});
-    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000001000L});
-    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000002000L});
-    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
-    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000028000L});
-    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
-    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000020000L});
-    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010000L});
-    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000180L});
-    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000080000020L,0x0C00000000000000L});
-    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0002200000000000L});
-    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
-    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000080000L});
-    public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000001000000000L});
-    public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x0000000000000002L,0x00000000000C0000L,0x0000000001000000L});
-    public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x0000000000000002L,0x0000000000EC0000L,0x0000000002000000L});
-    public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0000000000000002L,0x00000000000C0000L});
-    public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000000000002L,0x0000020000000000L,0x00000000C0000000L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x0001000000000000L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0002000000000000L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0008000400000000L});
+    public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x000000000E402000L,0x0000000000000070L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000010L,0x0000000000000180L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000030L,0x0000000000000180L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000030L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0020800000000000L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000000L,0x0040000000000000L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0E00000000000000L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0xF000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0100000000000000L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000000L,0x0200000000000000L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000000L,0x0400000000000000L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0001000000000000L,0x0800000000008000L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x01F8000000000000L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x1500000000000000L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000000L,0x2000000000000000L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00003FC000000000L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x0000080000000000L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000080000000002L});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000800000000000L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000400000000020L,0x0000000000000000L,0x0000400000000000L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0001000000000020L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000001000000020L});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x8000000000000000L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0007E10C080001F0L,0x8000008000000400L,0x00080000005FE2B3L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0007E10C080001F0L,0x8000008000000400L,0x00080000005FE2B1L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000002000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0007E10C080001F0L,0x8000008000000400L,0x00080000005FE2B9L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0001E00000000020L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x000000000C1F0000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000008000000L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000006000000L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000004000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000004002L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000008002L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000001E00000L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000001E00002L});
+    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x000000000E000000L,0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x000000000E000002L,0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x00000003FC000000L});
+    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x00000003FC000002L});
+    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000040000000L});
+    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x0000000004000000L});
+    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000088000000L});
+    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000C00000000L});
+    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000C00000002L});
+    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x000000F000000000L});
+    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x000000F000000002L});
+    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000010C00000000L});
+    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000002L,0x0080000000000000L});
+    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000060000000000L});
+    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000080000000000L,0x0000000000000000L,0x0001800000000000L});
+    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000080000000002L,0x0000000000000000L,0x0001800000000000L});
+    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000080000000000L,0x0000000000000000L,0x0000800000000000L});
+    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0003E00008000020L});
+    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000021L});
+    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000000L,0x0000000001000001L});
+    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x0000000004000000L,0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0007E10C880001F0L,0x8000008000000400L,0x000A0000005FE2B3L});
+    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0007E10C080001F0L,0x8000008000000C00L,0x00080000005FE2B1L});
+    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0007F10C880001F0L,0x8000008000000400L,0x000E0000005FE2B1L});
+    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000000L,0x0002000000000001L});
+    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0007F10C080001F2L,0x8000008000000400L,0x000C0000005FE2B1L});
+    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0007E10C880001F0L,0x8000008000000400L,0x00080000005FE2B1L});
+    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000800L,0x0000000000001C05L});
+    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000080000022L,0x0000000000000000L,0x0000000000001405L});
+    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000400L});
+    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000000L,0x0000000000001405L});
+    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0007F10C080001F0L,0xC000008000000400L,0x000C0000005FE2B1L});
+    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0007E10C080001F0L,0xC000008000000400L,0x00080000005FE2B1L});
+    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0007F10C080001F0L,0x8000008000000400L,0x000C0000005FE2B1L});
+    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000002000L});
+    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0007F10C080001F0L,0x8000008000000C00L,0x000C0000005FE2B1L});
+    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000100000000000L,0x0000000000000000L,0x0004000000000000L});
+    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000008000L});
+    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000008000000L,0x0000000000000000L,0x0000000000000021L});
+    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0004000000000000L,0x0000000000000000L,0x0008000000000000L});
+    public static final BitSet FOLLOW_155 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000010000L});
+    public static final BitSet FOLLOW_156 = new BitSet(new long[]{0x00000000000001C0L});
+    public static final BitSet FOLLOW_157 = new BitSet(new long[]{0x00040000000001D0L,0x0000000000000000L,0x0008000000030030L});
+    public static final BitSet FOLLOW_158 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000022L});
+    public static final BitSet FOLLOW_159 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_160 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000040000L});
+    public static final BitSet FOLLOW_161 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000080000L});
+    public static final BitSet FOLLOW_162 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000100000L});
+    public static final BitSet FOLLOW_163 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000A00000L});
+    public static final BitSet FOLLOW_164 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000200000L});
+    public static final BitSet FOLLOW_165 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000800000L});
+    public static final BitSet FOLLOW_166 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000400000L});
+    public static final BitSet FOLLOW_167 = new BitSet(new long[]{0x0000000000000180L});
+    public static final BitSet FOLLOW_168 = new BitSet(new long[]{0x0000000080000020L,0x0000000000000000L,0x0000000000000003L});
+    public static final BitSet FOLLOW_169 = new BitSet(new long[]{0x0002200000000000L});
+    public static final BitSet FOLLOW_170 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_171 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000002000000L});
+    public static final BitSet FOLLOW_172 = new BitSet(new long[]{0x0000001000000000L});
+    public static final BitSet FOLLOW_173 = new BitSet(new long[]{0x0000000000000002L,0x00000000000C0000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_174 = new BitSet(new long[]{0x0000000000000002L,0x0000000000EC0000L,0x0000000080000000L});
+    public static final BitSet FOLLOW_175 = new BitSet(new long[]{0x0000000000000002L,0x00000000000C0000L});
+    public static final BitSet FOLLOW_176 = new BitSet(new long[]{0x0000000000000002L,0x0000100000000000L,0x0000000800000000L});
+    public static final BitSet FOLLOW_177 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x00003FC000000000L});
 
 }
diff --git a/org.eclipse.osbp.xtext.datainterchange.ui/src-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/AbstractDataDSLProposalProvider.java b/org.eclipse.osbp.xtext.datainterchange.ui/src-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/AbstractDataDSLProposalProvider.java
index 4dc9ce5..d35105c 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ui/src-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/AbstractDataDSLProposalProvider.java
+++ b/org.eclipse.osbp.xtext.datainterchange.ui/src-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/AbstractDataDSLProposalProvider.java
@@ -132,9 +132,21 @@
 	public void completeDataInterchangeFileEDI_Validate(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void completeDataInterchangeFileFixed_FileURL(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeFileFixed_Encoding(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeFileFixed_Locale(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeDataInterchangeBean_Entity(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeDataInterchangeBean_RefDataSource(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeDataInterchangeBean_NodeName(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
@@ -186,6 +198,15 @@
 	public void completeDataInterchangeLookup_ElementMap(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeDataInterchangeLookup_DataMap(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookup_AllowNoResult(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeLookup_MarkerPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
 	public void completeDataInterchangeLookup_QueryProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
@@ -195,16 +216,7 @@
 	public void completeDataInterchangeLookup_CacheSize(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeLookup_DataMap(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
-	}
-	public void completeDataInterchangeLookup_AllowNoResult(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void completeDataInterchangeLookup_AllowNonuniqueResult(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
-		// subclasses may override
-	}
-	public void completeDataInterchangeLookup_MarkerPath(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeLookup_Condition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeDataInterchangeMarkerPath_Path(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -249,19 +261,40 @@
 	public void completeDataInterchangeExportFilter_Hiddenproperties(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeFilterCondition_RefProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeExportFilterCondition_RefProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeFilterCondition_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeExportFilterCondition_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeFilterCondition_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeExportFilterCondition_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeFilterCondition_Operator2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeExportFilterCondition_Operator2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
-	public void completeDataInterchangeFilterCondition_Subcondition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void completeDataInterchangeExportFilterCondition_Subcondition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterCondition_RefProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterCondition_Operator(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterCondition_Operand(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterCondition_Operator2(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterCondition_Subcondition(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterOperandProperty_RefProperty(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeLookupFilterOperandString_Value(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
 	public void completeDataInterchangeExportHide_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -297,6 +330,36 @@
 	public void completeDataInterchangeBlobMapping_MimeType(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
 	}
+	public void completeDataInterchangeFixedColumnMapping_Property(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		lookupCrossReference(((CrossReference)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeFixedColumnMapping_Length(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		completeRuleCall(((RuleCall)assignment.getTerminal()), context, acceptor);
+	}
+	public void completeDataInterchangeFixedColumnMapping_Trim(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_LeftTrim(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_RightTrim(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_LowerCase(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_UpperCase(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_CapFirst(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_UncapFirst(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void completeDataInterchangeFixedColumnMapping_Capitalize(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 
 	public void complete_DataInterchangeModel(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
@@ -322,6 +385,9 @@
 	public void complete_DataInterchangeFileEDI(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_DataInterchangeFileFixed(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_DataInterchangeBean(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -352,7 +418,19 @@
 	public void complete_DataInterchangeExportFilter(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_DataInterchangeFilterCondition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void complete_DataInterchangeExportFilterCondition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataInterchangeLookupFilterCondition(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataInterchangeLookupFilterOperand(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataInterchangeLookupFilterOperandProperty(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
+	public void complete_DataInterchangeLookupFilterOperandString(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
 	public void complete_DataInterchangeExportHide(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
@@ -370,6 +448,9 @@
 	public void complete_DataInterchangeBlobMapping(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
+	public void complete_DataInterchangeFixedColumnMapping(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		// subclasses may override
+	}
 	public void complete_LFQN(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
@@ -391,10 +472,10 @@
 	public void complete_EntityManagerMode(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_ConditionAndOperator1(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void complete_Operator(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
-	public void complete_ConditionAndOperator2(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+	public void complete_Junction(EObject model, RuleCall ruleCall, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		// subclasses may override
 	}
 }
diff --git a/org.eclipse.osbp.xtext.datainterchange.ui/src/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.xtend b/org.eclipse.osbp.xtext.datainterchange.ui/src/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.xtend
index f58ebbf..8e8884d 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ui/src/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.xtend
+++ b/org.eclipse.osbp.xtext.datainterchange.ui/src/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.xtend
@@ -24,6 +24,7 @@
 import org.eclipse.emf.ecore.EObject
 import org.eclipse.jface.viewers.StyledString
 import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper
+import org.eclipse.osbp.xtext.datainterchange.DataInterchange
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean
 import org.eclipse.osbp.xtext.datainterchange.ui.DataDSLDocumentationTranslator
 import org.eclipse.swt.widgets.FileDialog
@@ -106,7 +107,11 @@
 		ICompletionProposalAcceptor acceptor) {
 		filePickerProposal(model, assignment, context, acceptor, "*.edi")
 	}
-
+	
+	override completeDataInterchangeFileFixed_FileURL(EObject model, Assignment assignment, ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
+		filePickerProposal(model, assignment, context, acceptor, "*.txt")
+	}
+	
 	override completeDataInterchangeFileEDI_MappingModel(EObject model, Assignment assignment,
 		ContentAssistContext context, ICompletionProposalAcceptor acceptor) {
 		mappingPickerProposal(model, assignment, context, acceptor, "*.xml")
@@ -122,6 +127,11 @@
 		Charset.availableCharsets.keySet.forEach[acceptor.accept(createCompletionProposal("\"" + it + "\"", it, null, context))];
 	}
 
+	override completeDataInterchangeFileFixed_Encoding(EObject model, Assignment assignment, ContentAssistContext context,
+		ICompletionProposalAcceptor acceptor) {
+		Charset.availableCharsets.keySet.forEach[acceptor.accept(createCompletionProposal("\"" + it + "\"", it, null, context))];
+	}
+
 	override completeDataInterchangeFileEDI_Encoding(EObject model, Assignment assignment, ContentAssistContext context,
 		ICompletionProposalAcceptor acceptor) {
 		Charset.availableCharsets.keySet.forEach[acceptor.accept(createCompletionProposal("\"" + it + "\"", it, null, context))];
@@ -130,7 +140,7 @@
 	def filePickerProposal(EObject model, Assignment assignment, ContentAssistContext context,
 		ICompletionProposalAcceptor acceptor, String fileExtensions) {
 		var fileName = createCompletionProposal("Select input file...", context) as ConfigurableCompletionProposal
-		if (fileName != null) {
+		if (fileName !== null) {
 			var applier = new FileNameTextApplier()
 			applier.setExtensions(fileExtensions.split(","))
 			applier.setContext(context)
@@ -142,7 +152,7 @@
 	def mappingPickerProposal(EObject model, Assignment assignment, ContentAssistContext context,
 		ICompletionProposalAcceptor acceptor, String fileExtensions) {
 		var fileName = createCompletionProposal("Select mapping file...", context) as ConfigurableCompletionProposal
-		if (fileName != null) {
+		if (fileName !== null) {
 			var applier = new FileNameTextApplier()
 			applier.setExtensions(fileExtensions.split(","))
 			applier.setContext(context)
@@ -154,7 +164,7 @@
 	def chooseLocaleProposal(EObject model, Assignment assignment, ContentAssistContext context,
 		ICompletionProposalAcceptor acceptor) {
 		var locale = createCompletionProposal("Select locale...", context) as ConfigurableCompletionProposal
-		if (locale != null) {
+		if (locale !== null) {
 			var applier = new LocaleTextApplier()
 			applier.setContext(context)
 			locale.setTextApplier = applier
@@ -171,6 +181,13 @@
 	}
 
 	def isBeanValidProposal(DataInterchangeBean bean, String proposal, boolean result) {
+		var rootbean = null as DataInterchangeBean
+		if(bean.eContainer instanceof DataInterchange){
+			rootbean = (bean.eContainer as DataInterchange).path.get(0)			
+		}
+		if(proposal.equals("referencedBy") && rootbean !== null && bean.equals(rootbean)){
+			return false;
+		}
 		return result
 	}
 
@@ -178,7 +195,6 @@
 		ICompletionProposalAcceptor acceptor) {
 		providerHelper.complete_PackageName(model, ruleCall, context, acceptor, this)
 	}
-	
 
 	// ------------------------ delegates to TerminalsProposalProvider -----------------
 	override public void complete_INT(EObject model, RuleCall ruleCall, ContentAssistContext context,
diff --git a/org.eclipse.osbp.xtext.datainterchange.ui/xtend-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.java b/org.eclipse.osbp.xtext.datainterchange.ui/xtend-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.java
index b2bf4e6..6c07bdd 100644
--- a/org.eclipse.osbp.xtext.datainterchange.ui/xtend-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.java
+++ b/org.eclipse.osbp.xtext.datainterchange.ui/xtend-gen/org/eclipse/osbp/xtext/datainterchange/ui/contentassist/DataDSLProposalProvider.java
@@ -16,7 +16,6 @@
  */
 package org.eclipse.osbp.xtext.datainterchange.ui.contentassist;
 
-import com.google.common.base.Objects;
 import com.google.inject.Inject;
 import java.nio.charset.Charset;
 import java.util.function.Consumer;
@@ -24,6 +23,7 @@
 import org.eclipse.jface.text.contentassist.ICompletionProposal;
 import org.eclipse.jface.viewers.StyledString;
 import org.eclipse.osbp.xtext.basic.ui.contentassist.BasicDSLProposalProviderHelper;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean;
 import org.eclipse.osbp.xtext.datainterchange.ui.DataDSLDocumentationTranslator;
 import org.eclipse.osbp.xtext.datainterchange.ui.contentassist.AbstractDataDSLProposalProvider;
@@ -75,6 +75,11 @@
   }
   
   @Override
+  public void completeDataInterchangeFileFixed_FileURL(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    this.filePickerProposal(model, assignment, context, acceptor, "*.txt");
+  }
+  
+  @Override
   public void completeDataInterchangeFileEDI_MappingModel(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     this.mappingPickerProposal(model, assignment, context, acceptor, "*.xml");
   }
@@ -96,6 +101,14 @@
   }
   
   @Override
+  public void completeDataInterchangeFileFixed_Encoding(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
+    final Consumer<String> _function = (String it) -> {
+      acceptor.accept(this.createCompletionProposal((("\"" + it) + "\""), it, null, context));
+    };
+    Charset.availableCharsets().keySet().forEach(_function);
+  }
+  
+  @Override
   public void completeDataInterchangeFileEDI_Encoding(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     final Consumer<String> _function = (String it) -> {
       acceptor.accept(this.createCompletionProposal((("\"" + it) + "\""), it, null, context));
@@ -106,8 +119,7 @@
   public void filePickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
     ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select input file...", context);
     ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
-    boolean _notEquals = (!Objects.equal(fileName, null));
-    if (_notEquals) {
+    if ((fileName != null)) {
       FileNameTextApplier applier = new FileNameTextApplier();
       applier.setExtensions(fileExtensions.split(","));
       applier.setContext(context);
@@ -119,8 +131,7 @@
   public void mappingPickerProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor, final String fileExtensions) {
     ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select mapping file...", context);
     ConfigurableCompletionProposal fileName = ((ConfigurableCompletionProposal) _createCompletionProposal);
-    boolean _notEquals = (!Objects.equal(fileName, null));
-    if (_notEquals) {
+    if ((fileName != null)) {
       FileNameTextApplier applier = new FileNameTextApplier();
       applier.setExtensions(fileExtensions.split(","));
       applier.setContext(context);
@@ -132,8 +143,7 @@
   public void chooseLocaleProposal(final EObject model, final Assignment assignment, final ContentAssistContext context, final ICompletionProposalAcceptor acceptor) {
     ICompletionProposal _createCompletionProposal = this.createCompletionProposal("Select locale...", context);
     ConfigurableCompletionProposal locale = ((ConfigurableCompletionProposal) _createCompletionProposal);
-    boolean _notEquals = (!Objects.equal(locale, null));
-    if (_notEquals) {
+    if ((locale != null)) {
       LocaleTextApplier applier = new LocaleTextApplier();
       applier.setContext(context);
       locale.setTextApplier(applier);
@@ -153,6 +163,15 @@
   }
   
   public boolean isBeanValidProposal(final DataInterchangeBean bean, final String proposal, final boolean result) {
+    DataInterchangeBean rootbean = ((DataInterchangeBean) null);
+    EObject _eContainer = bean.eContainer();
+    if ((_eContainer instanceof DataInterchange)) {
+      EObject _eContainer_1 = bean.eContainer();
+      rootbean = ((DataInterchange) _eContainer_1).getPath().get(0);
+    }
+    if (((proposal.equals("referencedBy") && (rootbean != null)) && bean.equals(rootbean))) {
+      return false;
+    }
     return result;
   }
   
diff --git a/org.eclipse.osbp.xtext.datainterchange/META-INF/MANIFEST.MF b/org.eclipse.osbp.xtext.datainterchange/META-INF/MANIFEST.MF
index e5fc0a7..3b963cd 100644
--- a/org.eclipse.osbp.xtext.datainterchange/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.xtext.datainterchange/META-INF/MANIFEST.MF
@@ -59,7 +59,8 @@
  org.eclipse.osbp.datainterchange.api;bundle-version="0.9.0",
  org.eclipse.osbp.xtext.datainterchange.common;bundle-version="0.9.0",
  org.eclipse.osbp.blob;bundle-version="0.9.0",
- org.junit
+ org.junit,
+ org.eclipse.core.resources;bundle-version="3.11.1"
 Import-Package: javax.transaction.xa;version="[1.0.1,2.0.0)",
  org.apache.log4j,
  org.eclipse.e4.core.di.extensions,
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLFactory.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLFactory.java
index 05fb7ef..918d987 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLFactory.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLFactory.java
@@ -116,6 +116,15 @@
 	DataInterchangeFileEDI createDataInterchangeFileEDI();
 
 	/**
+	 * Returns a new object of class '<em>Data Interchange File Fixed</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Interchange File Fixed</em>'.
+	 * @generated
+	 */
+	DataInterchangeFileFixed createDataInterchangeFileFixed();
+
+	/**
 	 * Returns a new object of class '<em>Data Interchange Bean</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -188,13 +197,40 @@
 	DataInterchangeExportFilter createDataInterchangeExportFilter();
 
 	/**
-	 * Returns a new object of class '<em>Data Interchange Filter Condition</em>'.
+	 * Returns a new object of class '<em>Data Interchange Export Filter Condition</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return a new object of class '<em>Data Interchange Filter Condition</em>'.
+	 * @return a new object of class '<em>Data Interchange Export Filter Condition</em>'.
 	 * @generated
 	 */
-	DataInterchangeFilterCondition createDataInterchangeFilterCondition();
+	DataInterchangeExportFilterCondition createDataInterchangeExportFilterCondition();
+
+	/**
+	 * Returns a new object of class '<em>Data Interchange Lookup Filter Condition</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Interchange Lookup Filter Condition</em>'.
+	 * @generated
+	 */
+	DataInterchangeLookupFilterCondition createDataInterchangeLookupFilterCondition();
+
+	/**
+	 * Returns a new object of class '<em>Data Interchange Lookup Filter Operand String</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Interchange Lookup Filter Operand String</em>'.
+	 * @generated
+	 */
+	DataInterchangeLookupFilterOperandString createDataInterchangeLookupFilterOperandString();
+
+	/**
+	 * Returns a new object of class '<em>Data Interchange Lookup Filter Operand Property</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Interchange Lookup Filter Operand Property</em>'.
+	 * @generated
+	 */
+	DataInterchangeLookupFilterOperandProperty createDataInterchangeLookupFilterOperandProperty();
 
 	/**
 	 * Returns a new object of class '<em>Data Interchange Export Hide</em>'.
@@ -242,6 +278,15 @@
 	DataInterchangeBlobMapping createDataInterchangeBlobMapping();
 
 	/**
+	 * Returns a new object of class '<em>Data Interchange Fixed Column Mapping</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Data Interchange Fixed Column Mapping</em>'.
+	 * @generated
+	 */
+	DataInterchangeFixedColumnMapping createDataInterchangeFixedColumnMapping();
+
+	/**
 	 * Returns the package supported by this factory.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLPackage.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLPackage.java
index 9c2e573..0cb969c 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLPackage.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataDSLPackage.java
@@ -39,7 +39,7 @@
  * <!-- end-user-doc -->
  * @see org.eclipse.osbp.xtext.datainterchange.DataDSLFactory
  * @model kind="package"
- *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='data' modelName='DataDSL' prefix='DataDSL' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)\r\n All rights reserved. This program and the accompanying materials \r\n are made available under the terms of the Eclipse Public License 2.0  \r\n which accompanies this distribution, and is available at \r\n https://www.eclipse.org/legal/epl-2.0/ \r\n \r\n SPDX-License-Identifier: EPL-2.0 \r\n\r\n Based on ideas from Xtext, Xtend, Xcore\r\n  \r\n Contributors:  \r\n \t\tJoerg Riegel - Initial implementation \r\n ' basePackage='org.eclipse.osbp.xtext'"
+ *        annotation="http://www.eclipse.org/emf/2002/GenModel fileExtensions='data' modelName='DataDSL' prefix='DataDSL' updateClasspath='false' loadInitialization='false' literalsInterface='true' copyrightText='Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)\n All rights reserved. This program and the accompanying materials \n are made available under the terms of the Eclipse Public License 2.0  \n which accompanies this distribution, and is available at \n https://www.eclipse.org/legal/epl-2.0/ \n \n SPDX-License-Identifier: EPL-2.0 \n\n Based on ideas from Xtext, Xtend, Xcore\n  \n Contributors:  \n \t\tJoerg Riegel - Initial implementation \n ' basePackage='org.eclipse.osbp.xtext'"
  *        annotation="http://www.eclipse.org/emf/2002/Ecore rootPackage='datadsl'"
  * @generated
  */
@@ -762,6 +762,70 @@
 	int DATA_INTERCHANGE_FILE_EDI_OPERATION_COUNT = DATA_INTERCHANGE_FILE_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl <em>Data Interchange File Fixed</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFileFixed()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED = 10;
+
+	/**
+	 * The feature id for the '<em><b>Encoding</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED__ENCODING = DATA_INTERCHANGE_FILE__ENCODING;
+
+	/**
+	 * The feature id for the '<em><b>Locale</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED__LOCALE = DATA_INTERCHANGE_FILE__LOCALE;
+
+	/**
+	 * The feature id for the '<em><b>File URL</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED__FILE_URL = DATA_INTERCHANGE_FILE_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange File Fixed</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED_FEATURE_COUNT = DATA_INTERCHANGE_FILE_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_FILE___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange File Fixed</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FILE_FIXED_OPERATION_COUNT = DATA_INTERCHANGE_FILE_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl <em>Data Interchange Bean</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -769,7 +833,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeBean()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_BEAN = 10;
+	int DATA_INTERCHANGE_BEAN = 11;
 
 	/**
 	 * The feature id for the '<em><b>Entity</b></em>' reference.
@@ -781,13 +845,22 @@
 	int DATA_INTERCHANGE_BEAN__ENTITY = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 0;
 
 	/**
+	 * The feature id for the '<em><b>Ref Data Source</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
 	 * The feature id for the '<em><b>Mark Latest Import</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+	int DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 2;
 
 	/**
 	 * The feature id for the '<em><b>Mark Latest Export</b></em>' attribute.
@@ -796,16 +869,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 2;
-
-	/**
-	 * The feature id for the '<em><b>Has Blob Mapping</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 3;
+	int DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Latest Property</b></em>' reference.
@@ -941,7 +1005,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeKey()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_KEY = 11;
+	int DATA_INTERCHANGE_KEY = 12;
 
 	/**
 	 * The feature id for the '<em><b>Property</b></em>' reference.
@@ -987,7 +1051,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFormat()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_FORMAT = 12;
+	int DATA_INTERCHANGE_FORMAT = 13;
 
 	/**
 	 * The feature id for the '<em><b>Target Property</b></em>' reference.
@@ -1042,7 +1106,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExpression()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_EXPRESSION = 13;
+	int DATA_INTERCHANGE_EXPRESSION = 14;
 
 	/**
 	 * The feature id for the '<em><b>Target Property</b></em>' reference.
@@ -1088,7 +1152,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeEntityExpression()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_ENTITY_EXPRESSION = 14;
+	int DATA_INTERCHANGE_ENTITY_EXPRESSION = 15;
 
 	/**
 	 * The feature id for the '<em><b>Target Property</b></em>' reference.
@@ -1152,7 +1216,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangePredefinedExpression()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_PREDEFINED_EXPRESSION = 15;
+	int DATA_INTERCHANGE_PREDEFINED_EXPRESSION = 16;
 
 	/**
 	 * The feature id for the '<em><b>Target Property</b></em>' reference.
@@ -1216,7 +1280,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookup()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_LOOKUP = 16;
+	int DATA_INTERCHANGE_LOOKUP = 17;
 
 	/**
 	 * The feature id for the '<em><b>Entity</b></em>' reference.
@@ -1309,13 +1373,22 @@
 	int DATA_INTERCHANGE_LOOKUP__MARKER_PATH = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 9;
 
 	/**
+	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP__CONDITION = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 10;
+
+	/**
 	 * The number of structural features of the '<em>Data Interchange Lookup</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_LOOKUP_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 10;
+	int DATA_INTERCHANGE_LOOKUP_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 11;
 
 	/**
 	 * The operation id for the '<em>EResolve Proxy</em>' operation.
@@ -1343,7 +1416,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExpose()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_EXPOSE = 17;
+	int DATA_INTERCHANGE_EXPOSE = 18;
 
 	/**
 	 * The feature id for the '<em><b>Ref Entity</b></em>' reference.
@@ -1407,7 +1480,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExportFilter()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_EXPORT_FILTER = 18;
+	int DATA_INTERCHANGE_EXPORT_FILTER = 19;
 
 	/**
 	 * The feature id for the '<em><b>Condition</b></em>' containment reference.
@@ -1455,14 +1528,14 @@
 	int DATA_INTERCHANGE_EXPORT_FILTER_OPERATION_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_OPERATION_COUNT + 0;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl <em>Data Interchange Filter Condition</em>}' class.
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl <em>Data Interchange Export Filter Condition</em>}' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl
-	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION = 19;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION = 20;
 
 	/**
 	 * The feature id for the '<em><b>Ref Property</b></em>' reference.
@@ -1471,7 +1544,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 0;
 
 	/**
 	 * The feature id for the '<em><b>Operator</b></em>' attribute.
@@ -1480,7 +1553,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 1;
 
 	/**
 	 * The feature id for the '<em><b>Value</b></em>' attribute.
@@ -1489,7 +1562,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION__VALUE = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 2;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 2;
 
 	/**
 	 * The feature id for the '<em><b>Operator2</b></em>' attribute.
@@ -1498,7 +1571,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2 = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 3;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2 = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 3;
 
 	/**
 	 * The feature id for the '<em><b>Subcondition</b></em>' containment reference.
@@ -1507,16 +1580,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 4;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 4;
 
 	/**
-	 * The number of structural features of the '<em>Data Interchange Filter Condition</em>' class.
+	 * The number of structural features of the '<em>Data Interchange Export Filter Condition</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 5;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 5;
 
 	/**
 	 * The operation id for the '<em>EResolve Proxy</em>' operation.
@@ -1525,16 +1598,227 @@
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
 
 	/**
-	 * The number of operations of the '<em>Data Interchange Filter Condition</em>' class.
+	 * The number of operations of the '<em>Data Interchange Export Filter Condition</em>' class.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int DATA_INTERCHANGE_FILTER_CONDITION_OPERATION_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+	int DATA_INTERCHANGE_EXPORT_FILTER_CONDITION_OPERATION_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl <em>Data Interchange Lookup Filter Condition</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION = 21;
+
+	/**
+	 * The feature id for the '<em><b>Ref Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Operator</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Operand</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Operator2</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2 = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Subcondition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 4;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange Lookup Filter Condition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 5;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange Lookup Filter Condition</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION_OPERATION_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand <em>Data Interchange Lookup Filter Operand</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperand()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND = 22;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange Lookup Filter Operand</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_FEATURE_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_FEATURE_COUNT + 0;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LAZY_RESOLVER___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange Lookup Filter Operand</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_OPERATION_COUNT = DATA_INTERCHANGE_LAZY_RESOLVER_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandStringImpl <em>Data Interchange Lookup Filter Operand String</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandStringImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperandString()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING = 23;
+
+	/**
+	 * The feature id for the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange Lookup Filter Operand String</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING_FEATURE_COUNT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange Lookup Filter Operand String</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING_OPERATION_COUNT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_OPERATION_COUNT + 0;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandPropertyImpl <em>Data Interchange Lookup Filter Operand Property</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandPropertyImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperandProperty()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY = 24;
+
+	/**
+	 * The feature id for the '<em><b>Ref Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_FEATURE_COUNT + 0;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange Lookup Filter Operand Property</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY_FEATURE_COUNT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_FEATURE_COUNT + 1;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange Lookup Filter Operand Property</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY_OPERATION_COUNT = DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_OPERATION_COUNT + 0;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportHideImpl <em>Data Interchange Export Hide</em>}' class.
@@ -1544,7 +1828,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExportHide()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_EXPORT_HIDE = 20;
+	int DATA_INTERCHANGE_EXPORT_HIDE = 25;
 
 	/**
 	 * The feature id for the '<em><b>Property</b></em>' reference.
@@ -1590,7 +1874,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeMarkerPath()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_MARKER_PATH = 21;
+	int DATA_INTERCHANGE_MARKER_PATH = 26;
 
 	/**
 	 * The feature id for the '<em><b>Path</b></em>' containment reference list.
@@ -1636,7 +1920,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeMarkerEntity()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_MARKER_ENTITY = 22;
+	int DATA_INTERCHANGE_MARKER_ENTITY = 27;
 
 	/**
 	 * The feature id for the '<em><b>Mark Latest</b></em>' attribute.
@@ -1700,7 +1984,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeMapping()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_MAPPING = 23;
+	int DATA_INTERCHANGE_MAPPING = 28;
 
 	/**
 	 * The feature id for the '<em><b>Property</b></em>' reference.
@@ -1755,7 +2039,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeValueMapping()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_VALUE_MAPPING = 24;
+	int DATA_INTERCHANGE_VALUE_MAPPING = 29;
 
 	/**
 	 * The feature id for the '<em><b>Property</b></em>' reference.
@@ -1810,7 +2094,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeBlobMapping()
 	 * @generated
 	 */
-	int DATA_INTERCHANGE_BLOB_MAPPING = 25;
+	int DATA_INTERCHANGE_BLOB_MAPPING = 30;
 
 	/**
 	 * The feature id for the '<em><b>Property</b></em>' reference.
@@ -1885,6 +2169,142 @@
 	int DATA_INTERCHANGE_BLOB_MAPPING_OPERATION_COUNT = DATA_INTERCHANGE_MAPPING_OPERATION_COUNT + 0;
 
 	/**
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl <em>Data Interchange Fixed Column Mapping</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING = 31;
+
+	/**
+	 * The feature id for the '<em><b>Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY = DATA_INTERCHANGE_MAPPING__PROPERTY;
+
+	/**
+	 * The feature id for the '<em><b>Data</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA = DATA_INTERCHANGE_MAPPING__DATA;
+
+	/**
+	 * The feature id for the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Left Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 2;
+
+	/**
+	 * The feature id for the '<em><b>Right Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Upper Case</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Lower Case</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 5;
+
+	/**
+	 * The feature id for the '<em><b>Cap First</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Uncap First</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 7;
+
+	/**
+	 * The feature id for the '<em><b>Capitalize</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 8;
+
+	/**
+	 * The number of structural features of the '<em>Data Interchange Fixed Column Mapping</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING_FEATURE_COUNT = DATA_INTERCHANGE_MAPPING_FEATURE_COUNT + 9;
+
+	/**
+	 * The operation id for the '<em>EResolve Proxy</em>' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING___ERESOLVE_PROXY__INTERNALEOBJECT = DATA_INTERCHANGE_MAPPING___ERESOLVE_PROXY__INTERNALEOBJECT;
+
+	/**
+	 * The number of operations of the '<em>Data Interchange Fixed Column Mapping</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int DATA_INTERCHANGE_FIXED_COLUMN_MAPPING_OPERATION_COUNT = DATA_INTERCHANGE_MAPPING_OPERATION_COUNT + 0;
+
+	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.PredefinedBlobMimeTypeEnum <em>Predefined Blob Mime Type Enum</em>}' enum.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -1892,7 +2312,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getPredefinedBlobMimeTypeEnum()
 	 * @generated
 	 */
-	int PREDEFINED_BLOB_MIME_TYPE_ENUM = 26;
+	int PREDEFINED_BLOB_MIME_TYPE_ENUM = 32;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.PredefinedBeanEnum <em>Predefined Bean Enum</em>}' enum.
@@ -1902,7 +2322,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getPredefinedBeanEnum()
 	 * @generated
 	 */
-	int PREDEFINED_BEAN_ENUM = 27;
+	int PREDEFINED_BEAN_ENUM = 33;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.PredefinedBeanTypeEnum <em>Predefined Bean Type Enum</em>}' enum.
@@ -1912,7 +2332,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getPredefinedBeanTypeEnum()
 	 * @generated
 	 */
-	int PREDEFINED_BEAN_TYPE_ENUM = 28;
+	int PREDEFINED_BEAN_TYPE_ENUM = 34;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.EntityManagerMode <em>Entity Manager Mode</em>}' enum.
@@ -1922,27 +2342,27 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getEntityManagerMode()
 	 * @generated
 	 */
-	int ENTITY_MANAGER_MODE = 29;
+	int ENTITY_MANAGER_MODE = 35;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1 <em>Condition And Operator1</em>}' enum.
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.Operator <em>Operator</em>}' enum.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
-	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getConditionAndOperator1()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getOperator()
 	 * @generated
 	 */
-	int CONDITION_AND_OPERATOR1 = 30;
+	int OPERATOR = 36;
 
 	/**
-	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2 <em>Condition And Operator2</em>}' enum.
+	 * The meta object id for the '{@link org.eclipse.osbp.xtext.datainterchange.Junction <em>Junction</em>}' enum.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
-	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getConditionAndOperator2()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
+	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getJunction()
 	 * @generated
 	 */
-	int CONDITION_AND_OPERATOR2 = 31;
+	int JUNCTION = 37;
 
 	/**
 	 * The meta object id for the '<em>Internal EObject</em>' data type.
@@ -1952,7 +2372,7 @@
 	 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getInternalEObject()
 	 * @generated
 	 */
-	int INTERNAL_EOBJECT = 32;
+	int INTERNAL_EOBJECT = 38;
 
 
 	/**
@@ -2363,6 +2783,27 @@
 	EAttribute getDataInterchangeFileEDI_Validate();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed <em>Data Interchange File Fixed</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange File Fixed</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed
+	 * @generated
+	 */
+	EClass getDataInterchangeFileFixed();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed#getFileURL <em>File URL</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>File URL</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed#getFileURL()
+	 * @see #getDataInterchangeFileFixed()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFileFixed_FileURL();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean <em>Data Interchange Bean</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2384,6 +2825,17 @@
 	EReference getDataInterchangeBean_Entity();
 
 	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getRefDataSource <em>Ref Data Source</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Ref Data Source</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getRefDataSource()
+	 * @see #getDataInterchangeBean()
+	 * @generated
+	 */
+	EReference getDataInterchangeBean_RefDataSource();
+
+	/**
 	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isMarkLatestImport <em>Mark Latest Import</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2406,17 +2858,6 @@
 	EAttribute getDataInterchangeBean_MarkLatestExport();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isHasBlobMapping <em>Has Blob Mapping</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @return the meta object for the attribute '<em>Has Blob Mapping</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isHasBlobMapping()
-	 * @see #getDataInterchangeBean()
-	 * @generated
-	 */
-	EAttribute getDataInterchangeBean_HasBlobMapping();
-
-	/**
 	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getLatestProperty <em>Latest Property</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2796,6 +3237,17 @@
 	EReference getDataInterchangeLookup_MarkerPath();
 
 	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getCondition <em>Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Condition</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getCondition()
+	 * @see #getDataInterchangeLookup()
+	 * @generated
+	 */
+	EReference getDataInterchangeLookup_Condition();
+
+	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpose <em>Data Interchange Expose</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -2871,69 +3323,186 @@
 	EReference getDataInterchangeExportFilter_Hiddenproperties();
 
 	/**
-	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition <em>Data Interchange Filter Condition</em>}'.
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition <em>Data Interchange Export Filter Condition</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for class '<em>Data Interchange Filter Condition</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition
+	 * @return the meta object for class '<em>Data Interchange Export Filter Condition</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition
 	 * @generated
 	 */
-	EClass getDataInterchangeFilterCondition();
+	EClass getDataInterchangeExportFilterCondition();
 
 	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty <em>Ref Property</em>}'.
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty <em>Ref Property</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the reference '<em>Ref Property</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty()
-	 * @see #getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty()
+	 * @see #getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	EReference getDataInterchangeFilterCondition_RefProperty();
+	EReference getDataInterchangeExportFilterCondition_RefProperty();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator <em>Operator</em>}'.
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator <em>Operator</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the attribute '<em>Operator</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator()
-	 * @see #getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator()
+	 * @see #getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	EAttribute getDataInterchangeFilterCondition_Operator();
+	EAttribute getDataInterchangeExportFilterCondition_Operator();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue <em>Value</em>}'.
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue <em>Value</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the attribute '<em>Value</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue()
-	 * @see #getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue()
+	 * @see #getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	EAttribute getDataInterchangeFilterCondition_Value();
+	EAttribute getDataInterchangeExportFilterCondition_Value();
 
 	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2 <em>Operator2</em>}'.
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2 <em>Operator2</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the attribute '<em>Operator2</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2()
-	 * @see #getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2()
+	 * @see #getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	EAttribute getDataInterchangeFilterCondition_Operator2();
+	EAttribute getDataInterchangeExportFilterCondition_Operator2();
 
 	/**
-	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition <em>Subcondition</em>}'.
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition <em>Subcondition</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @return the meta object for the containment reference '<em>Subcondition</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition()
-	 * @see #getDataInterchangeFilterCondition()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition()
+	 * @see #getDataInterchangeExportFilterCondition()
 	 * @generated
 	 */
-	EReference getDataInterchangeFilterCondition_Subcondition();
+	EReference getDataInterchangeExportFilterCondition_Subcondition();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition <em>Data Interchange Lookup Filter Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange Lookup Filter Condition</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition
+	 * @generated
+	 */
+	EClass getDataInterchangeLookupFilterCondition();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getRefProperty <em>Ref Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Ref Property</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getRefProperty()
+	 * @see #getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	EReference getDataInterchangeLookupFilterCondition_RefProperty();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator <em>Operator</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator()
+	 * @see #getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeLookupFilterCondition_Operator();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperand <em>Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Operand</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperand()
+	 * @see #getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	EReference getDataInterchangeLookupFilterCondition_Operand();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator2 <em>Operator2</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Operator2</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator2()
+	 * @see #getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeLookupFilterCondition_Operator2();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getSubcondition <em>Subcondition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Subcondition</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getSubcondition()
+	 * @see #getDataInterchangeLookupFilterCondition()
+	 * @generated
+	 */
+	EReference getDataInterchangeLookupFilterCondition_Subcondition();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand <em>Data Interchange Lookup Filter Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange Lookup Filter Operand</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand
+	 * @generated
+	 */
+	EClass getDataInterchangeLookupFilterOperand();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString <em>Data Interchange Lookup Filter Operand String</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange Lookup Filter Operand String</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString
+	 * @generated
+	 */
+	EClass getDataInterchangeLookupFilterOperandString();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString#getValue <em>Value</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Value</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString#getValue()
+	 * @see #getDataInterchangeLookupFilterOperandString()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeLookupFilterOperandString_Value();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty <em>Data Interchange Lookup Filter Operand Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange Lookup Filter Operand Property</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty
+	 * @generated
+	 */
+	EClass getDataInterchangeLookupFilterOperandProperty();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty#getRefProperty <em>Ref Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Ref Property</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty#getRefProperty()
+	 * @see #getDataInterchangeLookupFilterOperandProperty()
+	 * @generated
+	 */
+	EReference getDataInterchangeLookupFilterOperandProperty_RefProperty();
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide <em>Data Interchange Export Hide</em>}'.
@@ -3106,6 +3675,115 @@
 	EAttribute getDataInterchangeBlobMapping_MimeType();
 
 	/**
+	 * Returns the meta object for class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping <em>Data Interchange Fixed Column Mapping</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Data Interchange Fixed Column Mapping</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping
+	 * @generated
+	 */
+	EClass getDataInterchangeFixedColumnMapping();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#getLength <em>Length</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Length</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#getLength()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_Length();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isTrim <em>Trim</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Trim</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isTrim()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_Trim();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLeftTrim <em>Left Trim</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Left Trim</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLeftTrim()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_LeftTrim();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isRightTrim <em>Right Trim</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Right Trim</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isRightTrim()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_RightTrim();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUpperCase <em>Upper Case</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Upper Case</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUpperCase()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_UpperCase();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLowerCase <em>Lower Case</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Lower Case</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLowerCase()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_LowerCase();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapFirst <em>Cap First</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Cap First</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapFirst()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_CapFirst();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUncapFirst <em>Uncap First</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Uncap First</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUncapFirst()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_UncapFirst();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapitalize <em>Capitalize</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Capitalize</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapitalize()
+	 * @see #getDataInterchangeFixedColumnMapping()
+	 * @generated
+	 */
+	EAttribute getDataInterchangeFixedColumnMapping_Capitalize();
+
+	/**
 	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.datainterchange.PredefinedBlobMimeTypeEnum <em>Predefined Blob Mime Type Enum</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3146,24 +3824,24 @@
 	EEnum getEntityManagerMode();
 
 	/**
-	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1 <em>Condition And Operator1</em>}'.
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.datainterchange.Operator <em>Operator</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Condition And Operator1</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
+	 * @return the meta object for enum '<em>Operator</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
 	 * @generated
 	 */
-	EEnum getConditionAndOperator1();
+	EEnum getOperator();
 
 	/**
-	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2 <em>Condition And Operator2</em>}'.
+	 * Returns the meta object for enum '{@link org.eclipse.osbp.xtext.datainterchange.Junction <em>Junction</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for enum '<em>Condition And Operator2</em>'.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
+	 * @return the meta object for enum '<em>Junction</em>'.
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
 	 * @generated
 	 */
-	EEnum getConditionAndOperator2();
+	EEnum getJunction();
 
 	/**
 	 * Returns the meta object for data type '{@link org.eclipse.emf.ecore.InternalEObject <em>Internal EObject</em>}'.
@@ -3524,6 +4202,24 @@
 		EAttribute DATA_INTERCHANGE_FILE_EDI__VALIDATE = eINSTANCE.getDataInterchangeFileEDI_Validate();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl <em>Data Interchange File Fixed</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFileFixed()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_FILE_FIXED = eINSTANCE.getDataInterchangeFileFixed();
+
+		/**
+		 * The meta object literal for the '<em><b>File URL</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FILE_FIXED__FILE_URL = eINSTANCE.getDataInterchangeFileFixed_FileURL();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl <em>Data Interchange Bean</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -3542,6 +4238,14 @@
 		EReference DATA_INTERCHANGE_BEAN__ENTITY = eINSTANCE.getDataInterchangeBean_Entity();
 
 		/**
+		 * The meta object literal for the '<em><b>Ref Data Source</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE = eINSTANCE.getDataInterchangeBean_RefDataSource();
+
+		/**
 		 * The meta object literal for the '<em><b>Mark Latest Import</b></em>' attribute feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -3558,14 +4262,6 @@
 		EAttribute DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT = eINSTANCE.getDataInterchangeBean_MarkLatestExport();
 
 		/**
-		 * The meta object literal for the '<em><b>Has Blob Mapping</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * @generated
-		 */
-		EAttribute DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING = eINSTANCE.getDataInterchangeBean_HasBlobMapping();
-
-		/**
 		 * The meta object literal for the '<em><b>Latest Property</b></em>' reference feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -3858,6 +4554,14 @@
 		EReference DATA_INTERCHANGE_LOOKUP__MARKER_PATH = eINSTANCE.getDataInterchangeLookup_MarkerPath();
 
 		/**
+		 * The meta object literal for the '<em><b>Condition</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_LOOKUP__CONDITION = eINSTANCE.getDataInterchangeLookup_Condition();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExposeImpl <em>Data Interchange Expose</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -3918,14 +4622,14 @@
 		EReference DATA_INTERCHANGE_EXPORT_FILTER__HIDDENPROPERTIES = eINSTANCE.getDataInterchangeExportFilter_Hiddenproperties();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl <em>Data Interchange Filter Condition</em>}' class.
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl <em>Data Interchange Export Filter Condition</em>}' class.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl
-		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFilterCondition()
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeExportFilterCondition()
 		 * @generated
 		 */
-		EClass DATA_INTERCHANGE_FILTER_CONDITION = eINSTANCE.getDataInterchangeFilterCondition();
+		EClass DATA_INTERCHANGE_EXPORT_FILTER_CONDITION = eINSTANCE.getDataInterchangeExportFilterCondition();
 
 		/**
 		 * The meta object literal for the '<em><b>Ref Property</b></em>' reference feature.
@@ -3933,7 +4637,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY = eINSTANCE.getDataInterchangeFilterCondition_RefProperty();
+		EReference DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY = eINSTANCE.getDataInterchangeExportFilterCondition_RefProperty();
 
 		/**
 		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
@@ -3941,7 +4645,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR = eINSTANCE.getDataInterchangeFilterCondition_Operator();
+		EAttribute DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR = eINSTANCE.getDataInterchangeExportFilterCondition_Operator();
 
 		/**
 		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
@@ -3949,7 +4653,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute DATA_INTERCHANGE_FILTER_CONDITION__VALUE = eINSTANCE.getDataInterchangeFilterCondition_Value();
+		EAttribute DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE = eINSTANCE.getDataInterchangeExportFilterCondition_Value();
 
 		/**
 		 * The meta object literal for the '<em><b>Operator2</b></em>' attribute feature.
@@ -3957,7 +4661,7 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EAttribute DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2 = eINSTANCE.getDataInterchangeFilterCondition_Operator2();
+		EAttribute DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2 = eINSTANCE.getDataInterchangeExportFilterCondition_Operator2();
 
 		/**
 		 * The meta object literal for the '<em><b>Subcondition</b></em>' containment reference feature.
@@ -3965,7 +4669,103 @@
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION = eINSTANCE.getDataInterchangeFilterCondition_Subcondition();
+		EReference DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION = eINSTANCE.getDataInterchangeExportFilterCondition_Subcondition();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl <em>Data Interchange Lookup Filter Condition</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterCondition()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION = eINSTANCE.getDataInterchangeLookupFilterCondition();
+
+		/**
+		 * The meta object literal for the '<em><b>Ref Property</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY = eINSTANCE.getDataInterchangeLookupFilterCondition_RefProperty();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR = eINSTANCE.getDataInterchangeLookupFilterCondition_Operator();
+
+		/**
+		 * The meta object literal for the '<em><b>Operand</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND = eINSTANCE.getDataInterchangeLookupFilterCondition_Operand();
+
+		/**
+		 * The meta object literal for the '<em><b>Operator2</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2 = eINSTANCE.getDataInterchangeLookupFilterCondition_Operator2();
+
+		/**
+		 * The meta object literal for the '<em><b>Subcondition</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION = eINSTANCE.getDataInterchangeLookupFilterCondition_Subcondition();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand <em>Data Interchange Lookup Filter Operand</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperand()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND = eINSTANCE.getDataInterchangeLookupFilterOperand();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandStringImpl <em>Data Interchange Lookup Filter Operand String</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandStringImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperandString()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING = eINSTANCE.getDataInterchangeLookupFilterOperandString();
+
+		/**
+		 * The meta object literal for the '<em><b>Value</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE = eINSTANCE.getDataInterchangeLookupFilterOperandString_Value();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandPropertyImpl <em>Data Interchange Lookup Filter Operand Property</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandPropertyImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeLookupFilterOperandProperty()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY = eINSTANCE.getDataInterchangeLookupFilterOperandProperty();
+
+		/**
+		 * The meta object literal for the '<em><b>Ref Property</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY = eINSTANCE.getDataInterchangeLookupFilterOperandProperty_RefProperty();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportHideImpl <em>Data Interchange Export Hide</em>}' class.
@@ -4108,6 +4908,88 @@
 		EAttribute DATA_INTERCHANGE_BLOB_MAPPING__MIME_TYPE = eINSTANCE.getDataInterchangeBlobMapping_MimeType();
 
 		/**
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl <em>Data Interchange Fixed Column Mapping</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getDataInterchangeFixedColumnMapping()
+		 * @generated
+		 */
+		EClass DATA_INTERCHANGE_FIXED_COLUMN_MAPPING = eINSTANCE.getDataInterchangeFixedColumnMapping();
+
+		/**
+		 * The meta object literal for the '<em><b>Length</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH = eINSTANCE.getDataInterchangeFixedColumnMapping_Length();
+
+		/**
+		 * The meta object literal for the '<em><b>Trim</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM = eINSTANCE.getDataInterchangeFixedColumnMapping_Trim();
+
+		/**
+		 * The meta object literal for the '<em><b>Left Trim</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM = eINSTANCE.getDataInterchangeFixedColumnMapping_LeftTrim();
+
+		/**
+		 * The meta object literal for the '<em><b>Right Trim</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM = eINSTANCE.getDataInterchangeFixedColumnMapping_RightTrim();
+
+		/**
+		 * The meta object literal for the '<em><b>Upper Case</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE = eINSTANCE.getDataInterchangeFixedColumnMapping_UpperCase();
+
+		/**
+		 * The meta object literal for the '<em><b>Lower Case</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE = eINSTANCE.getDataInterchangeFixedColumnMapping_LowerCase();
+
+		/**
+		 * The meta object literal for the '<em><b>Cap First</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST = eINSTANCE.getDataInterchangeFixedColumnMapping_CapFirst();
+
+		/**
+		 * The meta object literal for the '<em><b>Uncap First</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST = eINSTANCE.getDataInterchangeFixedColumnMapping_UncapFirst();
+
+		/**
+		 * The meta object literal for the '<em><b>Capitalize</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE = eINSTANCE.getDataInterchangeFixedColumnMapping_Capitalize();
+
+		/**
 		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.PredefinedBlobMimeTypeEnum <em>Predefined Blob Mime Type Enum</em>}' enum.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
@@ -4148,24 +5030,24 @@
 		EEnum ENTITY_MANAGER_MODE = eINSTANCE.getEntityManagerMode();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1 <em>Condition And Operator1</em>}' enum.
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.Operator <em>Operator</em>}' enum.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
-		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getConditionAndOperator1()
+		 * @see org.eclipse.osbp.xtext.datainterchange.Operator
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getOperator()
 		 * @generated
 		 */
-		EEnum CONDITION_AND_OPERATOR1 = eINSTANCE.getConditionAndOperator1();
+		EEnum OPERATOR = eINSTANCE.getOperator();
 
 		/**
-		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2 <em>Condition And Operator2</em>}' enum.
+		 * The meta object literal for the '{@link org.eclipse.osbp.xtext.datainterchange.Junction <em>Junction</em>}' enum.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
-		 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
-		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getConditionAndOperator2()
+		 * @see org.eclipse.osbp.xtext.datainterchange.Junction
+		 * @see org.eclipse.osbp.xtext.datainterchange.impl.DataDSLPackageImpl#getJunction()
 		 * @generated
 		 */
-		EEnum CONDITION_AND_OPERATOR2 = eINSTANCE.getConditionAndOperator2();
+		EEnum JUNCTION = eINSTANCE.getJunction();
 
 		/**
 		 * The meta object literal for the '<em>Internal EObject</em>' data type.
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeBean.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeBean.java
index 5644f6f..4ac4c38 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeBean.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeBean.java
@@ -19,6 +19,7 @@
 
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
 
 /**
  * <!-- begin-user-doc -->
@@ -30,9 +31,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getEntity <em>Entity</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getRefDataSource <em>Ref Data Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isMarkLatestImport <em>Mark Latest Import</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isMarkLatestExport <em>Mark Latest Export</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isHasBlobMapping <em>Has Blob Mapping</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getLatestProperty <em>Latest Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getLatestExpProperty <em>Latest Exp Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getElementMap <em>Element Map</em>}</li>
@@ -78,6 +79,32 @@
 	void setEntity(LEntity value);
 
 	/**
+	 * Returns the value of the '<em><b>Ref Data Source</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Ref Data Source</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Ref Data Source</em>' reference.
+	 * @see #setRefDataSource(LEntityFeature)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeBean_RefDataSource()
+	 * @model
+	 * @generated
+	 */
+	LEntityFeature getRefDataSource();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#getRefDataSource <em>Ref Data Source</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Ref Data Source</em>' reference.
+	 * @see #getRefDataSource()
+	 * @generated
+	 */
+	void setRefDataSource(LEntityFeature value);
+
+	/**
 	 * Returns the value of the '<em><b>Mark Latest Import</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <p>
@@ -130,32 +157,6 @@
 	void setMarkLatestExport(boolean value);
 
 	/**
-	 * Returns the value of the '<em><b>Has Blob Mapping</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Has Blob Mapping</em>' attribute isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Has Blob Mapping</em>' attribute.
-	 * @see #setHasBlobMapping(boolean)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeBean_HasBlobMapping()
-	 * @model unique="false"
-	 * @generated
-	 */
-	boolean isHasBlobMapping();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean#isHasBlobMapping <em>Has Blob Mapping</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Has Blob Mapping</em>' attribute.
-	 * @see #isHasBlobMapping()
-	 * @generated
-	 */
-	void setHasBlobMapping(boolean value);
-
-	/**
 	 * Returns the value of the '<em><b>Latest Property</b></em>' reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilter.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilter.java
index 5fccbdd..dcf339d 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilter.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilter.java
@@ -44,12 +44,12 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Condition</em>' containment reference.
-	 * @see #setCondition(DataInterchangeFilterCondition)
+	 * @see #setCondition(DataInterchangeExportFilterCondition)
 	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilter_Condition()
 	 * @model containment="true"
 	 * @generated
 	 */
-	DataInterchangeFilterCondition getCondition();
+	DataInterchangeExportFilterCondition getCondition();
 
 	/**
 	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter#getCondition <em>Condition</em>}' containment reference.
@@ -59,7 +59,7 @@
 	 * @see #getCondition()
 	 * @generated
 	 */
-	void setCondition(DataInterchangeFilterCondition value);
+	void setCondition(DataInterchangeExportFilterCondition value);
 
 	/**
 	 * Returns the value of the '<em><b>Hiddenproperties</b></em>' containment reference list.
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilterCondition.java
similarity index 72%
rename from org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java
rename to org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilterCondition.java
index 4432a5e..548a8e7 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeExportFilterCondition.java
@@ -19,25 +19,25 @@
 
 /**
  * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Data Interchange Filter Condition</b></em>'.
+ * A representation of the model object '<em><b>Data Interchange Export Filter Condition</b></em>'.
  * <!-- end-user-doc -->
  *
  * <p>
  * The following features are supported:
  * </p>
  * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty <em>Ref Property</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator <em>Operator</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2 <em>Operator2</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition <em>Subcondition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty <em>Ref Property</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2 <em>Operator2</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition <em>Subcondition</em>}</li>
  * </ul>
  *
- * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition()
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition()
  * @model
  * @generated
  */
-public interface DataInterchangeFilterCondition extends DataInterchangeLazyResolver {
+public interface DataInterchangeExportFilterCondition extends DataInterchangeLazyResolver {
 	/**
 	 * Returns the value of the '<em><b>Ref Property</b></em>' reference.
 	 * <!-- begin-user-doc -->
@@ -48,14 +48,14 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Ref Property</em>' reference.
 	 * @see #setRefProperty(LEntityFeature)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_RefProperty()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_RefProperty()
 	 * @model
 	 * @generated
 	 */
 	LEntityFeature getRefProperty();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty <em>Ref Property</em>}' reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getRefProperty <em>Ref Property</em>}' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Ref Property</em>' reference.
@@ -66,7 +66,7 @@
 
 	/**
 	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1}.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Operator}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
@@ -74,24 +74,24 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Operator</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
-	 * @see #setOperator(ConditionAndOperator1)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Operator()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
+	 * @see #setOperator(Operator)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Operator()
 	 * @model unique="false"
 	 * @generated
 	 */
-	ConditionAndOperator1 getOperator();
+	Operator getOperator();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator <em>Operator</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator <em>Operator</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Operator</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
 	 * @see #getOperator()
 	 * @generated
 	 */
-	void setOperator(ConditionAndOperator1 value);
+	void setOperator(Operator value);
 
 	/**
 	 * Returns the value of the '<em><b>Value</b></em>' attribute.
@@ -103,14 +103,14 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Value</em>' attribute.
 	 * @see #setValue(String)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Value()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Value()
 	 * @model unique="false"
 	 * @generated
 	 */
 	String getValue();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue <em>Value</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getValue <em>Value</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Value</em>' attribute.
@@ -121,7 +121,7 @@
 
 	/**
 	 * Returns the value of the '<em><b>Operator2</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2}.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Junction}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Operator2</em>' attribute isn't clear,
@@ -129,24 +129,24 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Operator2</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
-	 * @see #setOperator2(ConditionAndOperator2)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Operator2()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
+	 * @see #setOperator2(Junction)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Operator2()
 	 * @model unique="false"
 	 * @generated
 	 */
-	ConditionAndOperator2 getOperator2();
+	Junction getOperator2();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2 <em>Operator2</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getOperator2 <em>Operator2</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Operator2</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
 	 * @see #getOperator2()
 	 * @generated
 	 */
-	void setOperator2(ConditionAndOperator2 value);
+	void setOperator2(Junction value);
 
 	/**
 	 * Returns the value of the '<em><b>Subcondition</b></em>' containment reference.
@@ -157,21 +157,21 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Subcondition</em>' containment reference.
-	 * @see #setSubcondition(DataInterchangeFilterCondition)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Subcondition()
+	 * @see #setSubcondition(DataInterchangeExportFilterCondition)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeExportFilterCondition_Subcondition()
 	 * @model containment="true"
 	 * @generated
 	 */
-	DataInterchangeFilterCondition getSubcondition();
+	DataInterchangeExportFilterCondition getSubcondition();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition <em>Subcondition</em>}' containment reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition#getSubcondition <em>Subcondition</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Subcondition</em>' containment reference.
 	 * @see #getSubcondition()
 	 * @generated
 	 */
-	void setSubcondition(DataInterchangeFilterCondition value);
+	void setSubcondition(DataInterchangeExportFilterCondition value);
 
-} // DataInterchangeFilterCondition
+} // DataInterchangeExportFilterCondition
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFileFixed.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFileFixed.java
new file mode 100644
index 0000000..57a8514
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFileFixed.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Interchange File Fixed</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed#getFileURL <em>File URL</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFileFixed()
+ * @model
+ * @generated
+ */
+public interface DataInterchangeFileFixed extends DataInterchangeFile {
+	/**
+	 * Returns the value of the '<em><b>File URL</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>File URL</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>File URL</em>' attribute.
+	 * @see #setFileURL(String)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFileFixed_FileURL()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getFileURL();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed#getFileURL <em>File URL</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>File URL</em>' attribute.
+	 * @see #getFileURL()
+	 * @generated
+	 */
+	void setFileURL(String value);
+
+} // DataInterchangeFileFixed
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFixedColumnMapping.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFixedColumnMapping.java
new file mode 100644
index 0000000..2cfd60b
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFixedColumnMapping.java
@@ -0,0 +1,278 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Interchange Fixed Column Mapping</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isTrim <em>Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLeftTrim <em>Left Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isRightTrim <em>Right Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUpperCase <em>Upper Case</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLowerCase <em>Lower Case</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapFirst <em>Cap First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUncapFirst <em>Uncap First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapitalize <em>Capitalize</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping()
+ * @model
+ * @generated
+ */
+public interface DataInterchangeFixedColumnMapping extends DataInterchangeMapping {
+	/**
+	 * Returns the value of the '<em><b>Length</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Length</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Length</em>' attribute.
+	 * @see #setLength(int)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_Length()
+	 * @model unique="false"
+	 * @generated
+	 */
+	int getLength();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#getLength <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Length</em>' attribute.
+	 * @see #getLength()
+	 * @generated
+	 */
+	void setLength(int value);
+
+	/**
+	 * Returns the value of the '<em><b>Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Trim</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Trim</em>' attribute.
+	 * @see #setTrim(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_Trim()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isTrim();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isTrim <em>Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Trim</em>' attribute.
+	 * @see #isTrim()
+	 * @generated
+	 */
+	void setTrim(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Left Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Left Trim</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Left Trim</em>' attribute.
+	 * @see #setLeftTrim(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_LeftTrim()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isLeftTrim();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLeftTrim <em>Left Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Left Trim</em>' attribute.
+	 * @see #isLeftTrim()
+	 * @generated
+	 */
+	void setLeftTrim(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Right Trim</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Right Trim</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Right Trim</em>' attribute.
+	 * @see #setRightTrim(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_RightTrim()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isRightTrim();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isRightTrim <em>Right Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Right Trim</em>' attribute.
+	 * @see #isRightTrim()
+	 * @generated
+	 */
+	void setRightTrim(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Upper Case</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Upper Case</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Upper Case</em>' attribute.
+	 * @see #setUpperCase(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_UpperCase()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isUpperCase();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUpperCase <em>Upper Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Upper Case</em>' attribute.
+	 * @see #isUpperCase()
+	 * @generated
+	 */
+	void setUpperCase(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Lower Case</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Lower Case</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Lower Case</em>' attribute.
+	 * @see #setLowerCase(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_LowerCase()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isLowerCase();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isLowerCase <em>Lower Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Lower Case</em>' attribute.
+	 * @see #isLowerCase()
+	 * @generated
+	 */
+	void setLowerCase(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Cap First</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Cap First</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Cap First</em>' attribute.
+	 * @see #setCapFirst(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_CapFirst()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isCapFirst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapFirst <em>Cap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Cap First</em>' attribute.
+	 * @see #isCapFirst()
+	 * @generated
+	 */
+	void setCapFirst(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Uncap First</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Uncap First</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Uncap First</em>' attribute.
+	 * @see #setUncapFirst(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_UncapFirst()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isUncapFirst();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isUncapFirst <em>Uncap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Uncap First</em>' attribute.
+	 * @see #isUncapFirst()
+	 * @generated
+	 */
+	void setUncapFirst(boolean value);
+
+	/**
+	 * Returns the value of the '<em><b>Capitalize</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Capitalize</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Capitalize</em>' attribute.
+	 * @see #setCapitalize(boolean)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFixedColumnMapping_Capitalize()
+	 * @model unique="false"
+	 * @generated
+	 */
+	boolean isCapitalize();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping#isCapitalize <em>Capitalize</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Capitalize</em>' attribute.
+	 * @see #isCapitalize()
+	 * @generated
+	 */
+	void setCapitalize(boolean value);
+
+} // DataInterchangeFixedColumnMapping
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookup.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookup.java
index af4b099..bca479e 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookup.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookup.java
@@ -38,6 +38,7 @@
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#isCached <em>Cached</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getCacheSize <em>Cache Size</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getMarkerPath <em>Marker Path</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getCondition <em>Condition</em>}</li>
  * </ul>
  *
  * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookup()
@@ -305,4 +306,30 @@
 	 */
 	void setMarkerPath(DataInterchangeMarkerPath value);
 
+	/**
+	 * Returns the value of the '<em><b>Condition</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Condition</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Condition</em>' containment reference.
+	 * @see #setCondition(DataInterchangeLookupFilterCondition)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookup_Condition()
+	 * @model containment="true"
+	 * @generated
+	 */
+	DataInterchangeLookupFilterCondition getCondition();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup#getCondition <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Condition</em>' containment reference.
+	 * @see #getCondition()
+	 * @generated
+	 */
+	void setCondition(DataInterchangeLookupFilterCondition value);
+
 } // DataInterchangeLookup
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterCondition.java
similarity index 65%
copy from org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java
copy to org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterCondition.java
index 4432a5e..6ab8d1f 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeFilterCondition.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterCondition.java
@@ -19,25 +19,25 @@
 
 /**
  * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Data Interchange Filter Condition</b></em>'.
+ * A representation of the model object '<em><b>Data Interchange Lookup Filter Condition</b></em>'.
  * <!-- end-user-doc -->
  *
  * <p>
  * The following features are supported:
  * </p>
  * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty <em>Ref Property</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator <em>Operator</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2 <em>Operator2</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition <em>Subcondition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getRefProperty <em>Ref Property</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperand <em>Operand</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator2 <em>Operator2</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getSubcondition <em>Subcondition</em>}</li>
  * </ul>
  *
- * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition()
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition()
  * @model
  * @generated
  */
-public interface DataInterchangeFilterCondition extends DataInterchangeLazyResolver {
+public interface DataInterchangeLookupFilterCondition extends DataInterchangeLazyResolver {
 	/**
 	 * Returns the value of the '<em><b>Ref Property</b></em>' reference.
 	 * <!-- begin-user-doc -->
@@ -48,14 +48,14 @@
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Ref Property</em>' reference.
 	 * @see #setRefProperty(LEntityFeature)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_RefProperty()
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition_RefProperty()
 	 * @model
 	 * @generated
 	 */
 	LEntityFeature getRefProperty();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getRefProperty <em>Ref Property</em>}' reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getRefProperty <em>Ref Property</em>}' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Ref Property</em>' reference.
@@ -66,7 +66,7 @@
 
 	/**
 	 * Returns the value of the '<em><b>Operator</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1}.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Operator}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Operator</em>' attribute isn't clear,
@@ -74,54 +74,54 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Operator</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
-	 * @see #setOperator(ConditionAndOperator1)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Operator()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
+	 * @see #setOperator(Operator)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition_Operator()
 	 * @model unique="false"
 	 * @generated
 	 */
-	ConditionAndOperator1 getOperator();
+	Operator getOperator();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator <em>Operator</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator <em>Operator</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Operator</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
+	 * @see org.eclipse.osbp.xtext.datainterchange.Operator
 	 * @see #getOperator()
 	 * @generated
 	 */
-	void setOperator(ConditionAndOperator1 value);
+	void setOperator(Operator value);
 
 	/**
-	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * Returns the value of the '<em><b>Operand</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * If the meaning of the '<em>Operand</em>' containment reference isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Value</em>' attribute.
-	 * @see #setValue(String)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Value()
-	 * @model unique="false"
+	 * @return the value of the '<em>Operand</em>' containment reference.
+	 * @see #setOperand(DataInterchangeLookupFilterOperand)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition_Operand()
+	 * @model containment="true"
 	 * @generated
 	 */
-	String getValue();
+	DataInterchangeLookupFilterOperand getOperand();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getValue <em>Value</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperand <em>Operand</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @param value the new value of the '<em>Value</em>' attribute.
-	 * @see #getValue()
+	 * @param value the new value of the '<em>Operand</em>' containment reference.
+	 * @see #getOperand()
 	 * @generated
 	 */
-	void setValue(String value);
+	void setOperand(DataInterchangeLookupFilterOperand value);
 
 	/**
 	 * Returns the value of the '<em><b>Operator2</b></em>' attribute.
-	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2}.
+	 * The literals are from the enumeration {@link org.eclipse.osbp.xtext.datainterchange.Junction}.
 	 * <!-- begin-user-doc -->
 	 * <p>
 	 * If the meaning of the '<em>Operator2</em>' attribute isn't clear,
@@ -129,24 +129,24 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Operator2</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
-	 * @see #setOperator2(ConditionAndOperator2)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Operator2()
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
+	 * @see #setOperator2(Junction)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition_Operator2()
 	 * @model unique="false"
 	 * @generated
 	 */
-	ConditionAndOperator2 getOperator2();
+	Junction getOperator2();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getOperator2 <em>Operator2</em>}' attribute.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getOperator2 <em>Operator2</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Operator2</em>' attribute.
-	 * @see org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2
+	 * @see org.eclipse.osbp.xtext.datainterchange.Junction
 	 * @see #getOperator2()
 	 * @generated
 	 */
-	void setOperator2(ConditionAndOperator2 value);
+	void setOperator2(Junction value);
 
 	/**
 	 * Returns the value of the '<em><b>Subcondition</b></em>' containment reference.
@@ -157,21 +157,21 @@
 	 * </p>
 	 * <!-- end-user-doc -->
 	 * @return the value of the '<em>Subcondition</em>' containment reference.
-	 * @see #setSubcondition(DataInterchangeFilterCondition)
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeFilterCondition_Subcondition()
+	 * @see #setSubcondition(DataInterchangeLookupFilterCondition)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterCondition_Subcondition()
 	 * @model containment="true"
 	 * @generated
 	 */
-	DataInterchangeFilterCondition getSubcondition();
+	DataInterchangeLookupFilterCondition getSubcondition();
 
 	/**
-	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition#getSubcondition <em>Subcondition</em>}' containment reference.
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition#getSubcondition <em>Subcondition</em>}' containment reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the new value of the '<em>Subcondition</em>' containment reference.
 	 * @see #getSubcondition()
 	 * @generated
 	 */
-	void setSubcondition(DataInterchangeFilterCondition value);
+	void setSubcondition(DataInterchangeLookupFilterCondition value);
 
-} // DataInterchangeFilterCondition
+} // DataInterchangeLookupFilterCondition
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperand.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperand.java
new file mode 100644
index 0000000..9b69670
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperand.java
@@ -0,0 +1,30 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Interchange Lookup Filter Operand</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ *
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterOperand()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface DataInterchangeLookupFilterOperand extends DataInterchangeLazyResolver {
+} // DataInterchangeLookupFilterOperand
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandProperty.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandProperty.java
new file mode 100644
index 0000000..52cf30e
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandProperty.java
@@ -0,0 +1,63 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Interchange Lookup Filter Operand Property</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty#getRefProperty <em>Ref Property</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterOperandProperty()
+ * @model
+ * @generated
+ */
+public interface DataInterchangeLookupFilterOperandProperty extends DataInterchangeLookupFilterOperand {
+	/**
+	 * Returns the value of the '<em><b>Ref Property</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Ref Property</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Ref Property</em>' reference.
+	 * @see #setRefProperty(LEntityFeature)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterOperandProperty_RefProperty()
+	 * @model
+	 * @generated
+	 */
+	LEntityFeature getRefProperty();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty#getRefProperty <em>Ref Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Ref Property</em>' reference.
+	 * @see #getRefProperty()
+	 * @generated
+	 */
+	void setRefProperty(LEntityFeature value);
+
+} // DataInterchangeLookupFilterOperandProperty
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandString.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandString.java
new file mode 100644
index 0000000..2df7267
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/DataInterchangeLookupFilterOperandString.java
@@ -0,0 +1,62 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange;
+
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Data Interchange Lookup Filter Operand String</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterOperandString()
+ * @model
+ * @generated
+ */
+public interface DataInterchangeLookupFilterOperandString extends DataInterchangeLookupFilterOperand {
+	/**
+	 * Returns the value of the '<em><b>Value</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Value</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Value</em>' attribute.
+	 * @see #setValue(String)
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getDataInterchangeLookupFilterOperandString_Value()
+	 * @model unique="false"
+	 * @generated
+	 */
+	String getValue();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString#getValue <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Value</em>' attribute.
+	 * @see #getValue()
+	 * @generated
+	 */
+	void setValue(String value);
+
+} // DataInterchangeLookupFilterOperandString
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator2.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Junction.java
similarity index 76%
rename from org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator2.java
rename to org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Junction.java
index 461684a..28279f5 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator2.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Junction.java
@@ -23,14 +23,14 @@
 
 /**
  * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Condition And Operator2</b></em>',
+ * A representation of the literals of the enumeration '<em><b>Junction</b></em>',
  * and utility methods for working with them.
  * <!-- end-user-doc -->
- * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getConditionAndOperator2()
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getJunction()
  * @model
  * @generated
  */
-public enum ConditionAndOperator2 implements Enumerator {
+public enum Junction implements Enumerator {
 	/**
 	 * The '<em><b>And</b></em>' literal object.
 	 * <!-- begin-user-doc -->
@@ -82,36 +82,36 @@
 	public static final int OR_VALUE = 0;
 
 	/**
-	 * An array of all the '<em><b>Condition And Operator2</b></em>' enumerators.
+	 * An array of all the '<em><b>Junction</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private static final ConditionAndOperator2[] VALUES_ARRAY =
-		new ConditionAndOperator2[] {
+	private static final Junction[] VALUES_ARRAY =
+		new Junction[] {
 			AND,
 			OR,
 		};
 
 	/**
-	 * A public read-only list of all the '<em><b>Condition And Operator2</b></em>' enumerators.
+	 * A public read-only list of all the '<em><b>Junction</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List<ConditionAndOperator2> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+	public static final List<Junction> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
-	 * Returns the '<em><b>Condition And Operator2</b></em>' literal with the specified literal value.
+	 * Returns the '<em><b>Junction</b></em>' literal with the specified literal value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param literal the literal.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator2 get(String literal) {
+	public static Junction get(String literal) {
 		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ConditionAndOperator2 result = VALUES_ARRAY[i];
+			Junction result = VALUES_ARRAY[i];
 			if (result.toString().equals(literal)) {
 				return result;
 			}
@@ -120,16 +120,16 @@
 	}
 
 	/**
-	 * Returns the '<em><b>Condition And Operator2</b></em>' literal with the specified name.
+	 * Returns the '<em><b>Junction</b></em>' literal with the specified name.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param name the name.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator2 getByName(String name) {
+	public static Junction getByName(String name) {
 		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ConditionAndOperator2 result = VALUES_ARRAY[i];
+			Junction result = VALUES_ARRAY[i];
 			if (result.getName().equals(name)) {
 				return result;
 			}
@@ -138,14 +138,14 @@
 	}
 
 	/**
-	 * Returns the '<em><b>Condition And Operator2</b></em>' literal with the specified integer value.
+	 * Returns the '<em><b>Junction</b></em>' literal with the specified integer value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the integer value.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator2 get(int value) {
+	public static Junction get(int value) {
 		switch (value) {
 			case AND_VALUE: return AND;
 		}
@@ -179,7 +179,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private ConditionAndOperator2(int value, String name, String literal) {
+	private Junction(int value, String name, String literal) {
 		this.value = value;
 		this.name = name;
 		this.literal = literal;
@@ -223,4 +223,4 @@
 		return literal;
 	}
 	
-} //ConditionAndOperator2
+} //Junction
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator1.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Operator.java
similarity index 66%
rename from org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator1.java
rename to org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Operator.java
index d371e6f..1d6859e 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/ConditionAndOperator1.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/Operator.java
@@ -23,14 +23,14 @@
 
 /**
  * <!-- begin-user-doc -->
- * A representation of the literals of the enumeration '<em><b>Condition And Operator1</b></em>',
+ * A representation of the literals of the enumeration '<em><b>Operator</b></em>',
  * and utility methods for working with them.
  * <!-- end-user-doc -->
- * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getConditionAndOperator1()
+ * @see org.eclipse.osbp.xtext.datainterchange.DataDSLPackage#getOperator()
  * @model
  * @generated
  */
-public enum ConditionAndOperator1 implements Enumerator {
+public enum Operator implements Enumerator {
 	/**
 	 * The '<em><b>Equals</b></em>' literal object.
 	 * <!-- begin-user-doc -->
@@ -92,46 +92,6 @@
 	LESSTHENOREQUALTO(0, "lessthenorequalto", "<="),
 
 	/**
-	 * The '<em><b>In</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #IN_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	IN(0, "in", "in"),
-
-	/**
-	 * The '<em><b>Between</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #BETWEEN_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	BETWEEN(0, "between", "between"),
-
-	/**
-	 * The '<em><b>Like</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #LIKE_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	LIKE(0, "like", "like"),
-
-	/**
-	 * The '<em><b>Not</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #NOT_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	NOT(0, "not", "not"),
-
-	/**
 	 * The '<em><b>Isnull</b></em>' literal object.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -149,17 +109,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	ISNOTNULL(0, "isnotnull", "isnotnull"),
-
-	/**
-	 * The '<em><b>Exists</b></em>' literal object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #EXISTS_VALUE
-	 * @generated
-	 * @ordered
-	 */
-	EXISTS(0, "exists", "exists");
+	ISNOTNULL(0, "isnotnull", "isnotnull");
 
 	/**
 	 * The '<em><b>Equals</b></em>' literal value.
@@ -252,66 +202,6 @@
 	public static final int LESSTHENOREQUALTO_VALUE = 0;
 
 	/**
-	 * The '<em><b>In</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>In</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #IN
-	 * @model name="in"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int IN_VALUE = 0;
-
-	/**
-	 * The '<em><b>Between</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Between</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #BETWEEN
-	 * @model name="between"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int BETWEEN_VALUE = 0;
-
-	/**
-	 * The '<em><b>Like</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Like</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #LIKE
-	 * @model name="like"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int LIKE_VALUE = 0;
-
-	/**
-	 * The '<em><b>Not</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Not</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #NOT
-	 * @model name="not"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int NOT_VALUE = 0;
-
-	/**
 	 * The '<em><b>Isnull</b></em>' literal value.
 	 * <!-- begin-user-doc -->
 	 * <p>
@@ -342,62 +232,42 @@
 	public static final int ISNOTNULL_VALUE = 0;
 
 	/**
-	 * The '<em><b>Exists</b></em>' literal value.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of '<em><b>Exists</b></em>' literal object isn't clear,
-	 * there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * @see #EXISTS
-	 * @model name="exists"
-	 * @generated
-	 * @ordered
-	 */
-	public static final int EXISTS_VALUE = 0;
-
-	/**
-	 * An array of all the '<em><b>Condition And Operator1</b></em>' enumerators.
+	 * An array of all the '<em><b>Operator</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private static final ConditionAndOperator1[] VALUES_ARRAY =
-		new ConditionAndOperator1[] {
+	private static final Operator[] VALUES_ARRAY =
+		new Operator[] {
 			EQUALS,
 			NOTEQUALS,
 			GREATERTHEN,
 			GREATERTHENOREQUALTO,
 			LESSTHEN,
 			LESSTHENOREQUALTO,
-			IN,
-			BETWEEN,
-			LIKE,
-			NOT,
 			ISNULL,
 			ISNOTNULL,
-			EXISTS,
 		};
 
 	/**
-	 * A public read-only list of all the '<em><b>Condition And Operator1</b></em>' enumerators.
+	 * A public read-only list of all the '<em><b>Operator</b></em>' enumerators.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public static final List<ConditionAndOperator1> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
+	public static final List<Operator> VALUES = Collections.unmodifiableList(Arrays.asList(VALUES_ARRAY));
 
 	/**
-	 * Returns the '<em><b>Condition And Operator1</b></em>' literal with the specified literal value.
+	 * Returns the '<em><b>Operator</b></em>' literal with the specified literal value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param literal the literal.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator1 get(String literal) {
+	public static Operator get(String literal) {
 		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ConditionAndOperator1 result = VALUES_ARRAY[i];
+			Operator result = VALUES_ARRAY[i];
 			if (result.toString().equals(literal)) {
 				return result;
 			}
@@ -406,16 +276,16 @@
 	}
 
 	/**
-	 * Returns the '<em><b>Condition And Operator1</b></em>' literal with the specified name.
+	 * Returns the '<em><b>Operator</b></em>' literal with the specified name.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param name the name.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator1 getByName(String name) {
+	public static Operator getByName(String name) {
 		for (int i = 0; i < VALUES_ARRAY.length; ++i) {
-			ConditionAndOperator1 result = VALUES_ARRAY[i];
+			Operator result = VALUES_ARRAY[i];
 			if (result.getName().equals(name)) {
 				return result;
 			}
@@ -424,14 +294,14 @@
 	}
 
 	/**
-	 * Returns the '<em><b>Condition And Operator1</b></em>' literal with the specified integer value.
+	 * Returns the '<em><b>Operator</b></em>' literal with the specified integer value.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @param value the integer value.
 	 * @return the matching enumerator or <code>null</code>.
 	 * @generated
 	 */
-	public static ConditionAndOperator1 get(int value) {
+	public static Operator get(int value) {
 		switch (value) {
 			case EQUALS_VALUE: return EQUALS;
 		}
@@ -465,7 +335,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private ConditionAndOperator1(int value, String name, String literal) {
+	private Operator(int value, String name, String literal) {
 		this.value = value;
 		this.name = name;
 		this.literal = literal;
@@ -509,4 +379,4 @@
 		return literal;
 	}
 	
-} //ConditionAndOperator1
+} //Operator
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLFactoryImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLFactoryImpl.java
index 36d0ca9..1b1afb0 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLFactoryImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLFactoryImpl.java
@@ -80,6 +80,7 @@
 			case DataDSLPackage.DATA_INTERCHANGE_FILE_XML: return createDataInterchangeFileXML();
 			case DataDSLPackage.DATA_INTERCHANGE_FILE_CSV: return createDataInterchangeFileCSV();
 			case DataDSLPackage.DATA_INTERCHANGE_FILE_EDI: return createDataInterchangeFileEDI();
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED: return createDataInterchangeFileFixed();
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN: return createDataInterchangeBean();
 			case DataDSLPackage.DATA_INTERCHANGE_KEY: return createDataInterchangeKey();
 			case DataDSLPackage.DATA_INTERCHANGE_FORMAT: return createDataInterchangeFormat();
@@ -88,12 +89,16 @@
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP: return createDataInterchangeLookup();
 			case DataDSLPackage.DATA_INTERCHANGE_EXPOSE: return createDataInterchangeExpose();
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER: return createDataInterchangeExportFilter();
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION: return createDataInterchangeFilterCondition();
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION: return createDataInterchangeExportFilterCondition();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION: return createDataInterchangeLookupFilterCondition();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING: return createDataInterchangeLookupFilterOperandString();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY: return createDataInterchangeLookupFilterOperandProperty();
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_HIDE: return createDataInterchangeExportHide();
 			case DataDSLPackage.DATA_INTERCHANGE_MARKER_PATH: return createDataInterchangeMarkerPath();
 			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY: return createDataInterchangeMarkerEntity();
 			case DataDSLPackage.DATA_INTERCHANGE_VALUE_MAPPING: return createDataInterchangeValueMapping();
 			case DataDSLPackage.DATA_INTERCHANGE_BLOB_MAPPING: return createDataInterchangeBlobMapping();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING: return createDataInterchangeFixedColumnMapping();
 			default:
 				throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
 		}
@@ -115,10 +120,10 @@
 				return createPredefinedBeanTypeEnumFromString(eDataType, initialValue);
 			case DataDSLPackage.ENTITY_MANAGER_MODE:
 				return createEntityManagerModeFromString(eDataType, initialValue);
-			case DataDSLPackage.CONDITION_AND_OPERATOR1:
-				return createConditionAndOperator1FromString(eDataType, initialValue);
-			case DataDSLPackage.CONDITION_AND_OPERATOR2:
-				return createConditionAndOperator2FromString(eDataType, initialValue);
+			case DataDSLPackage.OPERATOR:
+				return createOperatorFromString(eDataType, initialValue);
+			case DataDSLPackage.JUNCTION:
+				return createJunctionFromString(eDataType, initialValue);
 			case DataDSLPackage.INTERNAL_EOBJECT:
 				return createInternalEObjectFromString(eDataType, initialValue);
 			default:
@@ -142,10 +147,10 @@
 				return convertPredefinedBeanTypeEnumToString(eDataType, instanceValue);
 			case DataDSLPackage.ENTITY_MANAGER_MODE:
 				return convertEntityManagerModeToString(eDataType, instanceValue);
-			case DataDSLPackage.CONDITION_AND_OPERATOR1:
-				return convertConditionAndOperator1ToString(eDataType, instanceValue);
-			case DataDSLPackage.CONDITION_AND_OPERATOR2:
-				return convertConditionAndOperator2ToString(eDataType, instanceValue);
+			case DataDSLPackage.OPERATOR:
+				return convertOperatorToString(eDataType, instanceValue);
+			case DataDSLPackage.JUNCTION:
+				return convertJunctionToString(eDataType, instanceValue);
 			case DataDSLPackage.INTERNAL_EOBJECT:
 				return convertInternalEObjectToString(eDataType, instanceValue);
 			default:
@@ -248,6 +253,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public DataInterchangeFileFixed createDataInterchangeFileFixed() {
+		DataInterchangeFileFixedImpl dataInterchangeFileFixed = new DataInterchangeFileFixedImpl();
+		return dataInterchangeFileFixed;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public DataInterchangeBean createDataInterchangeBean() {
 		DataInterchangeBeanImpl dataInterchangeBean = new DataInterchangeBeanImpl();
 		return dataInterchangeBean;
@@ -328,9 +343,39 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public DataInterchangeFilterCondition createDataInterchangeFilterCondition() {
-		DataInterchangeFilterConditionImpl dataInterchangeFilterCondition = new DataInterchangeFilterConditionImpl();
-		return dataInterchangeFilterCondition;
+	public DataInterchangeExportFilterCondition createDataInterchangeExportFilterCondition() {
+		DataInterchangeExportFilterConditionImpl dataInterchangeExportFilterCondition = new DataInterchangeExportFilterConditionImpl();
+		return dataInterchangeExportFilterCondition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataInterchangeLookupFilterCondition createDataInterchangeLookupFilterCondition() {
+		DataInterchangeLookupFilterConditionImpl dataInterchangeLookupFilterCondition = new DataInterchangeLookupFilterConditionImpl();
+		return dataInterchangeLookupFilterCondition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataInterchangeLookupFilterOperandString createDataInterchangeLookupFilterOperandString() {
+		DataInterchangeLookupFilterOperandStringImpl dataInterchangeLookupFilterOperandString = new DataInterchangeLookupFilterOperandStringImpl();
+		return dataInterchangeLookupFilterOperandString;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataInterchangeLookupFilterOperandProperty createDataInterchangeLookupFilterOperandProperty() {
+		DataInterchangeLookupFilterOperandPropertyImpl dataInterchangeLookupFilterOperandProperty = new DataInterchangeLookupFilterOperandPropertyImpl();
+		return dataInterchangeLookupFilterOperandProperty;
 	}
 
 	/**
@@ -388,6 +433,16 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public DataInterchangeFixedColumnMapping createDataInterchangeFixedColumnMapping() {
+		DataInterchangeFixedColumnMappingImpl dataInterchangeFixedColumnMapping = new DataInterchangeFixedColumnMappingImpl();
+		return dataInterchangeFixedColumnMapping;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public PredefinedBlobMimeTypeEnum createPredefinedBlobMimeTypeEnumFromString(EDataType eDataType, String initialValue) {
 		PredefinedBlobMimeTypeEnum result = PredefinedBlobMimeTypeEnum.get(initialValue);
 		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
@@ -468,8 +523,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public ConditionAndOperator1 createConditionAndOperator1FromString(EDataType eDataType, String initialValue) {
-		ConditionAndOperator1 result = ConditionAndOperator1.get(initialValue);
+	public Operator createOperatorFromString(EDataType eDataType, String initialValue) {
+		Operator result = Operator.get(initialValue);
 		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
 		return result;
 	}
@@ -479,7 +534,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public String convertConditionAndOperator1ToString(EDataType eDataType, Object instanceValue) {
+	public String convertOperatorToString(EDataType eDataType, Object instanceValue) {
 		return instanceValue == null ? null : instanceValue.toString();
 	}
 
@@ -488,8 +543,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public ConditionAndOperator2 createConditionAndOperator2FromString(EDataType eDataType, String initialValue) {
-		ConditionAndOperator2 result = ConditionAndOperator2.get(initialValue);
+	public Junction createJunctionFromString(EDataType eDataType, String initialValue) {
+		Junction result = Junction.get(initialValue);
 		if (result == null) throw new IllegalArgumentException("The value '" + initialValue + "' is not a valid enumerator of '" + eDataType.getName() + "'");
 		return result;
 	}
@@ -499,7 +554,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public String convertConditionAndOperator2ToString(EDataType eDataType, Object instanceValue) {
+	public String convertJunctionToString(EDataType eDataType, Object instanceValue) {
 		return instanceValue == null ? null : instanceValue.toString();
 	}
 
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLPackageImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLPackageImpl.java
index a626166..e83b38d 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLPackageImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataDSLPackageImpl.java
@@ -31,8 +31,6 @@
 
 import org.eclipse.osbp.dsl.semantic.entity.OSBPEntityPackage;
 
-import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1;
-import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2;
 import org.eclipse.osbp.xtext.datainterchange.DataDSLFactory;
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchange;
@@ -41,19 +39,25 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBlobMapping;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeEntityExpression;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpose;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpression;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFile;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFormat;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeKey;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLazyResolver;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMapping;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerPath;
@@ -62,6 +66,8 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangePredefinedExpression;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeValueMapping;
 import org.eclipse.osbp.xtext.datainterchange.EntityManagerMode;
+import org.eclipse.osbp.xtext.datainterchange.Junction;
+import org.eclipse.osbp.xtext.datainterchange.Operator;
 import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanEnum;
 import org.eclipse.osbp.xtext.datainterchange.PredefinedBeanTypeEnum;
 import org.eclipse.osbp.xtext.datainterchange.PredefinedBlobMimeTypeEnum;
@@ -150,6 +156,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass dataInterchangeFileFixedEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass dataInterchangeBeanEClass = null;
 
 	/**
@@ -213,7 +226,35 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EClass dataInterchangeFilterConditionEClass = null;
+	private EClass dataInterchangeExportFilterConditionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataInterchangeLookupFilterConditionEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataInterchangeLookupFilterOperandEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataInterchangeLookupFilterOperandStringEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass dataInterchangeLookupFilterOperandPropertyEClass = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -262,6 +303,13 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass dataInterchangeFixedColumnMappingEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EEnum predefinedBlobMimeTypeEnumEEnum = null;
 
 	/**
@@ -290,14 +338,14 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EEnum conditionAndOperator1EEnum = null;
+	private EEnum operatorEEnum = null;
 
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	private EEnum conditionAndOperator2EEnum = null;
+	private EEnum junctionEEnum = null;
 
 	/**
 	 * <!-- begin-user-doc -->
@@ -717,6 +765,24 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EClass getDataInterchangeFileFixed() {
+		return dataInterchangeFileFixedEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFileFixed_FileURL() {
+		return (EAttribute)dataInterchangeFileFixedEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getDataInterchangeBean() {
 		return dataInterchangeBeanEClass;
 	}
@@ -735,8 +801,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeBean_MarkLatestImport() {
-		return (EAttribute)dataInterchangeBeanEClass.getEStructuralFeatures().get(1);
+	public EReference getDataInterchangeBean_RefDataSource() {
+		return (EReference)dataInterchangeBeanEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -744,7 +810,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeBean_MarkLatestExport() {
+	public EAttribute getDataInterchangeBean_MarkLatestImport() {
 		return (EAttribute)dataInterchangeBeanEClass.getEStructuralFeatures().get(2);
 	}
 
@@ -753,7 +819,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeBean_HasBlobMapping() {
+	public EAttribute getDataInterchangeBean_MarkLatestExport() {
 		return (EAttribute)dataInterchangeBeanEClass.getEStructuralFeatures().get(3);
 	}
 
@@ -1077,6 +1143,15 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EReference getDataInterchangeLookup_Condition() {
+		return (EReference)dataInterchangeLookupEClass.getEStructuralFeatures().get(10);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getDataInterchangeExpose() {
 		return dataInterchangeExposeEClass;
 	}
@@ -1140,8 +1215,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EClass getDataInterchangeFilterCondition() {
-		return dataInterchangeFilterConditionEClass;
+	public EClass getDataInterchangeExportFilterCondition() {
+		return dataInterchangeExportFilterConditionEClass;
 	}
 
 	/**
@@ -1149,8 +1224,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getDataInterchangeFilterCondition_RefProperty() {
-		return (EReference)dataInterchangeFilterConditionEClass.getEStructuralFeatures().get(0);
+	public EReference getDataInterchangeExportFilterCondition_RefProperty() {
+		return (EReference)dataInterchangeExportFilterConditionEClass.getEStructuralFeatures().get(0);
 	}
 
 	/**
@@ -1158,8 +1233,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeFilterCondition_Operator() {
-		return (EAttribute)dataInterchangeFilterConditionEClass.getEStructuralFeatures().get(1);
+	public EAttribute getDataInterchangeExportFilterCondition_Operator() {
+		return (EAttribute)dataInterchangeExportFilterConditionEClass.getEStructuralFeatures().get(1);
 	}
 
 	/**
@@ -1167,8 +1242,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeFilterCondition_Value() {
-		return (EAttribute)dataInterchangeFilterConditionEClass.getEStructuralFeatures().get(2);
+	public EAttribute getDataInterchangeExportFilterCondition_Value() {
+		return (EAttribute)dataInterchangeExportFilterConditionEClass.getEStructuralFeatures().get(2);
 	}
 
 	/**
@@ -1176,8 +1251,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EAttribute getDataInterchangeFilterCondition_Operator2() {
-		return (EAttribute)dataInterchangeFilterConditionEClass.getEStructuralFeatures().get(3);
+	public EAttribute getDataInterchangeExportFilterCondition_Operator2() {
+		return (EAttribute)dataInterchangeExportFilterConditionEClass.getEStructuralFeatures().get(3);
 	}
 
 	/**
@@ -1185,8 +1260,107 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getDataInterchangeFilterCondition_Subcondition() {
-		return (EReference)dataInterchangeFilterConditionEClass.getEStructuralFeatures().get(4);
+	public EReference getDataInterchangeExportFilterCondition_Subcondition() {
+		return (EReference)dataInterchangeExportFilterConditionEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataInterchangeLookupFilterCondition() {
+		return dataInterchangeLookupFilterConditionEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataInterchangeLookupFilterCondition_RefProperty() {
+		return (EReference)dataInterchangeLookupFilterConditionEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeLookupFilterCondition_Operator() {
+		return (EAttribute)dataInterchangeLookupFilterConditionEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataInterchangeLookupFilterCondition_Operand() {
+		return (EReference)dataInterchangeLookupFilterConditionEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeLookupFilterCondition_Operator2() {
+		return (EAttribute)dataInterchangeLookupFilterConditionEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataInterchangeLookupFilterCondition_Subcondition() {
+		return (EReference)dataInterchangeLookupFilterConditionEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataInterchangeLookupFilterOperand() {
+		return dataInterchangeLookupFilterOperandEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataInterchangeLookupFilterOperandString() {
+		return dataInterchangeLookupFilterOperandStringEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeLookupFilterOperandString_Value() {
+		return (EAttribute)dataInterchangeLookupFilterOperandStringEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getDataInterchangeLookupFilterOperandProperty() {
+		return dataInterchangeLookupFilterOperandPropertyEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getDataInterchangeLookupFilterOperandProperty_RefProperty() {
+		return (EReference)dataInterchangeLookupFilterOperandPropertyEClass.getEStructuralFeatures().get(0);
 	}
 
 	/**
@@ -1338,6 +1512,96 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EClass getDataInterchangeFixedColumnMapping() {
+		return dataInterchangeFixedColumnMappingEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_Length() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_Trim() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_LeftTrim() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_RightTrim() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(3);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_UpperCase() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(4);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_LowerCase() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(5);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_CapFirst() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(6);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_UncapFirst() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(7);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getDataInterchangeFixedColumnMapping_Capitalize() {
+		return (EAttribute)dataInterchangeFixedColumnMappingEClass.getEStructuralFeatures().get(8);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EEnum getPredefinedBlobMimeTypeEnum() {
 		return predefinedBlobMimeTypeEnumEEnum;
 	}
@@ -1374,8 +1638,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EEnum getConditionAndOperator1() {
-		return conditionAndOperator1EEnum;
+	public EEnum getOperator() {
+		return operatorEEnum;
 	}
 
 	/**
@@ -1383,8 +1647,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EEnum getConditionAndOperator2() {
-		return conditionAndOperator2EEnum;
+	public EEnum getJunction() {
+		return junctionEEnum;
 	}
 
 	/**
@@ -1472,11 +1736,14 @@
 		createEAttribute(dataInterchangeFileEDIEClass, DATA_INTERCHANGE_FILE_EDI__MAPPING_MODEL);
 		createEAttribute(dataInterchangeFileEDIEClass, DATA_INTERCHANGE_FILE_EDI__VALIDATE);
 
+		dataInterchangeFileFixedEClass = createEClass(DATA_INTERCHANGE_FILE_FIXED);
+		createEAttribute(dataInterchangeFileFixedEClass, DATA_INTERCHANGE_FILE_FIXED__FILE_URL);
+
 		dataInterchangeBeanEClass = createEClass(DATA_INTERCHANGE_BEAN);
 		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__ENTITY);
+		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE);
 		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT);
 		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT);
-		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING);
 		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LATEST_PROPERTY);
 		createEReference(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__LATEST_EXP_PROPERTY);
 		createEAttribute(dataInterchangeBeanEClass, DATA_INTERCHANGE_BEAN__ELEMENT_MAP);
@@ -1518,6 +1785,7 @@
 		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__CACHED);
 		createEAttribute(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__CACHE_SIZE);
 		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__MARKER_PATH);
+		createEReference(dataInterchangeLookupEClass, DATA_INTERCHANGE_LOOKUP__CONDITION);
 
 		dataInterchangeExposeEClass = createEClass(DATA_INTERCHANGE_EXPOSE);
 		createEReference(dataInterchangeExposeEClass, DATA_INTERCHANGE_EXPOSE__REF_ENTITY);
@@ -1528,12 +1796,27 @@
 		createEReference(dataInterchangeExportFilterEClass, DATA_INTERCHANGE_EXPORT_FILTER__CONDITION);
 		createEReference(dataInterchangeExportFilterEClass, DATA_INTERCHANGE_EXPORT_FILTER__HIDDENPROPERTIES);
 
-		dataInterchangeFilterConditionEClass = createEClass(DATA_INTERCHANGE_FILTER_CONDITION);
-		createEReference(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY);
-		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR);
-		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__VALUE);
-		createEAttribute(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2);
-		createEReference(dataInterchangeFilterConditionEClass, DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION);
+		dataInterchangeExportFilterConditionEClass = createEClass(DATA_INTERCHANGE_EXPORT_FILTER_CONDITION);
+		createEReference(dataInterchangeExportFilterConditionEClass, DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY);
+		createEAttribute(dataInterchangeExportFilterConditionEClass, DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR);
+		createEAttribute(dataInterchangeExportFilterConditionEClass, DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE);
+		createEAttribute(dataInterchangeExportFilterConditionEClass, DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2);
+		createEReference(dataInterchangeExportFilterConditionEClass, DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION);
+
+		dataInterchangeLookupFilterConditionEClass = createEClass(DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION);
+		createEReference(dataInterchangeLookupFilterConditionEClass, DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY);
+		createEAttribute(dataInterchangeLookupFilterConditionEClass, DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR);
+		createEReference(dataInterchangeLookupFilterConditionEClass, DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND);
+		createEAttribute(dataInterchangeLookupFilterConditionEClass, DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2);
+		createEReference(dataInterchangeLookupFilterConditionEClass, DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION);
+
+		dataInterchangeLookupFilterOperandEClass = createEClass(DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND);
+
+		dataInterchangeLookupFilterOperandStringEClass = createEClass(DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING);
+		createEAttribute(dataInterchangeLookupFilterOperandStringEClass, DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE);
+
+		dataInterchangeLookupFilterOperandPropertyEClass = createEClass(DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY);
+		createEReference(dataInterchangeLookupFilterOperandPropertyEClass, DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY);
 
 		dataInterchangeExportHideEClass = createEClass(DATA_INTERCHANGE_EXPORT_HIDE);
 		createEReference(dataInterchangeExportHideEClass, DATA_INTERCHANGE_EXPORT_HIDE__PROPERTY);
@@ -1557,13 +1840,24 @@
 		createEAttribute(dataInterchangeBlobMappingEClass, DATA_INTERCHANGE_BLOB_MAPPING__BLOB_PATH);
 		createEAttribute(dataInterchangeBlobMappingEClass, DATA_INTERCHANGE_BLOB_MAPPING__MIME_TYPE);
 
+		dataInterchangeFixedColumnMappingEClass = createEClass(DATA_INTERCHANGE_FIXED_COLUMN_MAPPING);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST);
+		createEAttribute(dataInterchangeFixedColumnMappingEClass, DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE);
+
 		// Create enums
 		predefinedBlobMimeTypeEnumEEnum = createEEnum(PREDEFINED_BLOB_MIME_TYPE_ENUM);
 		predefinedBeanEnumEEnum = createEEnum(PREDEFINED_BEAN_ENUM);
 		predefinedBeanTypeEnumEEnum = createEEnum(PREDEFINED_BEAN_TYPE_ENUM);
 		entityManagerModeEEnum = createEEnum(ENTITY_MANAGER_MODE);
-		conditionAndOperator1EEnum = createEEnum(CONDITION_AND_OPERATOR1);
-		conditionAndOperator2EEnum = createEEnum(CONDITION_AND_OPERATOR2);
+		operatorEEnum = createEEnum(OPERATOR);
+		junctionEEnum = createEEnum(JUNCTION);
 
 		// Create data types
 		internalEObjectEDataType = createEDataType(INTERNAL_EOBJECT);
@@ -1611,6 +1905,7 @@
 		dataInterchangeFileXMLEClass.getESuperTypes().add(this.getDataInterchangeFile());
 		dataInterchangeFileCSVEClass.getESuperTypes().add(this.getDataInterchangeFile());
 		dataInterchangeFileEDIEClass.getESuperTypes().add(this.getDataInterchangeFile());
+		dataInterchangeFileFixedEClass.getESuperTypes().add(this.getDataInterchangeFile());
 		dataInterchangeBeanEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeKeyEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeFormatEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
@@ -1620,13 +1915,18 @@
 		dataInterchangeLookupEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeExposeEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeExportFilterEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
-		dataInterchangeFilterConditionEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
+		dataInterchangeExportFilterConditionEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
+		dataInterchangeLookupFilterConditionEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
+		dataInterchangeLookupFilterOperandEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
+		dataInterchangeLookupFilterOperandStringEClass.getESuperTypes().add(this.getDataInterchangeLookupFilterOperand());
+		dataInterchangeLookupFilterOperandPropertyEClass.getESuperTypes().add(this.getDataInterchangeLookupFilterOperand());
 		dataInterchangeExportHideEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeMarkerPathEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeMarkerEntityEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeMappingEClass.getESuperTypes().add(this.getDataInterchangeLazyResolver());
 		dataInterchangeValueMappingEClass.getESuperTypes().add(this.getDataInterchangeMapping());
 		dataInterchangeBlobMappingEClass.getESuperTypes().add(this.getDataInterchangeMapping());
+		dataInterchangeFixedColumnMappingEClass.getESuperTypes().add(this.getDataInterchangeMapping());
 
 		// Initialize classes, features, and operations; add parameters
 		initEClass(dataInterchangeModelEClass, DataInterchangeModel.class, "DataInterchangeModel", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
@@ -1679,11 +1979,14 @@
 		initEAttribute(getDataInterchangeFileEDI_MappingModel(), theEcorePackage.getEString(), "mappingModel", null, 0, 1, DataInterchangeFileEDI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeFileEDI_Validate(), theEcorePackage.getEBoolean(), "validate", null, 0, 1, DataInterchangeFileEDI.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(dataInterchangeFileFixedEClass, DataInterchangeFileFixed.class, "DataInterchangeFileFixed", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getDataInterchangeFileFixed_FileURL(), theEcorePackage.getEString(), "fileURL", null, 0, 1, DataInterchangeFileFixed.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
 		initEClass(dataInterchangeBeanEClass, DataInterchangeBean.class, "DataInterchangeBean", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getDataInterchangeBean_Entity(), theOSBPEntityPackage.getLEntity(), null, "entity", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeBean_RefDataSource(), theOSBPEntityPackage.getLEntityFeature(), null, "refDataSource", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeBean_MarkLatestImport(), theEcorePackage.getEBoolean(), "markLatestImport", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeBean_MarkLatestExport(), theEcorePackage.getEBoolean(), "markLatestExport", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDataInterchangeBean_HasBlobMapping(), theEcorePackage.getEBoolean(), "hasBlobMapping", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getDataInterchangeBean_LatestProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "latestProperty", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getDataInterchangeBean_LatestExpProperty(), theOSBPEntityPackage.getLEntityAttribute(), null, "latestExpProperty", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeBean_ElementMap(), theEcorePackage.getEString(), "elementMap", null, 0, 1, DataInterchangeBean.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -1725,6 +2028,7 @@
 		initEAttribute(getDataInterchangeLookup_Cached(), theEcorePackage.getEBoolean(), "cached", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeLookup_CacheSize(), theEcorePackage.getEInt(), "cacheSize", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getDataInterchangeLookup_MarkerPath(), this.getDataInterchangeMarkerPath(), null, "markerPath", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeLookup_Condition(), this.getDataInterchangeLookupFilterCondition(), null, "condition", null, 0, 1, DataInterchangeLookup.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(dataInterchangeExposeEClass, DataInterchangeExpose.class, "DataInterchangeExpose", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getDataInterchangeExpose_RefEntity(), theOSBPEntityPackage.getLEntityReference(), null, "refEntity", null, 0, 1, DataInterchangeExpose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -1732,15 +2036,30 @@
 		initEReference(getDataInterchangeExpose_SubExpose(), this.getDataInterchangeExpose(), null, "subExpose", null, 0, 1, DataInterchangeExpose.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(dataInterchangeExportFilterEClass, DataInterchangeExportFilter.class, "DataInterchangeExportFilter", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDataInterchangeExportFilter_Condition(), this.getDataInterchangeFilterCondition(), null, "condition", null, 0, 1, DataInterchangeExportFilter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeExportFilter_Condition(), this.getDataInterchangeExportFilterCondition(), null, "condition", null, 0, 1, DataInterchangeExportFilter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEReference(getDataInterchangeExportFilter_Hiddenproperties(), this.getDataInterchangeExportHide(), null, "hiddenproperties", null, 0, -1, DataInterchangeExportFilter.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
-		initEClass(dataInterchangeFilterConditionEClass, DataInterchangeFilterCondition.class, "DataInterchangeFilterCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDataInterchangeFilterCondition_RefProperty(), theOSBPEntityPackage.getLEntityFeature(), null, "refProperty", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDataInterchangeFilterCondition_Operator(), this.getConditionAndOperator1(), "operator", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDataInterchangeFilterCondition_Value(), theEcorePackage.getEString(), "value", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getDataInterchangeFilterCondition_Operator2(), this.getConditionAndOperator2(), "operator2", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getDataInterchangeFilterCondition_Subcondition(), this.getDataInterchangeFilterCondition(), null, "subcondition", null, 0, 1, DataInterchangeFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEClass(dataInterchangeExportFilterConditionEClass, DataInterchangeExportFilterCondition.class, "DataInterchangeExportFilterCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataInterchangeExportFilterCondition_RefProperty(), theOSBPEntityPackage.getLEntityFeature(), null, "refProperty", null, 0, 1, DataInterchangeExportFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeExportFilterCondition_Operator(), this.getOperator(), "operator", null, 0, 1, DataInterchangeExportFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeExportFilterCondition_Value(), theEcorePackage.getEString(), "value", null, 0, 1, DataInterchangeExportFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeExportFilterCondition_Operator2(), this.getJunction(), "operator2", null, 0, 1, DataInterchangeExportFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeExportFilterCondition_Subcondition(), this.getDataInterchangeExportFilterCondition(), null, "subcondition", null, 0, 1, DataInterchangeExportFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(dataInterchangeLookupFilterConditionEClass, DataInterchangeLookupFilterCondition.class, "DataInterchangeLookupFilterCondition", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataInterchangeLookupFilterCondition_RefProperty(), theOSBPEntityPackage.getLEntityFeature(), null, "refProperty", null, 0, 1, DataInterchangeLookupFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeLookupFilterCondition_Operator(), this.getOperator(), "operator", null, 0, 1, DataInterchangeLookupFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeLookupFilterCondition_Operand(), this.getDataInterchangeLookupFilterOperand(), null, "operand", null, 0, 1, DataInterchangeLookupFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeLookupFilterCondition_Operator2(), this.getJunction(), "operator2", null, 0, 1, DataInterchangeLookupFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEReference(getDataInterchangeLookupFilterCondition_Subcondition(), this.getDataInterchangeLookupFilterCondition(), null, "subcondition", null, 0, 1, DataInterchangeLookupFilterCondition.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(dataInterchangeLookupFilterOperandEClass, DataInterchangeLookupFilterOperand.class, "DataInterchangeLookupFilterOperand", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+
+		initEClass(dataInterchangeLookupFilterOperandStringEClass, DataInterchangeLookupFilterOperandString.class, "DataInterchangeLookupFilterOperandString", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getDataInterchangeLookupFilterOperandString_Value(), theEcorePackage.getEString(), "value", null, 0, 1, DataInterchangeLookupFilterOperandString.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
+		initEClass(dataInterchangeLookupFilterOperandPropertyEClass, DataInterchangeLookupFilterOperandProperty.class, "DataInterchangeLookupFilterOperandProperty", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEReference(getDataInterchangeLookupFilterOperandProperty_RefProperty(), theOSBPEntityPackage.getLEntityFeature(), null, "refProperty", null, 0, 1, DataInterchangeLookupFilterOperandProperty.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(dataInterchangeExportHideEClass, DataInterchangeExportHide.class, "DataInterchangeExportHide", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
 		initEReference(getDataInterchangeExportHide_Property(), theOSBPEntityPackage.getLEntityFeature(), null, "property", null, 0, 1, DataInterchangeExportHide.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
@@ -1764,6 +2083,17 @@
 		initEAttribute(getDataInterchangeBlobMapping_BlobPath(), theEcorePackage.getEString(), "blobPath", null, 0, 1, DataInterchangeBlobMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 		initEAttribute(getDataInterchangeBlobMapping_MimeType(), this.getPredefinedBlobMimeTypeEnum(), "mimeType", null, 0, 1, DataInterchangeBlobMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
+		initEClass(dataInterchangeFixedColumnMappingEClass, DataInterchangeFixedColumnMapping.class, "DataInterchangeFixedColumnMapping", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
+		initEAttribute(getDataInterchangeFixedColumnMapping_Length(), theEcorePackage.getEInt(), "length", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_Trim(), theEcorePackage.getEBoolean(), "trim", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_LeftTrim(), theEcorePackage.getEBoolean(), "leftTrim", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_RightTrim(), theEcorePackage.getEBoolean(), "rightTrim", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_UpperCase(), theEcorePackage.getEBoolean(), "upperCase", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_LowerCase(), theEcorePackage.getEBoolean(), "lowerCase", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_CapFirst(), theEcorePackage.getEBoolean(), "capFirst", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_UncapFirst(), theEcorePackage.getEBoolean(), "uncapFirst", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+		initEAttribute(getDataInterchangeFixedColumnMapping_Capitalize(), theEcorePackage.getEBoolean(), "capitalize", null, 0, 1, DataInterchangeFixedColumnMapping.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, !IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.class, "PredefinedBlobMimeTypeEnum");
 		addEEnumLiteral(predefinedBlobMimeTypeEnumEEnum, PredefinedBlobMimeTypeEnum.PLAIN);
@@ -1790,24 +2120,19 @@
 		addEEnumLiteral(entityManagerModeEEnum, EntityManagerMode.MERGE);
 		addEEnumLiteral(entityManagerModeEEnum, EntityManagerMode.REMOVE);
 
-		initEEnum(conditionAndOperator1EEnum, ConditionAndOperator1.class, "ConditionAndOperator1");
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.EQUALS);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.NOTEQUALS);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.GREATERTHEN);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.GREATERTHENOREQUALTO);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LESSTHEN);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LESSTHENOREQUALTO);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.IN);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.BETWEEN);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.LIKE);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.NOT);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.ISNULL);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.ISNOTNULL);
-		addEEnumLiteral(conditionAndOperator1EEnum, ConditionAndOperator1.EXISTS);
+		initEEnum(operatorEEnum, Operator.class, "Operator");
+		addEEnumLiteral(operatorEEnum, Operator.EQUALS);
+		addEEnumLiteral(operatorEEnum, Operator.NOTEQUALS);
+		addEEnumLiteral(operatorEEnum, Operator.GREATERTHEN);
+		addEEnumLiteral(operatorEEnum, Operator.GREATERTHENOREQUALTO);
+		addEEnumLiteral(operatorEEnum, Operator.LESSTHEN);
+		addEEnumLiteral(operatorEEnum, Operator.LESSTHENOREQUALTO);
+		addEEnumLiteral(operatorEEnum, Operator.ISNULL);
+		addEEnumLiteral(operatorEEnum, Operator.ISNOTNULL);
 
-		initEEnum(conditionAndOperator2EEnum, ConditionAndOperator2.class, "ConditionAndOperator2");
-		addEEnumLiteral(conditionAndOperator2EEnum, ConditionAndOperator2.AND);
-		addEEnumLiteral(conditionAndOperator2EEnum, ConditionAndOperator2.OR);
+		initEEnum(junctionEEnum, Junction.class, "Junction");
+		addEEnumLiteral(junctionEEnum, Junction.AND);
+		addEEnumLiteral(junctionEEnum, Junction.OR);
 
 		// Initialize data types
 		initEDataType(internalEObjectEDataType, InternalEObject.class, "InternalEObject", IS_SERIALIZABLE, !IS_GENERATED_INSTANCE_CLASS);
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeBeanImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeBeanImpl.java
index 2cbee54..c40b5e4 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeBeanImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeBeanImpl.java
@@ -32,6 +32,7 @@
 
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
 
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean;
@@ -52,9 +53,9 @@
  * </p>
  * <ul>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#getEntity <em>Entity</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#getRefDataSource <em>Ref Data Source</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#isMarkLatestImport <em>Mark Latest Import</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#isMarkLatestExport <em>Mark Latest Export</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#isHasBlobMapping <em>Has Blob Mapping</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#getLatestProperty <em>Latest Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#getLatestExpProperty <em>Latest Exp Property</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeBeanImpl#getElementMap <em>Element Map</em>}</li>
@@ -82,6 +83,16 @@
 	protected LEntity entity;
 
 	/**
+	 * The cached value of the '{@link #getRefDataSource() <em>Ref Data Source</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRefDataSource()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityFeature refDataSource;
+
+	/**
 	 * The default value of the '{@link #isMarkLatestImport() <em>Mark Latest Import</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -122,26 +133,6 @@
 	protected boolean markLatestExport = MARK_LATEST_EXPORT_EDEFAULT;
 
 	/**
-	 * The default value of the '{@link #isHasBlobMapping() <em>Has Blob Mapping</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasBlobMapping()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean HAS_BLOB_MAPPING_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isHasBlobMapping() <em>Has Blob Mapping</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #isHasBlobMapping()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean hasBlobMapping = HAS_BLOB_MAPPING_EDEFAULT;
-
-	/**
 	 * The cached value of the '{@link #getLatestProperty() <em>Latest Property</em>}' reference.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -333,6 +324,44 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public LEntityFeature getRefDataSource() {
+		if (refDataSource != null && refDataSource.eIsProxy()) {
+			InternalEObject oldRefDataSource = (InternalEObject)refDataSource;
+			refDataSource = (LEntityFeature)eResolveProxy(oldRefDataSource);
+			if (refDataSource != oldRefDataSource) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE, oldRefDataSource, refDataSource));
+			}
+		}
+		return refDataSource;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityFeature basicGetRefDataSource() {
+		return refDataSource;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRefDataSource(LEntityFeature newRefDataSource) {
+		LEntityFeature oldRefDataSource = refDataSource;
+		refDataSource = newRefDataSource;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE, oldRefDataSource, refDataSource));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public boolean isMarkLatestImport() {
 		return markLatestImport;
 	}
@@ -375,27 +404,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public boolean isHasBlobMapping() {
-		return hasBlobMapping;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
-	public void setHasBlobMapping(boolean newHasBlobMapping) {
-		boolean oldHasBlobMapping = hasBlobMapping;
-		hasBlobMapping = newHasBlobMapping;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING, oldHasBlobMapping, hasBlobMapping));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public LEntityAttribute getLatestProperty() {
 		if (latestProperty != null && latestProperty.eIsProxy()) {
 			InternalEObject oldLatestProperty = (InternalEObject)latestProperty;
@@ -661,12 +669,13 @@
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__ENTITY:
 				if (resolve) return getEntity();
 				return basicGetEntity();
+			case DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE:
+				if (resolve) return getRefDataSource();
+				return basicGetRefDataSource();
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT:
 				return isMarkLatestImport();
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT:
 				return isMarkLatestExport();
-			case DataDSLPackage.DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING:
-				return isHasBlobMapping();
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY:
 				if (resolve) return getLatestProperty();
 				return basicGetLatestProperty();
@@ -707,15 +716,15 @@
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__ENTITY:
 				setEntity((LEntity)newValue);
 				return;
+			case DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE:
+				setRefDataSource((LEntityFeature)newValue);
+				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT:
 				setMarkLatestImport((Boolean)newValue);
 				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT:
 				setMarkLatestExport((Boolean)newValue);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING:
-				setHasBlobMapping((Boolean)newValue);
-				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY:
 				setLatestProperty((LEntityAttribute)newValue);
 				return;
@@ -770,15 +779,15 @@
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__ENTITY:
 				setEntity((LEntity)null);
 				return;
+			case DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE:
+				setRefDataSource((LEntityFeature)null);
+				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT:
 				setMarkLatestImport(MARK_LATEST_IMPORT_EDEFAULT);
 				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT:
 				setMarkLatestExport(MARK_LATEST_EXPORT_EDEFAULT);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING:
-				setHasBlobMapping(HAS_BLOB_MAPPING_EDEFAULT);
-				return;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY:
 				setLatestProperty((LEntityAttribute)null);
 				return;
@@ -826,12 +835,12 @@
 		switch (featureID) {
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__ENTITY:
 				return entity != null;
+			case DataDSLPackage.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE:
+				return refDataSource != null;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_IMPORT:
 				return markLatestImport != MARK_LATEST_IMPORT_EDEFAULT;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__MARK_LATEST_EXPORT:
 				return markLatestExport != MARK_LATEST_EXPORT_EDEFAULT;
-			case DataDSLPackage.DATA_INTERCHANGE_BEAN__HAS_BLOB_MAPPING:
-				return hasBlobMapping != HAS_BLOB_MAPPING_EDEFAULT;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY:
 				return latestProperty != null;
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN__LATEST_EXP_PROPERTY:
@@ -872,8 +881,6 @@
 		result.append(markLatestImport);
 		result.append(", markLatestExport: ");
 		result.append(markLatestExport);
-		result.append(", hasBlobMapping: ");
-		result.append(hasBlobMapping);
 		result.append(", elementMap: ");
 		result.append(elementMap);
 		result.append(", nodeName: ");
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFilterConditionImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterConditionImpl.java
similarity index 66%
rename from org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFilterConditionImpl.java
rename to org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterConditionImpl.java
index 0742939..a9b2434 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFilterConditionImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterConditionImpl.java
@@ -25,29 +25,29 @@
 
 import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
 
-import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1;
-import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator2;
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.Junction;
+import org.eclipse.osbp.xtext.datainterchange.Operator;
 
 /**
  * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Data Interchange Filter Condition</b></em>'.
+ * An implementation of the model object '<em><b>Data Interchange Export Filter Condition</b></em>'.
  * <!-- end-user-doc -->
  * <p>
  * The following features are implemented:
  * </p>
  * <ul>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl#getRefProperty <em>Ref Property</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl#getOperator <em>Operator</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl#getValue <em>Value</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl#getOperator2 <em>Operator2</em>}</li>
- *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFilterConditionImpl#getSubcondition <em>Subcondition</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl#getRefProperty <em>Ref Property</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl#getValue <em>Value</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl#getOperator2 <em>Operator2</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeExportFilterConditionImpl#getSubcondition <em>Subcondition</em>}</li>
  * </ul>
  *
  * @generated
  */
-public class DataInterchangeFilterConditionImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeFilterCondition {
+public class DataInterchangeExportFilterConditionImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeExportFilterCondition {
 	/**
 	 * The cached value of the '{@link #getRefProperty() <em>Ref Property</em>}' reference.
 	 * <!-- begin-user-doc -->
@@ -66,7 +66,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final ConditionAndOperator1 OPERATOR_EDEFAULT = ConditionAndOperator1.EQUALS;
+	protected static final Operator OPERATOR_EDEFAULT = Operator.EQUALS;
 
 	/**
 	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
@@ -76,7 +76,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected ConditionAndOperator1 operator = OPERATOR_EDEFAULT;
+	protected Operator operator = OPERATOR_EDEFAULT;
 
 	/**
 	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
@@ -106,7 +106,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected static final ConditionAndOperator2 OPERATOR2_EDEFAULT = ConditionAndOperator2.AND;
+	protected static final Junction OPERATOR2_EDEFAULT = Junction.AND;
 
 	/**
 	 * The cached value of the '{@link #getOperator2() <em>Operator2</em>}' attribute.
@@ -116,7 +116,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected ConditionAndOperator2 operator2 = OPERATOR2_EDEFAULT;
+	protected Junction operator2 = OPERATOR2_EDEFAULT;
 
 	/**
 	 * The cached value of the '{@link #getSubcondition() <em>Subcondition</em>}' containment reference.
@@ -126,14 +126,14 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected DataInterchangeFilterCondition subcondition;
+	protected DataInterchangeExportFilterCondition subcondition;
 
 	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	protected DataInterchangeFilterConditionImpl() {
+	protected DataInterchangeExportFilterConditionImpl() {
 		super();
 	}
 
@@ -144,7 +144,7 @@
 	 */
 	@Override
 	protected EClass eStaticClass() {
-		return DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION;
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION;
 	}
 
 	/**
@@ -158,7 +158,7 @@
 			refProperty = (LEntityFeature)eResolveProxy(oldRefProperty);
 			if (refProperty != oldRefProperty) {
 				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
 			}
 		}
 		return refProperty;
@@ -182,7 +182,7 @@
 		LEntityFeature oldRefProperty = refProperty;
 		refProperty = newRefProperty;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
 	}
 
 	/**
@@ -190,7 +190,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public ConditionAndOperator1 getOperator() {
+	public Operator getOperator() {
 		return operator;
 	}
 
@@ -199,11 +199,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setOperator(ConditionAndOperator1 newOperator) {
-		ConditionAndOperator1 oldOperator = operator;
+	public void setOperator(Operator newOperator) {
+		Operator oldOperator = operator;
 		operator = newOperator == null ? OPERATOR_EDEFAULT : newOperator;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR, oldOperator, operator));
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR, oldOperator, operator));
 	}
 
 	/**
@@ -224,7 +224,7 @@
 		String oldValue = value;
 		value = newValue;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__VALUE, oldValue, value));
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE, oldValue, value));
 	}
 
 	/**
@@ -232,7 +232,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public ConditionAndOperator2 getOperator2() {
+	public Junction getOperator2() {
 		return operator2;
 	}
 
@@ -241,11 +241,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setOperator2(ConditionAndOperator2 newOperator2) {
-		ConditionAndOperator2 oldOperator2 = operator2;
+	public void setOperator2(Junction newOperator2) {
+		Junction oldOperator2 = operator2;
 		operator2 = newOperator2 == null ? OPERATOR2_EDEFAULT : newOperator2;
 		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2, oldOperator2, operator2));
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2, oldOperator2, operator2));
 	}
 
 	/**
@@ -253,7 +253,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public DataInterchangeFilterCondition getSubcondition() {
+	public DataInterchangeExportFilterCondition getSubcondition() {
 		return subcondition;
 	}
 
@@ -262,11 +262,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public NotificationChain basicSetSubcondition(DataInterchangeFilterCondition newSubcondition, NotificationChain msgs) {
-		DataInterchangeFilterCondition oldSubcondition = subcondition;
+	public NotificationChain basicSetSubcondition(DataInterchangeExportFilterCondition newSubcondition, NotificationChain msgs) {
+		DataInterchangeExportFilterCondition oldSubcondition = subcondition;
 		subcondition = newSubcondition;
 		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION, oldSubcondition, newSubcondition);
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION, oldSubcondition, newSubcondition);
 			if (msgs == null) msgs = notification; else msgs.add(notification);
 		}
 		return msgs;
@@ -277,18 +277,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setSubcondition(DataInterchangeFilterCondition newSubcondition) {
+	public void setSubcondition(DataInterchangeExportFilterCondition newSubcondition) {
 		if (newSubcondition != subcondition) {
 			NotificationChain msgs = null;
 			if (subcondition != null)
-				msgs = ((InternalEObject)subcondition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION, null, msgs);
+				msgs = ((InternalEObject)subcondition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION, null, msgs);
 			if (newSubcondition != null)
-				msgs = ((InternalEObject)newSubcondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION, null, msgs);
+				msgs = ((InternalEObject)newSubcondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION, null, msgs);
 			msgs = basicSetSubcondition(newSubcondition, msgs);
 			if (msgs != null) msgs.dispatch();
 		}
 		else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION, newSubcondition, newSubcondition));
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION, newSubcondition, newSubcondition));
 	}
 
 	/**
@@ -299,7 +299,7 @@
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION:
 				return basicSetSubcondition(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
@@ -313,16 +313,16 @@
 	@Override
 	public Object eGet(int featureID, boolean resolve, boolean coreType) {
 		switch (featureID) {
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY:
 				if (resolve) return getRefProperty();
 				return basicGetRefProperty();
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR:
 				return getOperator();
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__VALUE:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE:
 				return getValue();
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2:
 				return getOperator2();
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION:
 				return getSubcondition();
 		}
 		return super.eGet(featureID, resolve, coreType);
@@ -336,20 +336,20 @@
 	@Override
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY:
 				setRefProperty((LEntityFeature)newValue);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR:
-				setOperator((ConditionAndOperator1)newValue);
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR:
+				setOperator((Operator)newValue);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__VALUE:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE:
 				setValue((String)newValue);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2:
-				setOperator2((ConditionAndOperator2)newValue);
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2:
+				setOperator2((Junction)newValue);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION:
-				setSubcondition((DataInterchangeFilterCondition)newValue);
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION:
+				setSubcondition((DataInterchangeExportFilterCondition)newValue);
 				return;
 		}
 		super.eSet(featureID, newValue);
@@ -363,20 +363,20 @@
 	@Override
 	public void eUnset(int featureID) {
 		switch (featureID) {
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY:
 				setRefProperty((LEntityFeature)null);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR:
 				setOperator(OPERATOR_EDEFAULT);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__VALUE:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE:
 				setValue(VALUE_EDEFAULT);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2:
 				setOperator2(OPERATOR2_EDEFAULT);
 				return;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION:
-				setSubcondition((DataInterchangeFilterCondition)null);
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION:
+				setSubcondition((DataInterchangeExportFilterCondition)null);
 				return;
 		}
 		super.eUnset(featureID);
@@ -390,15 +390,15 @@
 	@Override
 	public boolean eIsSet(int featureID) {
 		switch (featureID) {
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY:
 				return refProperty != null;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR:
 				return operator != OPERATOR_EDEFAULT;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__VALUE:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE:
 				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2:
 				return operator2 != OPERATOR2_EDEFAULT;
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION__SUBCONDITION:
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__SUBCONDITION:
 				return subcondition != null;
 		}
 		return super.eIsSet(featureID);
@@ -424,4 +424,4 @@
 		return result.toString();
 	}
 
-} //DataInterchangeFilterConditionImpl
+} //DataInterchangeExportFilterConditionImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterImpl.java
index 1f2a721..35dfc3b 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeExportFilterImpl.java
@@ -32,8 +32,8 @@
 
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition;
 
 /**
  * <!-- begin-user-doc -->
@@ -58,7 +58,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	protected DataInterchangeFilterCondition condition;
+	protected DataInterchangeExportFilterCondition condition;
 
 	/**
 	 * The cached value of the '{@link #getHiddenproperties() <em>Hiddenproperties</em>}' containment reference list.
@@ -94,7 +94,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public DataInterchangeFilterCondition getCondition() {
+	public DataInterchangeExportFilterCondition getCondition() {
 		return condition;
 	}
 
@@ -103,8 +103,8 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public NotificationChain basicSetCondition(DataInterchangeFilterCondition newCondition, NotificationChain msgs) {
-		DataInterchangeFilterCondition oldCondition = condition;
+	public NotificationChain basicSetCondition(DataInterchangeExportFilterCondition newCondition, NotificationChain msgs) {
+		DataInterchangeExportFilterCondition oldCondition = condition;
 		condition = newCondition;
 		if (eNotificationRequired()) {
 			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER__CONDITION, oldCondition, newCondition);
@@ -118,7 +118,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public void setCondition(DataInterchangeFilterCondition newCondition) {
+	public void setCondition(DataInterchangeExportFilterCondition newCondition) {
 		if (newCondition != condition) {
 			NotificationChain msgs = null;
 			if (condition != null)
@@ -186,7 +186,7 @@
 	public void eSet(int featureID, Object newValue) {
 		switch (featureID) {
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER__CONDITION:
-				setCondition((DataInterchangeFilterCondition)newValue);
+				setCondition((DataInterchangeExportFilterCondition)newValue);
 				return;
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER__HIDDENPROPERTIES:
 				getHiddenproperties().clear();
@@ -205,7 +205,7 @@
 	public void eUnset(int featureID) {
 		switch (featureID) {
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER__CONDITION:
-				setCondition((DataInterchangeFilterCondition)null);
+				setCondition((DataInterchangeExportFilterCondition)null);
 				return;
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER__HIDDENPROPERTIES:
 				getHiddenproperties().clear();
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFileFixedImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFileFixedImpl.java
new file mode 100644
index 0000000..35e1d40
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFileFixedImpl.java
@@ -0,0 +1,283 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Interchange File Fixed</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl#getEncoding <em>Encoding</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl#getLocale <em>Locale</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFileFixedImpl#getFileURL <em>File URL</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataInterchangeFileFixedImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeFileFixed {
+	/**
+	 * The default value of the '{@link #getEncoding() <em>Encoding</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEncoding()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String ENCODING_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getEncoding() <em>Encoding</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getEncoding()
+	 * @generated
+	 * @ordered
+	 */
+	protected String encoding = ENCODING_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLocale() <em>Locale</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocale()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String LOCALE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getLocale() <em>Locale</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLocale()
+	 * @generated
+	 * @ordered
+	 */
+	protected String locale = LOCALE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getFileURL() <em>File URL</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFileURL()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String FILE_URL_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getFileURL() <em>File URL</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getFileURL()
+	 * @generated
+	 * @ordered
+	 */
+	protected String fileURL = FILE_URL_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataInterchangeFileFixedImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_FIXED;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getEncoding() {
+		return encoding;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setEncoding(String newEncoding) {
+		String oldEncoding = encoding;
+		encoding = newEncoding;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__ENCODING, oldEncoding, encoding));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getLocale() {
+		return locale;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLocale(String newLocale) {
+		String oldLocale = locale;
+		locale = newLocale;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__LOCALE, oldLocale, locale));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getFileURL() {
+		return fileURL;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setFileURL(String newFileURL) {
+		String oldFileURL = fileURL;
+		fileURL = newFileURL;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__FILE_URL, oldFileURL, fileURL));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__ENCODING:
+				return getEncoding();
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__LOCALE:
+				return getLocale();
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__FILE_URL:
+				return getFileURL();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__ENCODING:
+				setEncoding((String)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__LOCALE:
+				setLocale((String)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__FILE_URL:
+				setFileURL((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__ENCODING:
+				setEncoding(ENCODING_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__LOCALE:
+				setLocale(LOCALE_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__FILE_URL:
+				setFileURL(FILE_URL_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__ENCODING:
+				return ENCODING_EDEFAULT == null ? encoding != null : !ENCODING_EDEFAULT.equals(encoding);
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__LOCALE:
+				return LOCALE_EDEFAULT == null ? locale != null : !LOCALE_EDEFAULT.equals(locale);
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED__FILE_URL:
+				return FILE_URL_EDEFAULT == null ? fileURL != null : !FILE_URL_EDEFAULT.equals(fileURL);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (encoding: ");
+		result.append(encoding);
+		result.append(", locale: ");
+		result.append(locale);
+		result.append(", fileURL: ");
+		result.append(fileURL);
+		result.append(')');
+		return result.toString();
+	}
+
+} //DataInterchangeFileFixedImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFixedColumnMappingImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFixedColumnMappingImpl.java
new file mode 100644
index 0000000..e704ade
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeFixedColumnMappingImpl.java
@@ -0,0 +1,724 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute;
+
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Interchange Fixed Column Mapping</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getProperty <em>Property</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getData <em>Data</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#getLength <em>Length</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isTrim <em>Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isLeftTrim <em>Left Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isRightTrim <em>Right Trim</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isUpperCase <em>Upper Case</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isLowerCase <em>Lower Case</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isCapFirst <em>Cap First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isUncapFirst <em>Uncap First</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeFixedColumnMappingImpl#isCapitalize <em>Capitalize</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataInterchangeFixedColumnMappingImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeFixedColumnMapping {
+	/**
+	 * The cached value of the '{@link #getProperty() <em>Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityAttribute property;
+
+	/**
+	 * The default value of the '{@link #getData() <em>Data</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getData()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DATA_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getData() <em>Data</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getData()
+	 * @generated
+	 * @ordered
+	 */
+	protected String data = DATA_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final int LENGTH_EDEFAULT = 0;
+
+	/**
+	 * The cached value of the '{@link #getLength() <em>Length</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getLength()
+	 * @generated
+	 * @ordered
+	 */
+	protected int length = LENGTH_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isTrim() <em>Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean TRIM_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isTrim() <em>Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean trim = TRIM_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isLeftTrim() <em>Left Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLeftTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean LEFT_TRIM_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isLeftTrim() <em>Left Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLeftTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean leftTrim = LEFT_TRIM_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isRightTrim() <em>Right Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isRightTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean RIGHT_TRIM_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isRightTrim() <em>Right Trim</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isRightTrim()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean rightTrim = RIGHT_TRIM_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isUpperCase() <em>Upper Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpperCase()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UPPER_CASE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isUpperCase() <em>Upper Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUpperCase()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean upperCase = UPPER_CASE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isLowerCase() <em>Lower Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLowerCase()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean LOWER_CASE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isLowerCase() <em>Lower Case</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isLowerCase()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean lowerCase = LOWER_CASE_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isCapFirst() <em>Cap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCapFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CAP_FIRST_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isCapFirst() <em>Cap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCapFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean capFirst = CAP_FIRST_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isUncapFirst() <em>Uncap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUncapFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean UNCAP_FIRST_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isUncapFirst() <em>Uncap First</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isUncapFirst()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean uncapFirst = UNCAP_FIRST_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #isCapitalize() <em>Capitalize</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCapitalize()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final boolean CAPITALIZE_EDEFAULT = false;
+
+	/**
+	 * The cached value of the '{@link #isCapitalize() <em>Capitalize</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #isCapitalize()
+	 * @generated
+	 * @ordered
+	 */
+	protected boolean capitalize = CAPITALIZE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataInterchangeFixedColumnMappingImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityAttribute getProperty() {
+		if (property != null && property.eIsProxy()) {
+			InternalEObject oldProperty = (InternalEObject)property;
+			property = (LEntityAttribute)eResolveProxy(oldProperty);
+			if (property != oldProperty) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY, oldProperty, property));
+			}
+		}
+		return property;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityAttribute basicGetProperty() {
+		return property;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setProperty(LEntityAttribute newProperty) {
+		LEntityAttribute oldProperty = property;
+		property = newProperty;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY, oldProperty, property));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getData() {
+		return data;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setData(String newData) {
+		String oldData = data;
+		data = newData;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA, oldData, data));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public int getLength() {
+		return length;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLength(int newLength) {
+		int oldLength = length;
+		length = newLength;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH, oldLength, length));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isTrim() {
+		return trim;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setTrim(boolean newTrim) {
+		boolean oldTrim = trim;
+		trim = newTrim;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM, oldTrim, trim));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isLeftTrim() {
+		return leftTrim;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLeftTrim(boolean newLeftTrim) {
+		boolean oldLeftTrim = leftTrim;
+		leftTrim = newLeftTrim;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM, oldLeftTrim, leftTrim));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isRightTrim() {
+		return rightTrim;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRightTrim(boolean newRightTrim) {
+		boolean oldRightTrim = rightTrim;
+		rightTrim = newRightTrim;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM, oldRightTrim, rightTrim));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isUpperCase() {
+		return upperCase;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUpperCase(boolean newUpperCase) {
+		boolean oldUpperCase = upperCase;
+		upperCase = newUpperCase;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE, oldUpperCase, upperCase));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isLowerCase() {
+		return lowerCase;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setLowerCase(boolean newLowerCase) {
+		boolean oldLowerCase = lowerCase;
+		lowerCase = newLowerCase;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE, oldLowerCase, lowerCase));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isCapFirst() {
+		return capFirst;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCapFirst(boolean newCapFirst) {
+		boolean oldCapFirst = capFirst;
+		capFirst = newCapFirst;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST, oldCapFirst, capFirst));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isUncapFirst() {
+		return uncapFirst;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setUncapFirst(boolean newUncapFirst) {
+		boolean oldUncapFirst = uncapFirst;
+		uncapFirst = newUncapFirst;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST, oldUncapFirst, uncapFirst));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public boolean isCapitalize() {
+		return capitalize;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCapitalize(boolean newCapitalize) {
+		boolean oldCapitalize = capitalize;
+		capitalize = newCapitalize;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE, oldCapitalize, capitalize));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
+				if (resolve) return getProperty();
+				return basicGetProperty();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
+				return getData();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
+				return getLength();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
+				return isTrim();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
+				return isLeftTrim();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
+				return isRightTrim();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
+				return isUpperCase();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
+				return isLowerCase();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
+				return isCapFirst();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
+				return isUncapFirst();
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
+				return isCapitalize();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
+				setProperty((LEntityAttribute)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
+				setData((String)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
+				setLength((Integer)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
+				setTrim((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
+				setLeftTrim((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
+				setRightTrim((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
+				setUpperCase((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
+				setLowerCase((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
+				setCapFirst((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
+				setUncapFirst((Boolean)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
+				setCapitalize((Boolean)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
+				setProperty((LEntityAttribute)null);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
+				setData(DATA_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
+				setLength(LENGTH_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
+				setTrim(TRIM_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
+				setLeftTrim(LEFT_TRIM_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
+				setRightTrim(RIGHT_TRIM_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
+				setUpperCase(UPPER_CASE_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
+				setLowerCase(LOWER_CASE_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
+				setCapFirst(CAP_FIRST_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
+				setUncapFirst(UNCAP_FIRST_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
+				setCapitalize(CAPITALIZE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__PROPERTY:
+				return property != null;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__DATA:
+				return DATA_EDEFAULT == null ? data != null : !DATA_EDEFAULT.equals(data);
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LENGTH:
+				return length != LENGTH_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__TRIM:
+				return trim != TRIM_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LEFT_TRIM:
+				return leftTrim != LEFT_TRIM_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__RIGHT_TRIM:
+				return rightTrim != RIGHT_TRIM_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UPPER_CASE:
+				return upperCase != UPPER_CASE_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__LOWER_CASE:
+				return lowerCase != LOWER_CASE_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAP_FIRST:
+				return capFirst != CAP_FIRST_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__UNCAP_FIRST:
+				return uncapFirst != UNCAP_FIRST_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING__CAPITALIZE:
+				return capitalize != CAPITALIZE_EDEFAULT;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (data: ");
+		result.append(data);
+		result.append(", length: ");
+		result.append(length);
+		result.append(", trim: ");
+		result.append(trim);
+		result.append(", leftTrim: ");
+		result.append(leftTrim);
+		result.append(", rightTrim: ");
+		result.append(rightTrim);
+		result.append(", upperCase: ");
+		result.append(upperCase);
+		result.append(", lowerCase: ");
+		result.append(lowerCase);
+		result.append(", capFirst: ");
+		result.append(capFirst);
+		result.append(", uncapFirst: ");
+		result.append(uncapFirst);
+		result.append(", capitalize: ");
+		result.append(capitalize);
+		result.append(')');
+		return result.toString();
+	}
+
+} //DataInterchangeFixedColumnMappingImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterConditionImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterConditionImpl.java
new file mode 100644
index 0000000..b34bc08
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterConditionImpl.java
@@ -0,0 +1,440 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
+
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand;
+import org.eclipse.osbp.xtext.datainterchange.Junction;
+import org.eclipse.osbp.xtext.datainterchange.Operator;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Interchange Lookup Filter Condition</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl#getRefProperty <em>Ref Property</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl#getOperator <em>Operator</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl#getOperand <em>Operand</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl#getOperator2 <em>Operator2</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterConditionImpl#getSubcondition <em>Subcondition</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataInterchangeLookupFilterConditionImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeLookupFilterCondition {
+	/**
+	 * The cached value of the '{@link #getRefProperty() <em>Ref Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRefProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityFeature refProperty;
+
+	/**
+	 * The default value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Operator OPERATOR_EDEFAULT = Operator.EQUALS;
+
+	/**
+	 * The cached value of the '{@link #getOperator() <em>Operator</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator()
+	 * @generated
+	 * @ordered
+	 */
+	protected Operator operator = OPERATOR_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getOperand() <em>Operand</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperand()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataInterchangeLookupFilterOperand operand;
+
+	/**
+	 * The default value of the '{@link #getOperator2() <em>Operator2</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator2()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final Junction OPERATOR2_EDEFAULT = Junction.AND;
+
+	/**
+	 * The cached value of the '{@link #getOperator2() <em>Operator2</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getOperator2()
+	 * @generated
+	 * @ordered
+	 */
+	protected Junction operator2 = OPERATOR2_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getSubcondition() <em>Subcondition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getSubcondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataInterchangeLookupFilterCondition subcondition;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataInterchangeLookupFilterConditionImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityFeature getRefProperty() {
+		if (refProperty != null && refProperty.eIsProxy()) {
+			InternalEObject oldRefProperty = (InternalEObject)refProperty;
+			refProperty = (LEntityFeature)eResolveProxy(oldRefProperty);
+			if (refProperty != oldRefProperty) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
+			}
+		}
+		return refProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityFeature basicGetRefProperty() {
+		return refProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRefProperty(LEntityFeature newRefProperty) {
+		LEntityFeature oldRefProperty = refProperty;
+		refProperty = newRefProperty;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY, oldRefProperty, refProperty));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Operator getOperator() {
+		return operator;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator(Operator newOperator) {
+		Operator oldOperator = operator;
+		operator = newOperator == null ? OPERATOR_EDEFAULT : newOperator;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR, oldOperator, operator));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataInterchangeLookupFilterOperand getOperand() {
+		return operand;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetOperand(DataInterchangeLookupFilterOperand newOperand, NotificationChain msgs) {
+		DataInterchangeLookupFilterOperand oldOperand = operand;
+		operand = newOperand;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND, oldOperand, newOperand);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperand(DataInterchangeLookupFilterOperand newOperand) {
+		if (newOperand != operand) {
+			NotificationChain msgs = null;
+			if (operand != null)
+				msgs = ((InternalEObject)operand).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND, null, msgs);
+			if (newOperand != null)
+				msgs = ((InternalEObject)newOperand).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND, null, msgs);
+			msgs = basicSetOperand(newOperand, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND, newOperand, newOperand));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public Junction getOperator2() {
+		return operator2;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setOperator2(Junction newOperator2) {
+		Junction oldOperator2 = operator2;
+		operator2 = newOperator2 == null ? OPERATOR2_EDEFAULT : newOperator2;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2, oldOperator2, operator2));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public DataInterchangeLookupFilterCondition getSubcondition() {
+		return subcondition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetSubcondition(DataInterchangeLookupFilterCondition newSubcondition, NotificationChain msgs) {
+		DataInterchangeLookupFilterCondition oldSubcondition = subcondition;
+		subcondition = newSubcondition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION, oldSubcondition, newSubcondition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setSubcondition(DataInterchangeLookupFilterCondition newSubcondition) {
+		if (newSubcondition != subcondition) {
+			NotificationChain msgs = null;
+			if (subcondition != null)
+				msgs = ((InternalEObject)subcondition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION, null, msgs);
+			if (newSubcondition != null)
+				msgs = ((InternalEObject)newSubcondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION, null, msgs);
+			msgs = basicSetSubcondition(newSubcondition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION, newSubcondition, newSubcondition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND:
+				return basicSetOperand(null, msgs);
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION:
+				return basicSetSubcondition(null, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY:
+				if (resolve) return getRefProperty();
+				return basicGetRefProperty();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR:
+				return getOperator();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND:
+				return getOperand();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2:
+				return getOperator2();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION:
+				return getSubcondition();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY:
+				setRefProperty((LEntityFeature)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR:
+				setOperator((Operator)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND:
+				setOperand((DataInterchangeLookupFilterOperand)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2:
+				setOperator2((Junction)newValue);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION:
+				setSubcondition((DataInterchangeLookupFilterCondition)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY:
+				setRefProperty((LEntityFeature)null);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR:
+				setOperator(OPERATOR_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND:
+				setOperand((DataInterchangeLookupFilterOperand)null);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2:
+				setOperator2(OPERATOR2_EDEFAULT);
+				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION:
+				setSubcondition((DataInterchangeLookupFilterCondition)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY:
+				return refProperty != null;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR:
+				return operator != OPERATOR_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND:
+				return operand != null;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2:
+				return operator2 != OPERATOR2_EDEFAULT;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__SUBCONDITION:
+				return subcondition != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (operator: ");
+		result.append(operator);
+		result.append(", operator2: ");
+		result.append(operator2);
+		result.append(')');
+		return result.toString();
+	}
+
+} //DataInterchangeLookupFilterConditionImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandPropertyImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandPropertyImpl.java
new file mode 100644
index 0000000..27c01ac
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandPropertyImpl.java
@@ -0,0 +1,170 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature;
+
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Interchange Lookup Filter Operand Property</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandPropertyImpl#getRefProperty <em>Ref Property</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataInterchangeLookupFilterOperandPropertyImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeLookupFilterOperandProperty {
+	/**
+	 * The cached value of the '{@link #getRefProperty() <em>Ref Property</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRefProperty()
+	 * @generated
+	 * @ordered
+	 */
+	protected LEntityFeature refProperty;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataInterchangeLookupFilterOperandPropertyImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityFeature getRefProperty() {
+		if (refProperty != null && refProperty.eIsProxy()) {
+			InternalEObject oldRefProperty = (InternalEObject)refProperty;
+			refProperty = (LEntityFeature)eResolveProxy(oldRefProperty);
+			if (refProperty != oldRefProperty) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY, oldRefProperty, refProperty));
+			}
+		}
+		return refProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public LEntityFeature basicGetRefProperty() {
+		return refProperty;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRefProperty(LEntityFeature newRefProperty) {
+		LEntityFeature oldRefProperty = refProperty;
+		refProperty = newRefProperty;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY, oldRefProperty, refProperty));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY:
+				if (resolve) return getRefProperty();
+				return basicGetRefProperty();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY:
+				setRefProperty((LEntityFeature)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY:
+				setRefProperty((LEntityFeature)null);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY:
+				return refProperty != null;
+		}
+		return super.eIsSet(featureID);
+	}
+
+} //DataInterchangeLookupFilterOperandPropertyImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandStringImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandStringImpl.java
new file mode 100644
index 0000000..929b61a
--- /dev/null
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupFilterOperandStringImpl.java
@@ -0,0 +1,175 @@
+/**
+ * Copyright (c) 2014, Loetz GmbH&Co.KG (Heidelberg)
+ *  All rights reserved. This program and the accompanying materials 
+ *  are made available under the terms of the Eclipse Public License 2.0  
+ *  which accompanies this distribution, and is available at 
+ *  https://www.eclipse.org/legal/epl-2.0/ 
+ *  
+ *  SPDX-License-Identifier: EPL-2.0 
+ * 
+ *  Based on ideas from Xtext, Xtend, Xcore
+ *   
+ *  Contributors:  
+ *  		Joerg Riegel - Initial implementation 
+ *  
+ */
+package org.eclipse.osbp.xtext.datainterchange.impl;
+
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EClass;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Data Interchange Lookup Filter Operand String</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * </p>
+ * <ul>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupFilterOperandStringImpl#getValue <em>Value</em>}</li>
+ * </ul>
+ *
+ * @generated
+ */
+public class DataInterchangeLookupFilterOperandStringImpl extends DataInterchangeLazyResolverImpl implements DataInterchangeLookupFilterOperandString {
+	/**
+	 * The default value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String VALUE_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getValue() <em>Value</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getValue()
+	 * @generated
+	 * @ordered
+	 */
+	protected String value = VALUE_EDEFAULT;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected DataInterchangeLookupFilterOperandStringImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getValue() {
+		return value;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setValue(String newValue) {
+		String oldValue = value;
+		value = newValue;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE, oldValue, value));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE:
+				return getValue();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE:
+				setValue((String)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE:
+				setValue(VALUE_EDEFAULT);
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE:
+				return VALUE_EDEFAULT == null ? value != null : !VALUE_EDEFAULT.equals(value);
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (value: ");
+		result.append(value);
+		result.append(')');
+		return result.toString();
+	}
+
+} //DataInterchangeLookupFilterOperandStringImpl
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupImpl.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupImpl.java
index 271adeb..8506d60 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupImpl.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/impl/DataInterchangeLookupImpl.java
@@ -29,6 +29,7 @@
 
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerPath;
 
 /**
@@ -49,6 +50,7 @@
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupImpl#isCached <em>Cached</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupImpl#getCacheSize <em>Cache Size</em>}</li>
  *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupImpl#getMarkerPath <em>Marker Path</em>}</li>
+ *   <li>{@link org.eclipse.osbp.xtext.datainterchange.impl.DataInterchangeLookupImpl#getCondition <em>Condition</em>}</li>
  * </ul>
  *
  * @generated
@@ -215,6 +217,16 @@
 	protected DataInterchangeMarkerPath markerPath;
 
 	/**
+	 * The cached value of the '{@link #getCondition() <em>Condition</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getCondition()
+	 * @generated
+	 * @ordered
+	 */
+	protected DataInterchangeLookupFilterCondition condition;
+
+	/**
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
@@ -521,11 +533,56 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public DataInterchangeLookupFilterCondition getCondition() {
+		return condition;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetCondition(DataInterchangeLookupFilterCondition newCondition, NotificationChain msgs) {
+		DataInterchangeLookupFilterCondition oldCondition = condition;
+		condition = newCondition;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION, oldCondition, newCondition);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setCondition(DataInterchangeLookupFilterCondition newCondition) {
+		if (newCondition != condition) {
+			NotificationChain msgs = null;
+			if (condition != null)
+				msgs = ((InternalEObject)condition).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION, null, msgs);
+			if (newCondition != null)
+				msgs = ((InternalEObject)newCondition).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION, null, msgs);
+			msgs = basicSetCondition(newCondition, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION, newCondition, newCondition));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	@Override
 	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
 		switch (featureID) {
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__MARKER_PATH:
 				return basicSetMarkerPath(null, msgs);
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION:
+				return basicSetCondition(null, msgs);
 		}
 		return super.eInverseRemove(otherEnd, featureID, msgs);
 	}
@@ -561,6 +618,8 @@
 				return getCacheSize();
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__MARKER_PATH:
 				return getMarkerPath();
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION:
+				return getCondition();
 		}
 		return super.eGet(featureID, resolve, coreType);
 	}
@@ -603,6 +662,9 @@
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__MARKER_PATH:
 				setMarkerPath((DataInterchangeMarkerPath)newValue);
 				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION:
+				setCondition((DataInterchangeLookupFilterCondition)newValue);
+				return;
 		}
 		super.eSet(featureID, newValue);
 	}
@@ -645,6 +707,9 @@
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__MARKER_PATH:
 				setMarkerPath((DataInterchangeMarkerPath)null);
 				return;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION:
+				setCondition((DataInterchangeLookupFilterCondition)null);
+				return;
 		}
 		super.eUnset(featureID);
 	}
@@ -677,6 +742,8 @@
 				return cacheSize != CACHE_SIZE_EDEFAULT;
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__MARKER_PATH:
 				return markerPath != null;
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP__CONDITION:
+				return condition != null;
 		}
 		return super.eIsSet(featureID);
 	}
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLAdapterFactory.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLAdapterFactory.java
index d7c6b52..c0de4b9 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLAdapterFactory.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLAdapterFactory.java
@@ -124,6 +124,10 @@
 				return createDataInterchangeFileEDIAdapter();
 			}
 			@Override
+			public Adapter caseDataInterchangeFileFixed(DataInterchangeFileFixed object) {
+				return createDataInterchangeFileFixedAdapter();
+			}
+			@Override
 			public Adapter caseDataInterchangeBean(DataInterchangeBean object) {
 				return createDataInterchangeBeanAdapter();
 			}
@@ -160,8 +164,24 @@
 				return createDataInterchangeExportFilterAdapter();
 			}
 			@Override
-			public Adapter caseDataInterchangeFilterCondition(DataInterchangeFilterCondition object) {
-				return createDataInterchangeFilterConditionAdapter();
+			public Adapter caseDataInterchangeExportFilterCondition(DataInterchangeExportFilterCondition object) {
+				return createDataInterchangeExportFilterConditionAdapter();
+			}
+			@Override
+			public Adapter caseDataInterchangeLookupFilterCondition(DataInterchangeLookupFilterCondition object) {
+				return createDataInterchangeLookupFilterConditionAdapter();
+			}
+			@Override
+			public Adapter caseDataInterchangeLookupFilterOperand(DataInterchangeLookupFilterOperand object) {
+				return createDataInterchangeLookupFilterOperandAdapter();
+			}
+			@Override
+			public Adapter caseDataInterchangeLookupFilterOperandString(DataInterchangeLookupFilterOperandString object) {
+				return createDataInterchangeLookupFilterOperandStringAdapter();
+			}
+			@Override
+			public Adapter caseDataInterchangeLookupFilterOperandProperty(DataInterchangeLookupFilterOperandProperty object) {
+				return createDataInterchangeLookupFilterOperandPropertyAdapter();
 			}
 			@Override
 			public Adapter caseDataInterchangeExportHide(DataInterchangeExportHide object) {
@@ -188,6 +208,10 @@
 				return createDataInterchangeBlobMappingAdapter();
 			}
 			@Override
+			public Adapter caseDataInterchangeFixedColumnMapping(DataInterchangeFixedColumnMapping object) {
+				return createDataInterchangeFixedColumnMappingAdapter();
+			}
+			@Override
 			public Adapter caseLLazyResolver(LLazyResolver object) {
 				return createLLazyResolverAdapter();
 			}
@@ -356,6 +380,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed <em>Data Interchange File Fixed</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed
+	 * @generated
+	 */
+	public Adapter createDataInterchangeFileFixedAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean <em>Data Interchange Bean</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
@@ -482,16 +520,72 @@
 	}
 
 	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition <em>Data Interchange Filter Condition</em>}'.
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition <em>Data Interchange Export Filter Condition</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
 	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
 	 * <!-- end-user-doc -->
 	 * @return the new adapter.
-	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition
 	 * @generated
 	 */
-	public Adapter createDataInterchangeFilterConditionAdapter() {
+	public Adapter createDataInterchangeExportFilterConditionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition <em>Data Interchange Lookup Filter Condition</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition
+	 * @generated
+	 */
+	public Adapter createDataInterchangeLookupFilterConditionAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand <em>Data Interchange Lookup Filter Operand</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperand
+	 * @generated
+	 */
+	public Adapter createDataInterchangeLookupFilterOperandAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString <em>Data Interchange Lookup Filter Operand String</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString
+	 * @generated
+	 */
+	public Adapter createDataInterchangeLookupFilterOperandStringAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty <em>Data Interchange Lookup Filter Operand Property</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty
+	 * @generated
+	 */
+	public Adapter createDataInterchangeLookupFilterOperandPropertyAdapter() {
 		return null;
 	}
 
@@ -580,6 +674,20 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping <em>Data Interchange Fixed Column Mapping</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping
+	 * @generated
+	 */
+	public Adapter createDataInterchangeFixedColumnMappingAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.osbp.dsl.semantic.common.types.LLazyResolver <em>LLazy Resolver</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLSwitch.java b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLSwitch.java
index 1ab4b27..53a2781 100644
--- a/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLSwitch.java
+++ b/org.eclipse.osbp.xtext.datainterchange/emf-gen/org/eclipse/osbp/xtext/datainterchange/util/DataDSLSwitch.java
@@ -156,6 +156,14 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED: {
+				DataInterchangeFileFixed dataInterchangeFileFixed = (DataInterchangeFileFixed)theEObject;
+				T result = caseDataInterchangeFileFixed(dataInterchangeFileFixed);
+				if (result == null) result = caseDataInterchangeFile(dataInterchangeFileFixed);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeFileFixed);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case DataDSLPackage.DATA_INTERCHANGE_BEAN: {
 				DataInterchangeBean dataInterchangeBean = (DataInterchangeBean)theEObject;
 				T result = caseDataInterchangeBean(dataInterchangeBean);
@@ -221,10 +229,40 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION: {
-				DataInterchangeFilterCondition dataInterchangeFilterCondition = (DataInterchangeFilterCondition)theEObject;
-				T result = caseDataInterchangeFilterCondition(dataInterchangeFilterCondition);
-				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeFilterCondition);
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION: {
+				DataInterchangeExportFilterCondition dataInterchangeExportFilterCondition = (DataInterchangeExportFilterCondition)theEObject;
+				T result = caseDataInterchangeExportFilterCondition(dataInterchangeExportFilterCondition);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeExportFilterCondition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION: {
+				DataInterchangeLookupFilterCondition dataInterchangeLookupFilterCondition = (DataInterchangeLookupFilterCondition)theEObject;
+				T result = caseDataInterchangeLookupFilterCondition(dataInterchangeLookupFilterCondition);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeLookupFilterCondition);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND: {
+				DataInterchangeLookupFilterOperand dataInterchangeLookupFilterOperand = (DataInterchangeLookupFilterOperand)theEObject;
+				T result = caseDataInterchangeLookupFilterOperand(dataInterchangeLookupFilterOperand);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeLookupFilterOperand);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING: {
+				DataInterchangeLookupFilterOperandString dataInterchangeLookupFilterOperandString = (DataInterchangeLookupFilterOperandString)theEObject;
+				T result = caseDataInterchangeLookupFilterOperandString(dataInterchangeLookupFilterOperandString);
+				if (result == null) result = caseDataInterchangeLookupFilterOperand(dataInterchangeLookupFilterOperandString);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeLookupFilterOperandString);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY: {
+				DataInterchangeLookupFilterOperandProperty dataInterchangeLookupFilterOperandProperty = (DataInterchangeLookupFilterOperandProperty)theEObject;
+				T result = caseDataInterchangeLookupFilterOperandProperty(dataInterchangeLookupFilterOperandProperty);
+				if (result == null) result = caseDataInterchangeLookupFilterOperand(dataInterchangeLookupFilterOperandProperty);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeLookupFilterOperandProperty);
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
@@ -272,6 +310,14 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING: {
+				DataInterchangeFixedColumnMapping dataInterchangeFixedColumnMapping = (DataInterchangeFixedColumnMapping)theEObject;
+				T result = caseDataInterchangeFixedColumnMapping(dataInterchangeFixedColumnMapping);
+				if (result == null) result = caseDataInterchangeMapping(dataInterchangeFixedColumnMapping);
+				if (result == null) result = caseDataInterchangeLazyResolver(dataInterchangeFixedColumnMapping);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			default: return defaultCase(theEObject);
 		}
 	}
@@ -427,6 +473,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange File Fixed</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange File Fixed</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeFileFixed(DataInterchangeFileFixed object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Bean</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
@@ -562,17 +623,77 @@
 	}
 
 	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Filter Condition</em>'.
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Export Filter Condition</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
 	 * returning a non-null result will terminate the switch.
 	 * <!-- end-user-doc -->
 	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Filter Condition</em>'.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Export Filter Condition</em>'.
 	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
 	 * @generated
 	 */
-	public T caseDataInterchangeFilterCondition(DataInterchangeFilterCondition object) {
+	public T caseDataInterchangeExportFilterCondition(DataInterchangeExportFilterCondition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Condition</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Condition</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeLookupFilterCondition(DataInterchangeLookupFilterCondition object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeLookupFilterOperand(DataInterchangeLookupFilterOperand object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand String</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand String</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeLookupFilterOperandString(DataInterchangeLookupFilterOperandString object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand Property</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Lookup Filter Operand Property</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeLookupFilterOperandProperty(DataInterchangeLookupFilterOperandProperty object) {
 		return null;
 	}
 
@@ -667,6 +788,21 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Data Interchange Fixed Column Mapping</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Data Interchange Fixed Column Mapping</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T caseDataInterchangeFixedColumnMapping(DataInterchangeFixedColumnMapping object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>LLazy Resolver</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore b/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore
index 969a54c..d5d622f 100644
--- a/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore
+++ b/org.eclipse.osbp.xtext.datainterchange/model/DataDSL.xcore
@@ -97,11 +97,15 @@
 	boolean validate
 }
 
+class DataInterchangeFileFixed extends DataInterchangeFile {
+	String fileURL
+}
+
 class DataInterchangeBean extends DataInterchangeLazyResolver {
 	refers LEntity entity
+	refers LEntityFeature refDataSource
 	boolean markLatestImport
 	boolean markLatestExport
-	boolean hasBlobMapping
 	refers LEntityAttribute latestProperty
 	refers LEntityAttribute latestExpProperty
 	String elementMap
@@ -149,6 +153,7 @@
 	boolean cached
 	int cacheSize
 	contains DataInterchangeMarkerPath markerPath
+	contains DataInterchangeLookupFilterCondition condition
 }
 
 class DataInterchangeExpose extends DataInterchangeLazyResolver {
@@ -158,18 +163,38 @@
 }
 
 class DataInterchangeExportFilter extends DataInterchangeLazyResolver {
-	contains DataInterchangeFilterCondition condition
+	contains DataInterchangeExportFilterCondition condition
 	contains DataInterchangeExportHide[] hiddenproperties
 }
 
-class DataInterchangeFilterCondition extends DataInterchangeLazyResolver {
+class DataInterchangeExportFilterCondition extends DataInterchangeLazyResolver {
 	refers LEntityFeature refProperty
-	ConditionAndOperator1 operator
+	Operator operator
 	String value
-	ConditionAndOperator2 operator2
-	contains DataInterchangeFilterCondition subcondition
+	Junction operator2
+	contains DataInterchangeExportFilterCondition subcondition
 }
 
+class DataInterchangeLookupFilterCondition extends DataInterchangeLazyResolver {
+	refers LEntityFeature refProperty
+	Operator operator
+	contains DataInterchangeLookupFilterOperand operand
+	Junction operator2
+	contains DataInterchangeLookupFilterCondition subcondition
+}
+
+interface DataInterchangeLookupFilterOperand extends DataInterchangeLazyResolver {
+	
+}
+
+class DataInterchangeLookupFilterOperandString extends DataInterchangeLookupFilterOperand {
+	String value
+} 
+
+class DataInterchangeLookupFilterOperandProperty extends DataInterchangeLookupFilterOperand {
+	refers LEntityFeature refProperty
+} 
+
 class DataInterchangeExportHide extends DataInterchangeLazyResolver {
 	refers LEntityFeature property
 }
@@ -198,6 +223,18 @@
 	PredefinedBlobMimeTypeEnum mimeType
 }
 
+class DataInterchangeFixedColumnMapping extends DataInterchangeMapping {
+	int length
+	boolean trim
+	boolean leftTrim
+	boolean rightTrim
+	boolean upperCase
+	boolean lowerCase
+	boolean capFirst
+	boolean uncapFirst
+	boolean capitalize
+}
+
 enum PredefinedBlobMimeTypeEnum{
 	plain 		 as "text/plain"
 	jpg			 as "image/jpeg"
@@ -228,22 +265,18 @@
 	remove		as 'remove'
 }
 
-enum ConditionAndOperator1{
+enum Operator{
 	equals as '='
 	notequals as '!='
 	greaterthen as '>'
 	greaterthenorequalto as '>='
 	lessthen as '<'
 	lessthenorequalto as '<='
-	in as 'in'
-	between as 'between'
-	like as 'like'
-	not as 'not'
-	isnull as 	'isnull'
+	isnull as 'isnull'
 	isnotnull as 'isnotnull'
-	exists as 'exists'
 }
-enum ConditionAndOperator2{
+
+enum Junction{
 	and as 'and'
 	or as 'or'
 }
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtextbin b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtextbin
index 47c7a9c..0f96d70 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtextbin
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtextbin
Binary files differ
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.g b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.g
index 08f5204..04eba0b 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.g
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.g
@@ -574,6 +574,15 @@
 			$current = $this_DataInterchangeFileEDI_2.current;
 			afterParserOrEnumRuleCall();
 		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3());
+		}
+		this_DataInterchangeFileFixed_3=ruleDataInterchangeFileFixed
+		{
+			$current = $this_DataInterchangeFileFixed_3.current;
+			afterParserOrEnumRuleCall();
+		}
 	)
 ;
 
@@ -1142,6 +1151,134 @@
 	)
 ;
 
+// Entry rule entryRuleDataInterchangeFileFixed
+entryRuleDataInterchangeFileFixed returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeFileFixedRule()); }
+	iv_ruleDataInterchangeFileFixed=ruleDataInterchangeFileFixed
+	{ $current=$iv_ruleDataInterchangeFileFixed.current; }
+	EOF;
+
+// Rule DataInterchangeFileFixed
+ruleDataInterchangeFileFixed returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='Fixed'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1());
+		}
+		(
+			(
+				lv_fileURL_2_0=RULE_STRING
+				{
+					newLeafNode(lv_fileURL_2_0, grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"fileURL",
+						lv_fileURL_2_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0);
+					}
+								({true}?=>(otherlv_4='encoding'
+								{
+									newLeafNode(otherlv_4, grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0());
+								}
+								(
+									(
+										lv_encoding_5_0=RULE_STRING
+										{
+											newLeafNode(lv_encoding_5_0, grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"encoding",
+												lv_encoding_5_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1);
+					}
+								({true}?=>(otherlv_6='locale'
+								{
+									newLeafNode(otherlv_6, grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0());
+								}
+								(
+									(
+										lv_locale_7_0=RULE_STRING
+										{
+											newLeafNode(lv_locale_7_0, grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+											}
+											setWithLastConsumed(
+												$current,
+												"locale",
+												lv_locale_7_0,
+												"org.eclipse.xtext.xbase.Xtype.STRING");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+				}
+		)
+	)
+;
+
 // Entry rule entryRuleDataInterchangeBean
 entryRuleDataInterchangeBean returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getDataInterchangeBeanRule()); }
@@ -1186,15 +1323,34 @@
 			)
 		)
 		(
-			otherlv_3='nodeName'
+			otherlv_3='referencedBy'
 			{
-				newLeafNode(otherlv_3, grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0());
+				newLeafNode(otherlv_3, grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0());
 			}
 			(
 				(
-					lv_nodeName_4_0=RULE_STRING
 					{
-						newLeafNode(lv_nodeName_4_0, grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0());
+						if ($current==null) {
+							$current = createModelElement(grammarAccess.getDataInterchangeBeanRule());
+						}
+					}
+					otherlv_4=RULE_ID
+					{
+						newLeafNode(otherlv_4, grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0());
+					}
+				)
+			)
+		)?
+		(
+			otherlv_5='nodeName'
+			{
+				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0());
+			}
+			(
+				(
+					lv_nodeName_6_0=RULE_STRING
+					{
+						newLeafNode(lv_nodeName_6_0, grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0());
 					}
 					{
 						if ($current==null) {
@@ -1203,22 +1359,22 @@
 						setWithLastConsumed(
 							$current,
 							"nodeName",
-							lv_nodeName_4_0,
+							lv_nodeName_6_0,
 							"org.eclipse.xtext.xbase.Xtype.STRING");
 					}
 				)
 			)
 		)?
 		(
-			otherlv_5='createOn'
+			otherlv_7='createOn'
 			{
-				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0());
+				newLeafNode(otherlv_7, grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0());
 			}
 			(
 				(
-					lv_elementMap_6_0=RULE_STRING
+					lv_elementMap_8_0=RULE_STRING
 					{
-						newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0());
+						newLeafNode(lv_elementMap_8_0, grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0());
 					}
 					{
 						if ($current==null) {
@@ -1227,7 +1383,7 @@
 						setWithLastConsumed(
 							$current,
 							"elementMap",
-							lv_elementMap_6_0,
+							lv_elementMap_8_0,
 							"org.eclipse.xtext.xbase.Xtype.STRING");
 					}
 				)
@@ -1236,9 +1392,9 @@
 		(
 			(
 				(
-					lv_markLatestImport_7_0='latestImport'
+					lv_markLatestImport_9_0='latestImport'
 					{
-						newLeafNode(lv_markLatestImport_7_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0());
+						newLeafNode(lv_markLatestImport_9_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0());
 					}
 					{
 						if ($current==null) {
@@ -1255,9 +1411,9 @@
 							$current = createModelElement(grammarAccess.getDataInterchangeBeanRule());
 						}
 					}
-					otherlv_8=RULE_ID
+					otherlv_10=RULE_ID
 					{
-						newLeafNode(otherlv_8, grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0());
+						newLeafNode(otherlv_10, grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0());
 					}
 				)
 			)
@@ -1265,9 +1421,9 @@
 		(
 			(
 				(
-					lv_markLatestExport_9_0='latestExport'
+					lv_markLatestExport_11_0='latestExport'
 					{
-						newLeafNode(lv_markLatestExport_9_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0());
+						newLeafNode(lv_markLatestExport_11_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0());
 					}
 					{
 						if ($current==null) {
@@ -1284,244 +1440,246 @@
 							$current = createModelElement(grammarAccess.getDataInterchangeBeanRule());
 						}
 					}
-					otherlv_10=RULE_ID
+					otherlv_12=RULE_ID
 					{
-						newLeafNode(otherlv_10, grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0());
+						newLeafNode(otherlv_12, grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0());
 					}
 				)
 			)
 		)?
 		(
-			otherlv_11='expression'
-			{
-				newLeafNode(otherlv_11, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0());
-			}
-			otherlv_12='{'
-			{
-				newLeafNode(otherlv_12, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1());
-			}
 			(
+				otherlv_13='expression'
+				{
+					newLeafNode(otherlv_13, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0());
+				}
+				otherlv_14='{'
+				{
+					newLeafNode(otherlv_14, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0());
-					}
-					lv_expression_13_0=ruleDataInterchangeExpression
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0());
 						}
-						add(
-							$current,
-							"expression",
-							lv_expression_13_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpression");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_14='}'
-			{
-				newLeafNode(otherlv_14, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3());
-			}
-		)?
-		(
-			otherlv_15='lookup'
-			{
-				newLeafNode(otherlv_15, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0());
-			}
-			otherlv_16='{'
-			{
-				newLeafNode(otherlv_16, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1());
-			}
+						lv_expression_15_0=ruleDataInterchangeExpression
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"expression",
+								lv_expression_15_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpression");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_16='}'
+				{
+					newLeafNode(otherlv_16, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3());
+				}
+			)?
 			(
+				otherlv_17='lookup'
+				{
+					newLeafNode(otherlv_17, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0());
+				}
+				otherlv_18='{'
+				{
+					newLeafNode(otherlv_18, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0());
-					}
-					lv_lookup_17_0=ruleDataInterchangeLookup
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0());
 						}
-						add(
-							$current,
-							"lookup",
-							lv_lookup_17_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookup");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_18='}'
-			{
-				newLeafNode(otherlv_18, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3());
-			}
-		)?
-		(
-			otherlv_19='format'
-			{
-				newLeafNode(otherlv_19, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0());
-			}
-			otherlv_20='{'
-			{
-				newLeafNode(otherlv_20, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1());
-			}
+						lv_lookup_19_0=ruleDataInterchangeLookup
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"lookup",
+								lv_lookup_19_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookup");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_20='}'
+				{
+					newLeafNode(otherlv_20, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3());
+				}
+			)?
 			(
+				otherlv_21='format'
+				{
+					newLeafNode(otherlv_21, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0());
+				}
+				otherlv_22='{'
+				{
+					newLeafNode(otherlv_22, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0());
-					}
-					lv_format_21_0=ruleDataInterchangeFormat
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0());
 						}
-						add(
-							$current,
-							"format",
-							lv_format_21_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFormat");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_22='}'
-			{
-				newLeafNode(otherlv_22, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3());
-			}
-		)?
-		(
-			otherlv_23='expose'
-			{
-				newLeafNode(otherlv_23, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0());
-			}
-			otherlv_24='{'
-			{
-				newLeafNode(otherlv_24, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1());
-			}
+						lv_format_23_0=ruleDataInterchangeFormat
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"format",
+								lv_format_23_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFormat");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_24='}'
+				{
+					newLeafNode(otherlv_24, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3());
+				}
+			)?
 			(
+				otherlv_25='expose'
+				{
+					newLeafNode(otherlv_25, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0());
+				}
+				otherlv_26='{'
+				{
+					newLeafNode(otherlv_26, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0());
-					}
-					lv_exportExposes_25_0=ruleDataInterchangeExpose
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0());
 						}
-						add(
-							$current,
-							"exportExposes",
-							lv_exportExposes_25_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpose");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_26='}'
-			{
-				newLeafNode(otherlv_26, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3());
-			}
-		)?
-		(
-			otherlv_27='mapping'
-			{
-				newLeafNode(otherlv_27, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0());
-			}
-			otherlv_28='{'
-			{
-				newLeafNode(otherlv_28, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1());
-			}
+						lv_exportExposes_27_0=ruleDataInterchangeExpose
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"exportExposes",
+								lv_exportExposes_27_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpose");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_28='}'
+				{
+					newLeafNode(otherlv_28, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3());
+				}
+			)?
 			(
+				otherlv_29='mapping'
+				{
+					newLeafNode(otherlv_29, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0());
+				}
+				otherlv_30='{'
+				{
+					newLeafNode(otherlv_30, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0());
-					}
-					lv_mappings_29_0=ruleDataInterchangeMapping
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0());
 						}
-						add(
-							$current,
-							"mappings",
-							lv_mappings_29_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMapping");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_30='}'
-			{
-				newLeafNode(otherlv_30, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3());
-			}
-		)?
-		(
-			otherlv_31='keys'
-			{
-				newLeafNode(otherlv_31, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0());
-			}
-			otherlv_32='{'
-			{
-				newLeafNode(otherlv_32, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1());
-			}
+						lv_mappings_31_0=ruleDataInterchangeMapping
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"mappings",
+								lv_mappings_31_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMapping");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_32='}'
+				{
+					newLeafNode(otherlv_32, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3());
+				}
+			)?
 			(
+				otherlv_33='keys'
+				{
+					newLeafNode(otherlv_33, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0());
+				}
+				otherlv_34='{'
+				{
+					newLeafNode(otherlv_34, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0());
-					}
-					lv_lookupKeys_33_0=ruleDataInterchangeKey
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0());
 						}
-						add(
-							$current,
-							"lookupKeys",
-							lv_lookupKeys_33_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeKey");
-						afterParserOrEnumRuleCall();
-					}
-				)
-			)*
-			otherlv_34='}'
-			{
-				newLeafNode(otherlv_34, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3());
-			}
-		)?
-		(
-			otherlv_35='exportFilter'
-			{
-				newLeafNode(otherlv_35, grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0());
-			}
-			otherlv_36='{'
-			{
-				newLeafNode(otherlv_36, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1());
-			}
+						lv_lookupKeys_35_0=ruleDataInterchangeKey
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							add(
+								$current,
+								"lookupKeys",
+								lv_lookupKeys_35_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeKey");
+							afterParserOrEnumRuleCall();
+						}
+					)
+				)*
+				otherlv_36='}'
+				{
+					newLeafNode(otherlv_36, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3());
+				}
+			)?
 			(
+				otherlv_37='exportFilter'
+				{
+					newLeafNode(otherlv_37, grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0());
+				}
+				otherlv_38='{'
+				{
+					newLeafNode(otherlv_38, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1());
+				}
 				(
-					{
-						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0());
-					}
-					lv_exportFilter_37_0=ruleDataInterchangeExportFilter
-					{
-						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+					(
+						{
+							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0());
 						}
-						set(
-							$current,
-							"exportFilter",
-							lv_exportFilter_37_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilter");
-						afterParserOrEnumRuleCall();
-					}
+						lv_exportFilter_39_0=ruleDataInterchangeExportFilter
+						{
+							if ($current==null) {
+								$current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+							}
+							set(
+								$current,
+								"exportFilter",
+								lv_exportFilter_39_0,
+								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilter");
+							afterParserOrEnumRuleCall();
+						}
+					)
 				)
-			)
-			otherlv_38='}'
-			{
-				newLeafNode(otherlv_38, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3());
-			}
-		)?
+				otherlv_40='}'
+				{
+					newLeafNode(otherlv_40, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3());
+				}
+			)?
+		)
 	)
 ;
 
@@ -1608,9 +1766,9 @@
 				}
 			)
 		)
-		otherlv_3='on'
+		otherlv_3='in'
 		{
-			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3());
+			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3());
 		}
 		(
 			(
@@ -1625,33 +1783,118 @@
 				}
 			)
 		)
+		otherlv_5='createOn'
+		{
+			newLeafNode(otherlv_5, grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5());
+		}
 		(
-			otherlv_5='createOn'
-			{
-				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0());
-			}
 			(
-				(
-					lv_elementMap_6_0=RULE_STRING
-					{
-						newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0());
+				lv_elementMap_6_0=RULE_STRING
+				{
+					newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
 					}
+					setWithLastConsumed(
+						$current,
+						"elementMap",
+						lv_elementMap_6_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		otherlv_7='mapFrom'
+		{
+			newLeafNode(otherlv_7, grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7());
+		}
+		(
+			(
+				lv_dataMap_8_0=RULE_STRING
+				{
+					newLeafNode(lv_dataMap_8_0, grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"dataMap",
+						lv_dataMap_8_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0)}?=>(
 					{
-						if ($current==null) {
-							$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-						}
-						setWithLastConsumed(
-							$current,
-							"elementMap",
-							lv_elementMap_6_0,
-							"org.eclipse.xtext.xbase.Xtype.STRING");
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0);
+					}
+								({true}?=>((
+									lv_allowNoResult_10_0='allowNoResult'
+									{
+										newLeafNode(lv_allowNoResult_10_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0());
+									}
+									{
+										if ($current==null) {
+											$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+										}
+										setWithLastConsumed($current, "allowNoResult", true, "allowNoResult");
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1);
+					}
+								({true}?=>((
+									{
+										newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0());
+									}
+									lv_markerPath_11_0=ruleDataInterchangeMarkerPath
+									{
+										if ($current==null) {
+											$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupRule());
+										}
+										set(
+											$current,
+											"markerPath",
+											lv_markerPath_11_0,
+											"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMarkerPath");
+										afterParserOrEnumRuleCall();
+									}
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
 					}
 				)
 			)
-		)?
-		otherlv_7='with'
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+				}
+		)
+		otherlv_12='mapTo'
 		{
-			newLeafNode(otherlv_7, grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6());
+			newLeafNode(otherlv_12, grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10());
 		}
 		(
 			(
@@ -1660,18 +1903,18 @@
 						$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
 					}
 				}
-				otherlv_8=RULE_ID
+				otherlv_13=RULE_ID
 				{
-					newLeafNode(otherlv_8, grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0());
+					newLeafNode(otherlv_13, grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0());
 				}
 			)
 		)
 		(
 			(
 				(
-					lv_cached_9_0='cacheSize'
+					lv_cached_14_0='cacheSize'
 					{
-						newLeafNode(lv_cached_9_0, grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0());
+						newLeafNode(lv_cached_14_0, grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0());
 					}
 					{
 						if ($current==null) {
@@ -1683,9 +1926,9 @@
 			)
 			(
 				(
-					lv_cacheSize_10_0=RULE_INT
+					lv_cacheSize_15_0=RULE_INT
 					{
-						newLeafNode(lv_cacheSize_10_0, grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0());
+						newLeafNode(lv_cacheSize_15_0, grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0());
 					}
 					{
 						if ($current==null) {
@@ -1694,124 +1937,45 @@
 						setWithLastConsumed(
 							$current,
 							"cacheSize",
-							lv_cacheSize_10_0,
+							lv_cacheSize_15_0,
 							"org.eclipse.xtext.xbase.Xbase.INT");
 					}
 				)
 			)
 		)?
 		(
-			otherlv_11='mapTo'
+			otherlv_16='where'
 			{
-				newLeafNode(otherlv_11, grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0());
+				newLeafNode(otherlv_16, grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0());
+			}
+			otherlv_17='{'
+			{
+				newLeafNode(otherlv_17, grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1());
 			}
 			(
 				(
-					lv_dataMap_12_0=RULE_STRING
 					{
-						newLeafNode(lv_dataMap_12_0, grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0());
+						newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0());
 					}
+					lv_condition_18_0=ruleDataInterchangeLookupFilterCondition
 					{
 						if ($current==null) {
-							$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+							$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupRule());
 						}
-						setWithLastConsumed(
+						set(
 							$current,
-							"dataMap",
-							lv_dataMap_12_0,
-							"org.eclipse.xtext.xbase.Xtype.STRING");
+							"condition",
+							lv_condition_18_0,
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterCondition");
+						afterParserOrEnumRuleCall();
 					}
 				)
 			)
+			otherlv_19='}'
+			{
+				newLeafNode(otherlv_19, grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3());
+			}
 		)?
-		(
-			(
-				{ 
-				  getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-				}
-				(
-					(
-			(
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0)}?=>(
-					{
-						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0);
-					}
-								({true}?=>((
-									lv_allowNoResult_14_0='allowNoResult'
-									{
-										newLeafNode(lv_allowNoResult_14_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0());
-									}
-									{
-										if ($current==null) {
-											$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-										}
-										setWithLastConsumed($current, "allowNoResult", true, "allowNoResult");
-									}
-								)
-								))
-					{ 
-						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-					}
-				)
-			)|
-			(
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1)}?=>(
-					{
-						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1);
-					}
-								({true}?=>((
-									lv_allowNonuniqueResult_15_0='allowNonuniqueResult'
-									{
-										newLeafNode(lv_allowNonuniqueResult_15_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0());
-									}
-									{
-										if ($current==null) {
-											$current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-										}
-										setWithLastConsumed($current, "allowNonuniqueResult", true, "allowNonuniqueResult");
-									}
-								)
-								))
-					{ 
-						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-					}
-				)
-			)|
-			(
-				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2)}?=>(
-					{
-						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2);
-					}
-								({true}?=>((
-									{
-										newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0());
-									}
-									lv_markerPath_16_0=ruleDataInterchangeMarkerPath
-									{
-										if ($current==null) {
-											$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupRule());
-										}
-										set(
-											$current,
-											"markerPath",
-											lv_markerPath_16_0,
-											"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMarkerPath");
-										afterParserOrEnumRuleCall();
-									}
-								)
-								))
-					{ 
-						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-					}
-				)
-			)
-					)*
-				)
-			)
-				{ 
-				  getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-				}
-		)
 	)
 ;
 
@@ -2261,9 +2425,9 @@
 			(
 				(
 					{
-						newCompositeNode(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0());
+						newCompositeNode(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0());
 					}
-					lv_condition_3_0=ruleDataInterchangeFilterCondition
+					lv_condition_3_0=ruleDataInterchangeExportFilterCondition
 					{
 						if ($current==null) {
 							$current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterRule());
@@ -2272,7 +2436,7 @@
 							$current,
 							"condition",
 							lv_condition_3_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFilterCondition");
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilterCondition");
 						afterParserOrEnumRuleCall();
 					}
 				)
@@ -2310,15 +2474,15 @@
 	)
 ;
 
-// Entry rule entryRuleDataInterchangeFilterCondition
-entryRuleDataInterchangeFilterCondition returns [EObject current=null]:
-	{ newCompositeNode(grammarAccess.getDataInterchangeFilterConditionRule()); }
-	iv_ruleDataInterchangeFilterCondition=ruleDataInterchangeFilterCondition
-	{ $current=$iv_ruleDataInterchangeFilterCondition.current; }
+// Entry rule entryRuleDataInterchangeExportFilterCondition
+entryRuleDataInterchangeExportFilterCondition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionRule()); }
+	iv_ruleDataInterchangeExportFilterCondition=ruleDataInterchangeExportFilterCondition
+	{ $current=$iv_ruleDataInterchangeExportFilterCondition.current; }
 	EOF;
 
-// Rule DataInterchangeFilterCondition
-ruleDataInterchangeFilterCondition returns [EObject current=null]
+// Rule DataInterchangeExportFilterCondition
+ruleDataInterchangeExportFilterCondition returns [EObject current=null]
 @init {
 	enterRule();
 }
@@ -2330,30 +2494,30 @@
 			(
 				{
 					if ($current==null) {
-						$current = createModelElement(grammarAccess.getDataInterchangeFilterConditionRule());
+						$current = createModelElement(grammarAccess.getDataInterchangeExportFilterConditionRule());
 					}
 				}
 				otherlv_0=RULE_ID
 				{
-					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
+					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
 				}
 			)
 		)
 		(
 			(
 				{
-					newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0());
+					newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0());
 				}
-				lv_operator_1_0=ruleConditionAndOperator1
+				lv_operator_1_0=ruleOperator
 				{
 					if ($current==null) {
-						$current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+						$current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
 					}
 					set(
 						$current,
 						"operator",
 						lv_operator_1_0,
-						"org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator1");
+						"org.eclipse.osbp.xtext.datainterchange.DataDSL.Operator");
 					afterParserOrEnumRuleCall();
 				}
 			)
@@ -2362,11 +2526,11 @@
 			(
 				lv_value_2_0=RULE_STRING
 				{
-					newLeafNode(lv_value_2_0, grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0());
+					newLeafNode(lv_value_2_0, grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0());
 				}
 				{
 					if ($current==null) {
-						$current = createModelElement(grammarAccess.getDataInterchangeFilterConditionRule());
+						$current = createModelElement(grammarAccess.getDataInterchangeExportFilterConditionRule());
 					}
 					setWithLastConsumed(
 						$current,
@@ -2380,18 +2544,18 @@
 			(
 				(
 					{
-						newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0());
+						newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0());
 					}
-					lv_operator2_3_0=ruleConditionAndOperator2
+					lv_operator2_3_0=ruleJunction
 					{
 						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+							$current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
 						}
 						set(
 							$current,
 							"operator2",
 							lv_operator2_3_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator2");
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.Junction");
 						afterParserOrEnumRuleCall();
 					}
 				)
@@ -2399,18 +2563,18 @@
 			(
 				(
 					{
-						newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0());
+						newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0());
 					}
-					lv_subcondition_4_0=ruleDataInterchangeFilterCondition
+					lv_subcondition_4_0=ruleDataInterchangeExportFilterCondition
 					{
 						if ($current==null) {
-							$current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+							$current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
 						}
 						set(
 							$current,
 							"subcondition",
 							lv_subcondition_4_0,
-							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFilterCondition");
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilterCondition");
 						afterParserOrEnumRuleCall();
 					}
 				)
@@ -2419,6 +2583,235 @@
 	)
 ;
 
+// Entry rule entryRuleDataInterchangeLookupFilterCondition
+entryRuleDataInterchangeLookupFilterCondition returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionRule()); }
+	iv_ruleDataInterchangeLookupFilterCondition=ruleDataInterchangeLookupFilterCondition
+	{ $current=$iv_ruleDataInterchangeLookupFilterCondition.current; }
+	EOF;
+
+// Rule DataInterchangeLookupFilterCondition
+ruleDataInterchangeLookupFilterCondition returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+					}
+				}
+				otherlv_0=RULE_ID
+				{
+					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0());
+				}
+				lv_operator_1_0=ruleOperator
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+					}
+					set(
+						$current,
+						"operator",
+						lv_operator_1_0,
+						"org.eclipse.osbp.xtext.datainterchange.DataDSL.Operator");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)
+		(
+			(
+				{
+					newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0());
+				}
+				lv_operand_2_0=ruleDataInterchangeLookupFilterOperand
+				{
+					if ($current==null) {
+						$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+					}
+					set(
+						$current,
+						"operand",
+						lv_operand_2_0,
+						"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterOperand");
+					afterParserOrEnumRuleCall();
+				}
+			)
+		)?
+		(
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0());
+					}
+					lv_operator2_3_0=ruleJunction
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+						}
+						set(
+							$current,
+							"operator2",
+							lv_operator2_3_0,
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.Junction");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+			(
+				(
+					{
+						newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0());
+					}
+					lv_subcondition_4_0=ruleDataInterchangeLookupFilterCondition
+					{
+						if ($current==null) {
+							$current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+						}
+						set(
+							$current,
+							"subcondition",
+							lv_subcondition_4_0,
+							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterCondition");
+						afterParserOrEnumRuleCall();
+					}
+				)
+			)
+		)?
+	)
+;
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperand
+entryRuleDataInterchangeLookupFilterOperand returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandRule()); }
+	iv_ruleDataInterchangeLookupFilterOperand=ruleDataInterchangeLookupFilterOperand
+	{ $current=$iv_ruleDataInterchangeLookupFilterOperand.current; }
+	EOF;
+
+// Rule DataInterchangeLookupFilterOperand
+ruleDataInterchangeLookupFilterOperand returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		{
+			newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0());
+		}
+		this_DataInterchangeLookupFilterOperandString_0=ruleDataInterchangeLookupFilterOperandString
+		{
+			$current = $this_DataInterchangeLookupFilterOperandString_0.current;
+			afterParserOrEnumRuleCall();
+		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1());
+		}
+		this_DataInterchangeLookupFilterOperandProperty_1=ruleDataInterchangeLookupFilterOperandProperty
+		{
+			$current = $this_DataInterchangeLookupFilterOperandProperty_1.current;
+			afterParserOrEnumRuleCall();
+		}
+	)
+;
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperandProperty
+entryRuleDataInterchangeLookupFilterOperandProperty returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); }
+	iv_ruleDataInterchangeLookupFilterOperandProperty=ruleDataInterchangeLookupFilterOperandProperty
+	{ $current=$iv_ruleDataInterchangeLookupFilterOperandProperty.current; }
+	EOF;
+
+// Rule DataInterchangeLookupFilterOperandProperty
+ruleDataInterchangeLookupFilterOperandProperty returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule());
+					}
+				}
+				otherlv_1=RULE_ID
+				{
+					newLeafNode(otherlv_1, grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0());
+				}
+			)
+		)
+	)
+;
+
+// Entry rule entryRuleDataInterchangeLookupFilterOperandString
+entryRuleDataInterchangeLookupFilterOperandString returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); }
+	iv_ruleDataInterchangeLookupFilterOperandString=ruleDataInterchangeLookupFilterOperandString
+	{ $current=$iv_ruleDataInterchangeLookupFilterOperandString.current; }
+	EOF;
+
+// Rule DataInterchangeLookupFilterOperandString
+ruleDataInterchangeLookupFilterOperandString returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0(),
+					$current);
+			}
+		)
+		(
+			(
+				lv_value_1_0=RULE_STRING
+				{
+					newLeafNode(lv_value_1_0, grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeLookupFilterOperandStringRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"value",
+						lv_value_1_0,
+						"org.eclipse.xtext.xbase.Xtype.STRING");
+				}
+			)
+		)
+	)
+;
+
 // Entry rule entryRuleDataInterchangeExportHide
 entryRuleDataInterchangeExportHide returns [EObject current=null]:
 	{ newCompositeNode(grammarAccess.getDataInterchangeExportHideRule()); }
@@ -2580,6 +2973,15 @@
 			$current = $this_DataInterchangeBlobMapping_1.current;
 			afterParserOrEnumRuleCall();
 		}
+		    |
+		{
+			newCompositeNode(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2());
+		}
+		this_DataInterchangeFixedColumnMapping_2=ruleDataInterchangeFixedColumnMapping
+		{
+			$current = $this_DataInterchangeFixedColumnMapping_2.current;
+			afterParserOrEnumRuleCall();
+		}
 	)
 ;
 
@@ -2784,6 +3186,225 @@
 	)
 ;
 
+// Entry rule entryRuleDataInterchangeFixedColumnMapping
+entryRuleDataInterchangeFixedColumnMapping returns [EObject current=null]:
+	{ newCompositeNode(grammarAccess.getDataInterchangeFixedColumnMappingRule()); }
+	iv_ruleDataInterchangeFixedColumnMapping=ruleDataInterchangeFixedColumnMapping
+	{ $current=$iv_ruleDataInterchangeFixedColumnMapping.current; }
+	EOF;
+
+// Rule DataInterchangeFixedColumnMapping
+ruleDataInterchangeFixedColumnMapping returns [EObject current=null]
+@init {
+	enterRule();
+}
+@after {
+	leaveRule();
+}:
+	(
+		(
+			{
+				$current = forceCreateModelElement(
+					grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0(),
+					$current);
+			}
+		)
+		otherlv_1='mapFixedLength'
+		{
+			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1());
+		}
+		(
+			(
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+					}
+				}
+				otherlv_2=RULE_ID
+				{
+					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0());
+				}
+			)
+		)
+		otherlv_3='length'
+		{
+			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3());
+		}
+		(
+			(
+				lv_length_4_0=RULE_INT
+				{
+					newLeafNode(lv_length_4_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0());
+				}
+				{
+					if ($current==null) {
+						$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+					}
+					setWithLastConsumed(
+						$current,
+						"length",
+						lv_length_4_0,
+						"org.eclipse.xtext.xbase.Xbase.INT");
+				}
+			)
+		)
+		(
+			(
+				{ 
+				  getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+				}
+				(
+					(
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0);
+					}
+								({true}?=>((
+									(
+										lv_trim_6_0='trim'
+										{
+											newLeafNode(lv_trim_6_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "trim", true, "trim");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_leftTrim_7_0='leftTrim'
+										{
+											newLeafNode(lv_leftTrim_7_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "leftTrim", true, "leftTrim");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_rightTrim_8_0='rightTrim'
+										{
+											newLeafNode(lv_rightTrim_8_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "rightTrim", true, "rightTrim");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+					}
+				)
+			)|
+			(
+				{getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1)}?=>(
+					{
+						getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1);
+					}
+								({true}?=>((
+									(
+										lv_lowerCase_9_0='lowerCase'
+										{
+											newLeafNode(lv_lowerCase_9_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "lowerCase", true, "lowerCase");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_upperCase_10_0='upperCase'
+										{
+											newLeafNode(lv_upperCase_10_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "upperCase", true, "upperCase");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_capFirst_11_0='capitalizeFirstWord'
+										{
+											newLeafNode(lv_capFirst_11_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "capFirst", true, "capitalizeFirstWord");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_uncapFirst_12_0='uncapitalizeFirstWord'
+										{
+											newLeafNode(lv_uncapFirst_12_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "uncapFirst", true, "uncapitalizeFirstWord");
+										}
+									)
+								)
+								    |
+								(
+									(
+										lv_capitalize_13_0='capitalize'
+										{
+											newLeafNode(lv_capitalize_13_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0());
+										}
+										{
+											if ($current==null) {
+												$current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+											}
+											setWithLastConsumed($current, "capitalize", true, "capitalize");
+										}
+									)
+								)
+								))
+					{ 
+						getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+					}
+				)
+			)
+					)*
+				)
+			)
+				{ 
+				  getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+				}
+		)
+	)
+;
+
 // Entry rule entryRuleLFQN
 entryRuleLFQN returns [String current=null]:
 	{ newCompositeNode(grammarAccess.getLFQNRule()); }
@@ -9913,8 +10534,8 @@
 	)
 ;
 
-// Rule ConditionAndOperator1
-ruleConditionAndOperator1 returns [Enumerator current=null]
+// Rule Operator
+ruleOperator returns [Enumerator current=null]
 @init {
 	enterRule();
 }
@@ -9925,71 +10546,71 @@
 		(
 			enumLiteral_0='='
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_0, grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0());
+				$current = grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0());
 			}
 		)
 		    |
 		(
 			enumLiteral_1='!='
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_1, grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1());
+				$current = grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1());
 			}
 		)
 		    |
 		(
 			enumLiteral_2='>'
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_2, grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2());
+				$current = grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_2, grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2());
 			}
 		)
 		    |
 		(
 			enumLiteral_3='>='
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_3, grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3());
+				$current = grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_3, grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3());
 			}
 		)
 		    |
 		(
 			enumLiteral_4='<'
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_4, grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4());
+				$current = grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_4, grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4());
 			}
 		)
 		    |
 		(
 			enumLiteral_5='<='
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_5, grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5());
+				$current = grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_5, grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5());
 			}
 		)
 		    |
 		(
 			enumLiteral_6='isnull'
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_6, grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6());
+				$current = grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_6, grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6());
 			}
 		)
 		    |
 		(
 			enumLiteral_7='isnotnull'
 			{
-				$current = grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_7, grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7());
+				$current = grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_7, grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7());
 			}
 		)
 	)
 ;
 
-// Rule ConditionAndOperator2
-ruleConditionAndOperator2 returns [Enumerator current=null]
+// Rule Junction
+ruleJunction returns [Enumerator current=null]
 @init {
 	enterRule();
 }
@@ -10000,16 +10621,16 @@
 		(
 			enumLiteral_0='and'
 			{
-				$current = grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_0, grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0());
+				$current = grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_0, grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0());
 			}
 		)
 		    |
 		(
 			enumLiteral_1='or'
 			{
-				$current = grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-				newLeafNode(enumLiteral_1, grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1());
+				$current = grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+				newLeafNode(enumLiteral_1, grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1());
 			}
 		)
 	)
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.tokens b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.tokens
index 66ffc54..968a93b 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.tokens
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSL.tokens
@@ -1,156 +1,169 @@
-'!'=114
-'!='=99
-'!=='=101
-'#'=85
-'%'=113
-'%='=92
-'&&'=97
-'&'=144
-'('=81
-')'=83
-'*'=77
-'**'=111
-'*='=90
-'+'=109
-'++'=115
-'+='=88
-','=82
-'-'=110
-'--'=116
-'-='=89
-'->'=103
-'.'=74
-'..'=105
-'..<'=104
-'/'=112
-'/='=91
-':'=123
-'::'=117
-';'=79
-'<'=93
-'<='=162
-'<>'=107
-'='=84
-'=='=98
-'==='=100
-'=>'=106
-'>'=94
-'>='=95
-'?'=143
-'?.'=118
-'?:'=108
-'@'=80
+'!'=127
+'!='=112
+'!=='=114
+'#'=98
+'%'=126
+'%='=105
+'&&'=110
+'&'=157
+'('=94
+')'=96
+'*'=90
+'**'=124
+'*='=103
+'+'=122
+'++'=128
+'+='=101
+','=95
+'-'=123
+'--'=129
+'-='=102
+'->'=116
+'.'=87
+'..'=118
+'..<'=117
+'/'=125
+'/='=104
+':'=136
+'::'=130
+';'=92
+'<'=106
+'<='=175
+'<>'=120
+'='=97
+'=='=111
+'==='=113
+'=>'=119
+'>'=107
+'>='=108
+'?'=156
+'?.'=131
+'?:'=121
+'@'=93
 'CSV'=29
-'Date'=154
+'Date'=167
 'EDI'=34
-'ExecuteContext'=158
-'Milliseconds'=155
-'Nanoseconds'=156
-'NowDate'=151
-'Random'=157
-'StartDate'=152
-'UniversallyUniqueIdentifier'=153
+'ExecuteContext'=171
+'Fixed'=37
+'Milliseconds'=168
+'Nanoseconds'=169
+'NowDate'=164
+'Random'=170
+'StartDate'=165
+'UniversallyUniqueIdentifier'=166
 'XML'=25
-'['=86
-']'=87
+'['=99
+']'=100
 'allowNoResult'=55
-'allowNonuniqueResult'=56
-'and'=165
-'as'=68
-'assign'=67
-'cacheSize'=53
-'case'=125
-'catch'=142
-'coding'=60
-'copy'=61
-'createOn'=39
-'default'=124
+'and'=178
+'as'=71
+'assign'=69
+'cacheSize'=57
+'capitalize'=86
+'capitalizeFirstWord'=84
+'case'=138
+'catch'=155
+'coding'=62
+'copy'=63
+'createOn'=41
+'default'=137
 'deleteFileAfterImport'=22
 'delimiter'=30
 'describedBy'=18
-'do'=127
+'do'=140
 'elementSize'=21
-'else'=121
+'else'=134
 'encoding'=27
-'entity'=37
-'exportFilter'=48
-'expose'=45
-'expression'=42
-'extends'=130
-'extension'=72
-'false'=133
+'entity'=38
+'exportFilter'=50
+'expose'=47
+'expression'=44
+'extends'=143
+'extension'=75
+'false'=146
 'file'=23
-'finally'=140
-'for'=50
-'format'=44
-'from'=62
+'finally'=153
+'for'=52
+'format'=46
+'from'=64
 'group'=16
-'hide'=66
-'if'=120
-'import'=75
+'hide'=68
+'if'=133
+'import'=88
+'in'=53
 'indent'=33
-'instanceof'=102
+'instanceof'=115
 'interchange'=17
-'isnotnull'=164
-'isnull'=163
-'jpg'=146
-'key'=49
-'keys'=47
-'latestExport'=41
-'latestImport'=40
+'isnotnull'=177
+'isnull'=176
+'jpg'=159
+'key'=51
+'keys'=49
+'latestExport'=43
+'latestImport'=42
+'leftTrim'=80
+'length'=78
 'locale'=28
-'lookup'=43
-'map'=69
-'mapBlob'=71
+'lookup'=45
+'lowerCase'=82
+'map'=72
+'mapBlob'=74
 'mapByAttribute'=26
-'mapTo'=54
-'mapping'=46
+'mapFixedLength'=77
+'mapFrom'=54
+'mapTo'=56
+'mapping'=48
 'mappingModel'=35
-'markedBy'=59
-'markerEntity'=58
-'markerPath'=57
-'merge'=160
-'mimeType'=73
-'mpeg'=148
-'new'=132
-'nodeName'=38
-'ns'=78
-'null'=135
-'octet-stream'=149
-'on'=51
-'or'=166
+'markedBy'=61
+'markerEntity'=60
+'markerPath'=59
+'merge'=173
+'mimeType'=76
+'mpeg'=161
+'new'=145
+'nodeName'=40
+'ns'=91
+'null'=148
+'octet-stream'=162
+'on'=67
+'or'=179
 'package'=13
 'path'=24
-'pdf'=150
-'persist'=159
-'plain'=145
-'png'=147
-'property'=63
+'pdf'=163
+'persist'=172
+'plain'=158
+'png'=160
+'property'=65
 'quoteCharacter'=31
-'ref'=64
-'remove'=161
+'ref'=66
+'referencedBy'=39
+'remove'=174
 'report'=20
-'return'=138
+'return'=151
+'rightTrim'=81
 'skipLines'=32
-'static'=76
-'super'=131
-'switch'=122
-'synchronized'=141
-'throw'=137
-'to'=70
-'true'=134
-'try'=139
-'typeof'=136
-'val'=129
+'static'=89
+'super'=144
+'switch'=135
+'synchronized'=154
+'throw'=150
+'to'=73
+'trim'=79
+'true'=147
+'try'=152
+'typeof'=149
+'uncapitalizeFirstWord'=85
+'upperCase'=83
+'val'=142
 'validate'=36
-'var'=128
+'var'=141
 'vectorName'=19
-'where'=65
-'while'=126
-'with'=52
+'where'=58
+'while'=139
+'with'=70
 '{'=14
-'|'=119
-'||'=96
+'|'=132
+'||'=109
 '}'=15
 RULE_ANY_OTHER=12
 RULE_DECIMAL=8
@@ -231,7 +244,20 @@
 T__164=164
 T__165=165
 T__166=166
+T__167=167
+T__168=168
+T__169=169
 T__16=16
+T__170=170
+T__171=171
+T__172=172
+T__173=173
+T__174=174
+T__175=175
+T__176=176
+T__177=177
+T__178=178
+T__179=179
 T__17=17
 T__18=18
 T__19=19
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLLexer.java b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLLexer.java
index 5746957..5e6672a 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLLexer.java
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLLexer.java
@@ -60,6 +60,8 @@
     public static final int T__127=127;
     public static final int T__166=166;
     public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
     public static final int T__162=162;
     public static final int T__161=161;
     public static final int T__164=164;
@@ -118,6 +120,16 @@
     public static final int T__96=96;
     public static final int T__97=97;
     public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
     public static final int RULE_DECIMAL=8;
     public static final int T__26=26;
     public static final int T__27=27;
@@ -127,6 +139,7 @@
     public static final int T__23=23;
     public static final int T__24=24;
     public static final int T__25=25;
+    public static final int T__169=169;
     public static final int T__20=20;
     public static final int T__21=21;
     public static final int T__122=122;
@@ -697,10 +710,10 @@
         try {
             int _type = T__37;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:35:7: ( 'entity' )
-            // InternalDataDSL.g:35:9: 'entity'
+            // InternalDataDSL.g:35:7: ( 'Fixed' )
+            // InternalDataDSL.g:35:9: 'Fixed'
             {
-            match("entity"); 
+            match("Fixed"); 
 
 
             }
@@ -718,10 +731,10 @@
         try {
             int _type = T__38;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:36:7: ( 'nodeName' )
-            // InternalDataDSL.g:36:9: 'nodeName'
+            // InternalDataDSL.g:36:7: ( 'entity' )
+            // InternalDataDSL.g:36:9: 'entity'
             {
-            match("nodeName"); 
+            match("entity"); 
 
 
             }
@@ -739,10 +752,10 @@
         try {
             int _type = T__39;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:37:7: ( 'createOn' )
-            // InternalDataDSL.g:37:9: 'createOn'
+            // InternalDataDSL.g:37:7: ( 'referencedBy' )
+            // InternalDataDSL.g:37:9: 'referencedBy'
             {
-            match("createOn"); 
+            match("referencedBy"); 
 
 
             }
@@ -760,10 +773,10 @@
         try {
             int _type = T__40;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:38:7: ( 'latestImport' )
-            // InternalDataDSL.g:38:9: 'latestImport'
+            // InternalDataDSL.g:38:7: ( 'nodeName' )
+            // InternalDataDSL.g:38:9: 'nodeName'
             {
-            match("latestImport"); 
+            match("nodeName"); 
 
 
             }
@@ -781,10 +794,10 @@
         try {
             int _type = T__41;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:39:7: ( 'latestExport' )
-            // InternalDataDSL.g:39:9: 'latestExport'
+            // InternalDataDSL.g:39:7: ( 'createOn' )
+            // InternalDataDSL.g:39:9: 'createOn'
             {
-            match("latestExport"); 
+            match("createOn"); 
 
 
             }
@@ -802,10 +815,10 @@
         try {
             int _type = T__42;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:40:7: ( 'expression' )
-            // InternalDataDSL.g:40:9: 'expression'
+            // InternalDataDSL.g:40:7: ( 'latestImport' )
+            // InternalDataDSL.g:40:9: 'latestImport'
             {
-            match("expression"); 
+            match("latestImport"); 
 
 
             }
@@ -823,10 +836,10 @@
         try {
             int _type = T__43;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:41:7: ( 'lookup' )
-            // InternalDataDSL.g:41:9: 'lookup'
+            // InternalDataDSL.g:41:7: ( 'latestExport' )
+            // InternalDataDSL.g:41:9: 'latestExport'
             {
-            match("lookup"); 
+            match("latestExport"); 
 
 
             }
@@ -844,10 +857,10 @@
         try {
             int _type = T__44;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:42:7: ( 'format' )
-            // InternalDataDSL.g:42:9: 'format'
+            // InternalDataDSL.g:42:7: ( 'expression' )
+            // InternalDataDSL.g:42:9: 'expression'
             {
-            match("format"); 
+            match("expression"); 
 
 
             }
@@ -865,10 +878,10 @@
         try {
             int _type = T__45;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:43:7: ( 'expose' )
-            // InternalDataDSL.g:43:9: 'expose'
+            // InternalDataDSL.g:43:7: ( 'lookup' )
+            // InternalDataDSL.g:43:9: 'lookup'
             {
-            match("expose"); 
+            match("lookup"); 
 
 
             }
@@ -886,10 +899,10 @@
         try {
             int _type = T__46;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:44:7: ( 'mapping' )
-            // InternalDataDSL.g:44:9: 'mapping'
+            // InternalDataDSL.g:44:7: ( 'format' )
+            // InternalDataDSL.g:44:9: 'format'
             {
-            match("mapping"); 
+            match("format"); 
 
 
             }
@@ -907,10 +920,10 @@
         try {
             int _type = T__47;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:45:7: ( 'keys' )
-            // InternalDataDSL.g:45:9: 'keys'
+            // InternalDataDSL.g:45:7: ( 'expose' )
+            // InternalDataDSL.g:45:9: 'expose'
             {
-            match("keys"); 
+            match("expose"); 
 
 
             }
@@ -928,10 +941,10 @@
         try {
             int _type = T__48;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:46:7: ( 'exportFilter' )
-            // InternalDataDSL.g:46:9: 'exportFilter'
+            // InternalDataDSL.g:46:7: ( 'mapping' )
+            // InternalDataDSL.g:46:9: 'mapping'
             {
-            match("exportFilter"); 
+            match("mapping"); 
 
 
             }
@@ -949,10 +962,10 @@
         try {
             int _type = T__49;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:47:7: ( 'key' )
-            // InternalDataDSL.g:47:9: 'key'
+            // InternalDataDSL.g:47:7: ( 'keys' )
+            // InternalDataDSL.g:47:9: 'keys'
             {
-            match("key"); 
+            match("keys"); 
 
 
             }
@@ -970,10 +983,10 @@
         try {
             int _type = T__50;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:48:7: ( 'for' )
-            // InternalDataDSL.g:48:9: 'for'
+            // InternalDataDSL.g:48:7: ( 'exportFilter' )
+            // InternalDataDSL.g:48:9: 'exportFilter'
             {
-            match("for"); 
+            match("exportFilter"); 
 
 
             }
@@ -991,10 +1004,10 @@
         try {
             int _type = T__51;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:49:7: ( 'on' )
-            // InternalDataDSL.g:49:9: 'on'
+            // InternalDataDSL.g:49:7: ( 'key' )
+            // InternalDataDSL.g:49:9: 'key'
             {
-            match("on"); 
+            match("key"); 
 
 
             }
@@ -1012,10 +1025,10 @@
         try {
             int _type = T__52;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:50:7: ( 'with' )
-            // InternalDataDSL.g:50:9: 'with'
+            // InternalDataDSL.g:50:7: ( 'for' )
+            // InternalDataDSL.g:50:9: 'for'
             {
-            match("with"); 
+            match("for"); 
 
 
             }
@@ -1033,10 +1046,10 @@
         try {
             int _type = T__53;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:51:7: ( 'cacheSize' )
-            // InternalDataDSL.g:51:9: 'cacheSize'
+            // InternalDataDSL.g:51:7: ( 'in' )
+            // InternalDataDSL.g:51:9: 'in'
             {
-            match("cacheSize"); 
+            match("in"); 
 
 
             }
@@ -1054,10 +1067,10 @@
         try {
             int _type = T__54;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:52:7: ( 'mapTo' )
-            // InternalDataDSL.g:52:9: 'mapTo'
+            // InternalDataDSL.g:52:7: ( 'mapFrom' )
+            // InternalDataDSL.g:52:9: 'mapFrom'
             {
-            match("mapTo"); 
+            match("mapFrom"); 
 
 
             }
@@ -1096,10 +1109,10 @@
         try {
             int _type = T__56;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:54:7: ( 'allowNonuniqueResult' )
-            // InternalDataDSL.g:54:9: 'allowNonuniqueResult'
+            // InternalDataDSL.g:54:7: ( 'mapTo' )
+            // InternalDataDSL.g:54:9: 'mapTo'
             {
-            match("allowNonuniqueResult"); 
+            match("mapTo"); 
 
 
             }
@@ -1117,10 +1130,10 @@
         try {
             int _type = T__57;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:55:7: ( 'markerPath' )
-            // InternalDataDSL.g:55:9: 'markerPath'
+            // InternalDataDSL.g:55:7: ( 'cacheSize' )
+            // InternalDataDSL.g:55:9: 'cacheSize'
             {
-            match("markerPath"); 
+            match("cacheSize"); 
 
 
             }
@@ -1138,10 +1151,10 @@
         try {
             int _type = T__58;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:56:7: ( 'markerEntity' )
-            // InternalDataDSL.g:56:9: 'markerEntity'
+            // InternalDataDSL.g:56:7: ( 'where' )
+            // InternalDataDSL.g:56:9: 'where'
             {
-            match("markerEntity"); 
+            match("where"); 
 
 
             }
@@ -1159,10 +1172,10 @@
         try {
             int _type = T__59;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:57:7: ( 'markedBy' )
-            // InternalDataDSL.g:57:9: 'markedBy'
+            // InternalDataDSL.g:57:7: ( 'markerPath' )
+            // InternalDataDSL.g:57:9: 'markerPath'
             {
-            match("markedBy"); 
+            match("markerPath"); 
 
 
             }
@@ -1180,10 +1193,10 @@
         try {
             int _type = T__60;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:58:7: ( 'coding' )
-            // InternalDataDSL.g:58:9: 'coding'
+            // InternalDataDSL.g:58:7: ( 'markerEntity' )
+            // InternalDataDSL.g:58:9: 'markerEntity'
             {
-            match("coding"); 
+            match("markerEntity"); 
 
 
             }
@@ -1201,10 +1214,10 @@
         try {
             int _type = T__61;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:59:7: ( 'copy' )
-            // InternalDataDSL.g:59:9: 'copy'
+            // InternalDataDSL.g:59:7: ( 'markedBy' )
+            // InternalDataDSL.g:59:9: 'markedBy'
             {
-            match("copy"); 
+            match("markedBy"); 
 
 
             }
@@ -1222,10 +1235,10 @@
         try {
             int _type = T__62;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:60:7: ( 'from' )
-            // InternalDataDSL.g:60:9: 'from'
+            // InternalDataDSL.g:60:7: ( 'coding' )
+            // InternalDataDSL.g:60:9: 'coding'
             {
-            match("from"); 
+            match("coding"); 
 
 
             }
@@ -1243,10 +1256,10 @@
         try {
             int _type = T__63;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:61:7: ( 'property' )
-            // InternalDataDSL.g:61:9: 'property'
+            // InternalDataDSL.g:61:7: ( 'copy' )
+            // InternalDataDSL.g:61:9: 'copy'
             {
-            match("property"); 
+            match("copy"); 
 
 
             }
@@ -1264,10 +1277,10 @@
         try {
             int _type = T__64;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:62:7: ( 'ref' )
-            // InternalDataDSL.g:62:9: 'ref'
+            // InternalDataDSL.g:62:7: ( 'from' )
+            // InternalDataDSL.g:62:9: 'from'
             {
-            match("ref"); 
+            match("from"); 
 
 
             }
@@ -1285,10 +1298,10 @@
         try {
             int _type = T__65;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:63:7: ( 'where' )
-            // InternalDataDSL.g:63:9: 'where'
+            // InternalDataDSL.g:63:7: ( 'property' )
+            // InternalDataDSL.g:63:9: 'property'
             {
-            match("where"); 
+            match("property"); 
 
 
             }
@@ -1306,10 +1319,10 @@
         try {
             int _type = T__66;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:64:7: ( 'hide' )
-            // InternalDataDSL.g:64:9: 'hide'
+            // InternalDataDSL.g:64:7: ( 'ref' )
+            // InternalDataDSL.g:64:9: 'ref'
             {
-            match("hide"); 
+            match("ref"); 
 
 
             }
@@ -1327,10 +1340,10 @@
         try {
             int _type = T__67;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:65:7: ( 'assign' )
-            // InternalDataDSL.g:65:9: 'assign'
+            // InternalDataDSL.g:65:7: ( 'on' )
+            // InternalDataDSL.g:65:9: 'on'
             {
-            match("assign"); 
+            match("on"); 
 
 
             }
@@ -1348,10 +1361,10 @@
         try {
             int _type = T__68;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:66:7: ( 'as' )
-            // InternalDataDSL.g:66:9: 'as'
+            // InternalDataDSL.g:66:7: ( 'hide' )
+            // InternalDataDSL.g:66:9: 'hide'
             {
-            match("as"); 
+            match("hide"); 
 
 
             }
@@ -1369,10 +1382,10 @@
         try {
             int _type = T__69;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:67:7: ( 'map' )
-            // InternalDataDSL.g:67:9: 'map'
+            // InternalDataDSL.g:67:7: ( 'assign' )
+            // InternalDataDSL.g:67:9: 'assign'
             {
-            match("map"); 
+            match("assign"); 
 
 
             }
@@ -1390,10 +1403,10 @@
         try {
             int _type = T__70;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:68:7: ( 'to' )
-            // InternalDataDSL.g:68:9: 'to'
+            // InternalDataDSL.g:68:7: ( 'with' )
+            // InternalDataDSL.g:68:9: 'with'
             {
-            match("to"); 
+            match("with"); 
 
 
             }
@@ -1411,10 +1424,10 @@
         try {
             int _type = T__71;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:69:7: ( 'mapBlob' )
-            // InternalDataDSL.g:69:9: 'mapBlob'
+            // InternalDataDSL.g:69:7: ( 'as' )
+            // InternalDataDSL.g:69:9: 'as'
             {
-            match("mapBlob"); 
+            match("as"); 
 
 
             }
@@ -1432,10 +1445,10 @@
         try {
             int _type = T__72;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:70:7: ( 'extension' )
-            // InternalDataDSL.g:70:9: 'extension'
+            // InternalDataDSL.g:70:7: ( 'map' )
+            // InternalDataDSL.g:70:9: 'map'
             {
-            match("extension"); 
+            match("map"); 
 
 
             }
@@ -1453,10 +1466,10 @@
         try {
             int _type = T__73;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:71:7: ( 'mimeType' )
-            // InternalDataDSL.g:71:9: 'mimeType'
+            // InternalDataDSL.g:71:7: ( 'to' )
+            // InternalDataDSL.g:71:9: 'to'
             {
-            match("mimeType"); 
+            match("to"); 
 
 
             }
@@ -1474,10 +1487,11 @@
         try {
             int _type = T__74;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:72:7: ( '.' )
-            // InternalDataDSL.g:72:9: '.'
+            // InternalDataDSL.g:72:7: ( 'mapBlob' )
+            // InternalDataDSL.g:72:9: 'mapBlob'
             {
-            match('.'); 
+            match("mapBlob"); 
+
 
             }
 
@@ -1494,10 +1508,10 @@
         try {
             int _type = T__75;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:73:7: ( 'import' )
-            // InternalDataDSL.g:73:9: 'import'
+            // InternalDataDSL.g:73:7: ( 'extension' )
+            // InternalDataDSL.g:73:9: 'extension'
             {
-            match("import"); 
+            match("extension"); 
 
 
             }
@@ -1515,10 +1529,10 @@
         try {
             int _type = T__76;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:74:7: ( 'static' )
-            // InternalDataDSL.g:74:9: 'static'
+            // InternalDataDSL.g:74:7: ( 'mimeType' )
+            // InternalDataDSL.g:74:9: 'mimeType'
             {
-            match("static"); 
+            match("mimeType"); 
 
 
             }
@@ -1536,10 +1550,11 @@
         try {
             int _type = T__77;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:75:7: ( '*' )
-            // InternalDataDSL.g:75:9: '*'
+            // InternalDataDSL.g:75:7: ( 'mapFixedLength' )
+            // InternalDataDSL.g:75:9: 'mapFixedLength'
             {
-            match('*'); 
+            match("mapFixedLength"); 
+
 
             }
 
@@ -1556,10 +1571,10 @@
         try {
             int _type = T__78;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:76:7: ( 'ns' )
-            // InternalDataDSL.g:76:9: 'ns'
+            // InternalDataDSL.g:76:7: ( 'length' )
+            // InternalDataDSL.g:76:9: 'length'
             {
-            match("ns"); 
+            match("length"); 
 
 
             }
@@ -1577,10 +1592,11 @@
         try {
             int _type = T__79;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:77:7: ( ';' )
-            // InternalDataDSL.g:77:9: ';'
+            // InternalDataDSL.g:77:7: ( 'trim' )
+            // InternalDataDSL.g:77:9: 'trim'
             {
-            match(';'); 
+            match("trim"); 
+
 
             }
 
@@ -1597,10 +1613,11 @@
         try {
             int _type = T__80;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:78:7: ( '@' )
-            // InternalDataDSL.g:78:9: '@'
+            // InternalDataDSL.g:78:7: ( 'leftTrim' )
+            // InternalDataDSL.g:78:9: 'leftTrim'
             {
-            match('@'); 
+            match("leftTrim"); 
+
 
             }
 
@@ -1617,10 +1634,11 @@
         try {
             int _type = T__81;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:79:7: ( '(' )
-            // InternalDataDSL.g:79:9: '('
+            // InternalDataDSL.g:79:7: ( 'rightTrim' )
+            // InternalDataDSL.g:79:9: 'rightTrim'
             {
-            match('('); 
+            match("rightTrim"); 
+
 
             }
 
@@ -1637,10 +1655,11 @@
         try {
             int _type = T__82;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:80:7: ( ',' )
-            // InternalDataDSL.g:80:9: ','
+            // InternalDataDSL.g:80:7: ( 'lowerCase' )
+            // InternalDataDSL.g:80:9: 'lowerCase'
             {
-            match(','); 
+            match("lowerCase"); 
+
 
             }
 
@@ -1657,10 +1676,11 @@
         try {
             int _type = T__83;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:81:7: ( ')' )
-            // InternalDataDSL.g:81:9: ')'
+            // InternalDataDSL.g:81:7: ( 'upperCase' )
+            // InternalDataDSL.g:81:9: 'upperCase'
             {
-            match(')'); 
+            match("upperCase"); 
+
 
             }
 
@@ -1677,10 +1697,11 @@
         try {
             int _type = T__84;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:82:7: ( '=' )
-            // InternalDataDSL.g:82:9: '='
+            // InternalDataDSL.g:82:7: ( 'capitalizeFirstWord' )
+            // InternalDataDSL.g:82:9: 'capitalizeFirstWord'
             {
-            match('='); 
+            match("capitalizeFirstWord"); 
+
 
             }
 
@@ -1697,10 +1718,11 @@
         try {
             int _type = T__85;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:83:7: ( '#' )
-            // InternalDataDSL.g:83:9: '#'
+            // InternalDataDSL.g:83:7: ( 'uncapitalizeFirstWord' )
+            // InternalDataDSL.g:83:9: 'uncapitalizeFirstWord'
             {
-            match('#'); 
+            match("uncapitalizeFirstWord"); 
+
 
             }
 
@@ -1717,10 +1739,11 @@
         try {
             int _type = T__86;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:84:7: ( '[' )
-            // InternalDataDSL.g:84:9: '['
+            // InternalDataDSL.g:84:7: ( 'capitalize' )
+            // InternalDataDSL.g:84:9: 'capitalize'
             {
-            match('['); 
+            match("capitalize"); 
+
 
             }
 
@@ -1737,10 +1760,10 @@
         try {
             int _type = T__87;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:85:7: ( ']' )
-            // InternalDataDSL.g:85:9: ']'
+            // InternalDataDSL.g:85:7: ( '.' )
+            // InternalDataDSL.g:85:9: '.'
             {
-            match(']'); 
+            match('.'); 
 
             }
 
@@ -1757,10 +1780,10 @@
         try {
             int _type = T__88;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:86:7: ( '+=' )
-            // InternalDataDSL.g:86:9: '+='
+            // InternalDataDSL.g:86:7: ( 'import' )
+            // InternalDataDSL.g:86:9: 'import'
             {
-            match("+="); 
+            match("import"); 
 
 
             }
@@ -1778,10 +1801,10 @@
         try {
             int _type = T__89;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:87:7: ( '-=' )
-            // InternalDataDSL.g:87:9: '-='
+            // InternalDataDSL.g:87:7: ( 'static' )
+            // InternalDataDSL.g:87:9: 'static'
             {
-            match("-="); 
+            match("static"); 
 
 
             }
@@ -1799,11 +1822,10 @@
         try {
             int _type = T__90;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:88:7: ( '*=' )
-            // InternalDataDSL.g:88:9: '*='
+            // InternalDataDSL.g:88:7: ( '*' )
+            // InternalDataDSL.g:88:9: '*'
             {
-            match("*="); 
-
+            match('*'); 
 
             }
 
@@ -1820,10 +1842,10 @@
         try {
             int _type = T__91;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:89:7: ( '/=' )
-            // InternalDataDSL.g:89:9: '/='
+            // InternalDataDSL.g:89:7: ( 'ns' )
+            // InternalDataDSL.g:89:9: 'ns'
             {
-            match("/="); 
+            match("ns"); 
 
 
             }
@@ -1841,11 +1863,10 @@
         try {
             int _type = T__92;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:90:7: ( '%=' )
-            // InternalDataDSL.g:90:9: '%='
+            // InternalDataDSL.g:90:7: ( ';' )
+            // InternalDataDSL.g:90:9: ';'
             {
-            match("%="); 
-
+            match(';'); 
 
             }
 
@@ -1862,10 +1883,10 @@
         try {
             int _type = T__93;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:91:7: ( '<' )
-            // InternalDataDSL.g:91:9: '<'
+            // InternalDataDSL.g:91:7: ( '@' )
+            // InternalDataDSL.g:91:9: '@'
             {
-            match('<'); 
+            match('@'); 
 
             }
 
@@ -1882,10 +1903,10 @@
         try {
             int _type = T__94;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:92:7: ( '>' )
-            // InternalDataDSL.g:92:9: '>'
+            // InternalDataDSL.g:92:7: ( '(' )
+            // InternalDataDSL.g:92:9: '('
             {
-            match('>'); 
+            match('('); 
 
             }
 
@@ -1902,11 +1923,10 @@
         try {
             int _type = T__95;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:93:7: ( '>=' )
-            // InternalDataDSL.g:93:9: '>='
+            // InternalDataDSL.g:93:7: ( ',' )
+            // InternalDataDSL.g:93:9: ','
             {
-            match(">="); 
-
+            match(','); 
 
             }
 
@@ -1923,11 +1943,10 @@
         try {
             int _type = T__96;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:94:7: ( '||' )
-            // InternalDataDSL.g:94:9: '||'
+            // InternalDataDSL.g:94:7: ( ')' )
+            // InternalDataDSL.g:94:9: ')'
             {
-            match("||"); 
-
+            match(')'); 
 
             }
 
@@ -1944,11 +1963,10 @@
         try {
             int _type = T__97;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:95:7: ( '&&' )
-            // InternalDataDSL.g:95:9: '&&'
+            // InternalDataDSL.g:95:7: ( '=' )
+            // InternalDataDSL.g:95:9: '='
             {
-            match("&&"); 
-
+            match('='); 
 
             }
 
@@ -1965,11 +1983,10 @@
         try {
             int _type = T__98;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:96:7: ( '==' )
-            // InternalDataDSL.g:96:9: '=='
+            // InternalDataDSL.g:96:7: ( '#' )
+            // InternalDataDSL.g:96:9: '#'
             {
-            match("=="); 
-
+            match('#'); 
 
             }
 
@@ -1986,11 +2003,10 @@
         try {
             int _type = T__99;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:97:7: ( '!=' )
-            // InternalDataDSL.g:97:9: '!='
+            // InternalDataDSL.g:97:7: ( '[' )
+            // InternalDataDSL.g:97:9: '['
             {
-            match("!="); 
-
+            match('['); 
 
             }
 
@@ -2007,11 +2023,10 @@
         try {
             int _type = T__100;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:98:8: ( '===' )
-            // InternalDataDSL.g:98:10: '==='
+            // InternalDataDSL.g:98:8: ( ']' )
+            // InternalDataDSL.g:98:10: ']'
             {
-            match("==="); 
-
+            match(']'); 
 
             }
 
@@ -2028,10 +2043,10 @@
         try {
             int _type = T__101;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:99:8: ( '!==' )
-            // InternalDataDSL.g:99:10: '!=='
+            // InternalDataDSL.g:99:8: ( '+=' )
+            // InternalDataDSL.g:99:10: '+='
             {
-            match("!=="); 
+            match("+="); 
 
 
             }
@@ -2049,10 +2064,10 @@
         try {
             int _type = T__102;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:100:8: ( 'instanceof' )
-            // InternalDataDSL.g:100:10: 'instanceof'
+            // InternalDataDSL.g:100:8: ( '-=' )
+            // InternalDataDSL.g:100:10: '-='
             {
-            match("instanceof"); 
+            match("-="); 
 
 
             }
@@ -2070,10 +2085,10 @@
         try {
             int _type = T__103;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:101:8: ( '->' )
-            // InternalDataDSL.g:101:10: '->'
+            // InternalDataDSL.g:101:8: ( '*=' )
+            // InternalDataDSL.g:101:10: '*='
             {
-            match("->"); 
+            match("*="); 
 
 
             }
@@ -2091,10 +2106,10 @@
         try {
             int _type = T__104;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:102:8: ( '..<' )
-            // InternalDataDSL.g:102:10: '..<'
+            // InternalDataDSL.g:102:8: ( '/=' )
+            // InternalDataDSL.g:102:10: '/='
             {
-            match("..<"); 
+            match("/="); 
 
 
             }
@@ -2112,10 +2127,10 @@
         try {
             int _type = T__105;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:103:8: ( '..' )
-            // InternalDataDSL.g:103:10: '..'
+            // InternalDataDSL.g:103:8: ( '%=' )
+            // InternalDataDSL.g:103:10: '%='
             {
-            match(".."); 
+            match("%="); 
 
 
             }
@@ -2133,11 +2148,10 @@
         try {
             int _type = T__106;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:104:8: ( '=>' )
-            // InternalDataDSL.g:104:10: '=>'
+            // InternalDataDSL.g:104:8: ( '<' )
+            // InternalDataDSL.g:104:10: '<'
             {
-            match("=>"); 
-
+            match('<'); 
 
             }
 
@@ -2154,11 +2168,10 @@
         try {
             int _type = T__107;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:105:8: ( '<>' )
-            // InternalDataDSL.g:105:10: '<>'
+            // InternalDataDSL.g:105:8: ( '>' )
+            // InternalDataDSL.g:105:10: '>'
             {
-            match("<>"); 
-
+            match('>'); 
 
             }
 
@@ -2175,10 +2188,10 @@
         try {
             int _type = T__108;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:106:8: ( '?:' )
-            // InternalDataDSL.g:106:10: '?:'
+            // InternalDataDSL.g:106:8: ( '>=' )
+            // InternalDataDSL.g:106:10: '>='
             {
-            match("?:"); 
+            match(">="); 
 
 
             }
@@ -2196,10 +2209,11 @@
         try {
             int _type = T__109;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:107:8: ( '+' )
-            // InternalDataDSL.g:107:10: '+'
+            // InternalDataDSL.g:107:8: ( '||' )
+            // InternalDataDSL.g:107:10: '||'
             {
-            match('+'); 
+            match("||"); 
+
 
             }
 
@@ -2216,10 +2230,11 @@
         try {
             int _type = T__110;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:108:8: ( '-' )
-            // InternalDataDSL.g:108:10: '-'
+            // InternalDataDSL.g:108:8: ( '&&' )
+            // InternalDataDSL.g:108:10: '&&'
             {
-            match('-'); 
+            match("&&"); 
+
 
             }
 
@@ -2236,10 +2251,10 @@
         try {
             int _type = T__111;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:109:8: ( '**' )
-            // InternalDataDSL.g:109:10: '**'
+            // InternalDataDSL.g:109:8: ( '==' )
+            // InternalDataDSL.g:109:10: '=='
             {
-            match("**"); 
+            match("=="); 
 
 
             }
@@ -2257,10 +2272,11 @@
         try {
             int _type = T__112;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:110:8: ( '/' )
-            // InternalDataDSL.g:110:10: '/'
+            // InternalDataDSL.g:110:8: ( '!=' )
+            // InternalDataDSL.g:110:10: '!='
             {
-            match('/'); 
+            match("!="); 
+
 
             }
 
@@ -2277,10 +2293,11 @@
         try {
             int _type = T__113;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:111:8: ( '%' )
-            // InternalDataDSL.g:111:10: '%'
+            // InternalDataDSL.g:111:8: ( '===' )
+            // InternalDataDSL.g:111:10: '==='
             {
-            match('%'); 
+            match("==="); 
+
 
             }
 
@@ -2297,10 +2314,11 @@
         try {
             int _type = T__114;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:112:8: ( '!' )
-            // InternalDataDSL.g:112:10: '!'
+            // InternalDataDSL.g:112:8: ( '!==' )
+            // InternalDataDSL.g:112:10: '!=='
             {
-            match('!'); 
+            match("!=="); 
+
 
             }
 
@@ -2317,10 +2335,10 @@
         try {
             int _type = T__115;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:113:8: ( '++' )
-            // InternalDataDSL.g:113:10: '++'
+            // InternalDataDSL.g:113:8: ( 'instanceof' )
+            // InternalDataDSL.g:113:10: 'instanceof'
             {
-            match("++"); 
+            match("instanceof"); 
 
 
             }
@@ -2338,10 +2356,10 @@
         try {
             int _type = T__116;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:114:8: ( '--' )
-            // InternalDataDSL.g:114:10: '--'
+            // InternalDataDSL.g:114:8: ( '->' )
+            // InternalDataDSL.g:114:10: '->'
             {
-            match("--"); 
+            match("->"); 
 
 
             }
@@ -2359,10 +2377,10 @@
         try {
             int _type = T__117;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:115:8: ( '::' )
-            // InternalDataDSL.g:115:10: '::'
+            // InternalDataDSL.g:115:8: ( '..<' )
+            // InternalDataDSL.g:115:10: '..<'
             {
-            match("::"); 
+            match("..<"); 
 
 
             }
@@ -2380,10 +2398,10 @@
         try {
             int _type = T__118;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:116:8: ( '?.' )
-            // InternalDataDSL.g:116:10: '?.'
+            // InternalDataDSL.g:116:8: ( '..' )
+            // InternalDataDSL.g:116:10: '..'
             {
-            match("?."); 
+            match(".."); 
 
 
             }
@@ -2401,10 +2419,11 @@
         try {
             int _type = T__119;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:117:8: ( '|' )
-            // InternalDataDSL.g:117:10: '|'
+            // InternalDataDSL.g:117:8: ( '=>' )
+            // InternalDataDSL.g:117:10: '=>'
             {
-            match('|'); 
+            match("=>"); 
+
 
             }
 
@@ -2421,10 +2440,10 @@
         try {
             int _type = T__120;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:118:8: ( 'if' )
-            // InternalDataDSL.g:118:10: 'if'
+            // InternalDataDSL.g:118:8: ( '<>' )
+            // InternalDataDSL.g:118:10: '<>'
             {
-            match("if"); 
+            match("<>"); 
 
 
             }
@@ -2442,10 +2461,10 @@
         try {
             int _type = T__121;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:119:8: ( 'else' )
-            // InternalDataDSL.g:119:10: 'else'
+            // InternalDataDSL.g:119:8: ( '?:' )
+            // InternalDataDSL.g:119:10: '?:'
             {
-            match("else"); 
+            match("?:"); 
 
 
             }
@@ -2463,11 +2482,10 @@
         try {
             int _type = T__122;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:120:8: ( 'switch' )
-            // InternalDataDSL.g:120:10: 'switch'
+            // InternalDataDSL.g:120:8: ( '+' )
+            // InternalDataDSL.g:120:10: '+'
             {
-            match("switch"); 
-
+            match('+'); 
 
             }
 
@@ -2484,10 +2502,10 @@
         try {
             int _type = T__123;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:121:8: ( ':' )
-            // InternalDataDSL.g:121:10: ':'
+            // InternalDataDSL.g:121:8: ( '-' )
+            // InternalDataDSL.g:121:10: '-'
             {
-            match(':'); 
+            match('-'); 
 
             }
 
@@ -2504,10 +2522,10 @@
         try {
             int _type = T__124;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:122:8: ( 'default' )
-            // InternalDataDSL.g:122:10: 'default'
+            // InternalDataDSL.g:122:8: ( '**' )
+            // InternalDataDSL.g:122:10: '**'
             {
-            match("default"); 
+            match("**"); 
 
 
             }
@@ -2525,11 +2543,10 @@
         try {
             int _type = T__125;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:123:8: ( 'case' )
-            // InternalDataDSL.g:123:10: 'case'
+            // InternalDataDSL.g:123:8: ( '/' )
+            // InternalDataDSL.g:123:10: '/'
             {
-            match("case"); 
-
+            match('/'); 
 
             }
 
@@ -2546,11 +2563,10 @@
         try {
             int _type = T__126;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:124:8: ( 'while' )
-            // InternalDataDSL.g:124:10: 'while'
+            // InternalDataDSL.g:124:8: ( '%' )
+            // InternalDataDSL.g:124:10: '%'
             {
-            match("while"); 
-
+            match('%'); 
 
             }
 
@@ -2567,11 +2583,10 @@
         try {
             int _type = T__127;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:125:8: ( 'do' )
-            // InternalDataDSL.g:125:10: 'do'
+            // InternalDataDSL.g:125:8: ( '!' )
+            // InternalDataDSL.g:125:10: '!'
             {
-            match("do"); 
-
+            match('!'); 
 
             }
 
@@ -2588,10 +2603,10 @@
         try {
             int _type = T__128;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:126:8: ( 'var' )
-            // InternalDataDSL.g:126:10: 'var'
+            // InternalDataDSL.g:126:8: ( '++' )
+            // InternalDataDSL.g:126:10: '++'
             {
-            match("var"); 
+            match("++"); 
 
 
             }
@@ -2609,10 +2624,10 @@
         try {
             int _type = T__129;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:127:8: ( 'val' )
-            // InternalDataDSL.g:127:10: 'val'
+            // InternalDataDSL.g:127:8: ( '--' )
+            // InternalDataDSL.g:127:10: '--'
             {
-            match("val"); 
+            match("--"); 
 
 
             }
@@ -2630,10 +2645,10 @@
         try {
             int _type = T__130;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:128:8: ( 'extends' )
-            // InternalDataDSL.g:128:10: 'extends'
+            // InternalDataDSL.g:128:8: ( '::' )
+            // InternalDataDSL.g:128:10: '::'
             {
-            match("extends"); 
+            match("::"); 
 
 
             }
@@ -2651,10 +2666,10 @@
         try {
             int _type = T__131;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:129:8: ( 'super' )
-            // InternalDataDSL.g:129:10: 'super'
+            // InternalDataDSL.g:129:8: ( '?.' )
+            // InternalDataDSL.g:129:10: '?.'
             {
-            match("super"); 
+            match("?."); 
 
 
             }
@@ -2672,11 +2687,10 @@
         try {
             int _type = T__132;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:130:8: ( 'new' )
-            // InternalDataDSL.g:130:10: 'new'
+            // InternalDataDSL.g:130:8: ( '|' )
+            // InternalDataDSL.g:130:10: '|'
             {
-            match("new"); 
-
+            match('|'); 
 
             }
 
@@ -2693,10 +2707,10 @@
         try {
             int _type = T__133;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:131:8: ( 'false' )
-            // InternalDataDSL.g:131:10: 'false'
+            // InternalDataDSL.g:131:8: ( 'if' )
+            // InternalDataDSL.g:131:10: 'if'
             {
-            match("false"); 
+            match("if"); 
 
 
             }
@@ -2714,10 +2728,10 @@
         try {
             int _type = T__134;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:132:8: ( 'true' )
-            // InternalDataDSL.g:132:10: 'true'
+            // InternalDataDSL.g:132:8: ( 'else' )
+            // InternalDataDSL.g:132:10: 'else'
             {
-            match("true"); 
+            match("else"); 
 
 
             }
@@ -2735,10 +2749,10 @@
         try {
             int _type = T__135;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:133:8: ( 'null' )
-            // InternalDataDSL.g:133:10: 'null'
+            // InternalDataDSL.g:133:8: ( 'switch' )
+            // InternalDataDSL.g:133:10: 'switch'
             {
-            match("null"); 
+            match("switch"); 
 
 
             }
@@ -2756,11 +2770,10 @@
         try {
             int _type = T__136;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:134:8: ( 'typeof' )
-            // InternalDataDSL.g:134:10: 'typeof'
+            // InternalDataDSL.g:134:8: ( ':' )
+            // InternalDataDSL.g:134:10: ':'
             {
-            match("typeof"); 
-
+            match(':'); 
 
             }
 
@@ -2777,10 +2790,10 @@
         try {
             int _type = T__137;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:135:8: ( 'throw' )
-            // InternalDataDSL.g:135:10: 'throw'
+            // InternalDataDSL.g:135:8: ( 'default' )
+            // InternalDataDSL.g:135:10: 'default'
             {
-            match("throw"); 
+            match("default"); 
 
 
             }
@@ -2798,10 +2811,10 @@
         try {
             int _type = T__138;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:136:8: ( 'return' )
-            // InternalDataDSL.g:136:10: 'return'
+            // InternalDataDSL.g:136:8: ( 'case' )
+            // InternalDataDSL.g:136:10: 'case'
             {
-            match("return"); 
+            match("case"); 
 
 
             }
@@ -2819,10 +2832,10 @@
         try {
             int _type = T__139;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:137:8: ( 'try' )
-            // InternalDataDSL.g:137:10: 'try'
+            // InternalDataDSL.g:137:8: ( 'while' )
+            // InternalDataDSL.g:137:10: 'while'
             {
-            match("try"); 
+            match("while"); 
 
 
             }
@@ -2840,10 +2853,10 @@
         try {
             int _type = T__140;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:138:8: ( 'finally' )
-            // InternalDataDSL.g:138:10: 'finally'
+            // InternalDataDSL.g:138:8: ( 'do' )
+            // InternalDataDSL.g:138:10: 'do'
             {
-            match("finally"); 
+            match("do"); 
 
 
             }
@@ -2861,10 +2874,10 @@
         try {
             int _type = T__141;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:139:8: ( 'synchronized' )
-            // InternalDataDSL.g:139:10: 'synchronized'
+            // InternalDataDSL.g:139:8: ( 'var' )
+            // InternalDataDSL.g:139:10: 'var'
             {
-            match("synchronized"); 
+            match("var"); 
 
 
             }
@@ -2882,10 +2895,10 @@
         try {
             int _type = T__142;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:140:8: ( 'catch' )
-            // InternalDataDSL.g:140:10: 'catch'
+            // InternalDataDSL.g:140:8: ( 'val' )
+            // InternalDataDSL.g:140:10: 'val'
             {
-            match("catch"); 
+            match("val"); 
 
 
             }
@@ -2903,10 +2916,11 @@
         try {
             int _type = T__143;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:141:8: ( '?' )
-            // InternalDataDSL.g:141:10: '?'
+            // InternalDataDSL.g:141:8: ( 'extends' )
+            // InternalDataDSL.g:141:10: 'extends'
             {
-            match('?'); 
+            match("extends"); 
+
 
             }
 
@@ -2923,10 +2937,11 @@
         try {
             int _type = T__144;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:142:8: ( '&' )
-            // InternalDataDSL.g:142:10: '&'
+            // InternalDataDSL.g:142:8: ( 'super' )
+            // InternalDataDSL.g:142:10: 'super'
             {
-            match('&'); 
+            match("super"); 
+
 
             }
 
@@ -2943,10 +2958,10 @@
         try {
             int _type = T__145;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:143:8: ( 'plain' )
-            // InternalDataDSL.g:143:10: 'plain'
+            // InternalDataDSL.g:143:8: ( 'new' )
+            // InternalDataDSL.g:143:10: 'new'
             {
-            match("plain"); 
+            match("new"); 
 
 
             }
@@ -2964,10 +2979,10 @@
         try {
             int _type = T__146;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:144:8: ( 'jpg' )
-            // InternalDataDSL.g:144:10: 'jpg'
+            // InternalDataDSL.g:144:8: ( 'false' )
+            // InternalDataDSL.g:144:10: 'false'
             {
-            match("jpg"); 
+            match("false"); 
 
 
             }
@@ -2985,10 +3000,10 @@
         try {
             int _type = T__147;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:145:8: ( 'png' )
-            // InternalDataDSL.g:145:10: 'png'
+            // InternalDataDSL.g:145:8: ( 'true' )
+            // InternalDataDSL.g:145:10: 'true'
             {
-            match("png"); 
+            match("true"); 
 
 
             }
@@ -3006,10 +3021,10 @@
         try {
             int _type = T__148;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:146:8: ( 'mpeg' )
-            // InternalDataDSL.g:146:10: 'mpeg'
+            // InternalDataDSL.g:146:8: ( 'null' )
+            // InternalDataDSL.g:146:10: 'null'
             {
-            match("mpeg"); 
+            match("null"); 
 
 
             }
@@ -3027,10 +3042,10 @@
         try {
             int _type = T__149;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:147:8: ( 'octet-stream' )
-            // InternalDataDSL.g:147:10: 'octet-stream'
+            // InternalDataDSL.g:147:8: ( 'typeof' )
+            // InternalDataDSL.g:147:10: 'typeof'
             {
-            match("octet-stream"); 
+            match("typeof"); 
 
 
             }
@@ -3048,10 +3063,10 @@
         try {
             int _type = T__150;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:148:8: ( 'pdf' )
-            // InternalDataDSL.g:148:10: 'pdf'
+            // InternalDataDSL.g:148:8: ( 'throw' )
+            // InternalDataDSL.g:148:10: 'throw'
             {
-            match("pdf"); 
+            match("throw"); 
 
 
             }
@@ -3069,10 +3084,10 @@
         try {
             int _type = T__151;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:149:8: ( 'NowDate' )
-            // InternalDataDSL.g:149:10: 'NowDate'
+            // InternalDataDSL.g:149:8: ( 'return' )
+            // InternalDataDSL.g:149:10: 'return'
             {
-            match("NowDate"); 
+            match("return"); 
 
 
             }
@@ -3090,10 +3105,10 @@
         try {
             int _type = T__152;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:150:8: ( 'StartDate' )
-            // InternalDataDSL.g:150:10: 'StartDate'
+            // InternalDataDSL.g:150:8: ( 'try' )
+            // InternalDataDSL.g:150:10: 'try'
             {
-            match("StartDate"); 
+            match("try"); 
 
 
             }
@@ -3111,10 +3126,10 @@
         try {
             int _type = T__153;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:151:8: ( 'UniversallyUniqueIdentifier' )
-            // InternalDataDSL.g:151:10: 'UniversallyUniqueIdentifier'
+            // InternalDataDSL.g:151:8: ( 'finally' )
+            // InternalDataDSL.g:151:10: 'finally'
             {
-            match("UniversallyUniqueIdentifier"); 
+            match("finally"); 
 
 
             }
@@ -3132,10 +3147,10 @@
         try {
             int _type = T__154;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:152:8: ( 'Date' )
-            // InternalDataDSL.g:152:10: 'Date'
+            // InternalDataDSL.g:152:8: ( 'synchronized' )
+            // InternalDataDSL.g:152:10: 'synchronized'
             {
-            match("Date"); 
+            match("synchronized"); 
 
 
             }
@@ -3153,10 +3168,10 @@
         try {
             int _type = T__155;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:153:8: ( 'Milliseconds' )
-            // InternalDataDSL.g:153:10: 'Milliseconds'
+            // InternalDataDSL.g:153:8: ( 'catch' )
+            // InternalDataDSL.g:153:10: 'catch'
             {
-            match("Milliseconds"); 
+            match("catch"); 
 
 
             }
@@ -3174,11 +3189,10 @@
         try {
             int _type = T__156;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:154:8: ( 'Nanoseconds' )
-            // InternalDataDSL.g:154:10: 'Nanoseconds'
+            // InternalDataDSL.g:154:8: ( '?' )
+            // InternalDataDSL.g:154:10: '?'
             {
-            match("Nanoseconds"); 
-
+            match('?'); 
 
             }
 
@@ -3195,11 +3209,10 @@
         try {
             int _type = T__157;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:155:8: ( 'Random' )
-            // InternalDataDSL.g:155:10: 'Random'
+            // InternalDataDSL.g:155:8: ( '&' )
+            // InternalDataDSL.g:155:10: '&'
             {
-            match("Random"); 
-
+            match('&'); 
 
             }
 
@@ -3216,10 +3229,10 @@
         try {
             int _type = T__158;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:156:8: ( 'ExecuteContext' )
-            // InternalDataDSL.g:156:10: 'ExecuteContext'
+            // InternalDataDSL.g:156:8: ( 'plain' )
+            // InternalDataDSL.g:156:10: 'plain'
             {
-            match("ExecuteContext"); 
+            match("plain"); 
 
 
             }
@@ -3237,10 +3250,10 @@
         try {
             int _type = T__159;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:157:8: ( 'persist' )
-            // InternalDataDSL.g:157:10: 'persist'
+            // InternalDataDSL.g:157:8: ( 'jpg' )
+            // InternalDataDSL.g:157:10: 'jpg'
             {
-            match("persist"); 
+            match("jpg"); 
 
 
             }
@@ -3258,10 +3271,10 @@
         try {
             int _type = T__160;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:158:8: ( 'merge' )
-            // InternalDataDSL.g:158:10: 'merge'
+            // InternalDataDSL.g:158:8: ( 'png' )
+            // InternalDataDSL.g:158:10: 'png'
             {
-            match("merge"); 
+            match("png"); 
 
 
             }
@@ -3279,10 +3292,10 @@
         try {
             int _type = T__161;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:159:8: ( 'remove' )
-            // InternalDataDSL.g:159:10: 'remove'
+            // InternalDataDSL.g:159:8: ( 'mpeg' )
+            // InternalDataDSL.g:159:10: 'mpeg'
             {
-            match("remove"); 
+            match("mpeg"); 
 
 
             }
@@ -3300,10 +3313,10 @@
         try {
             int _type = T__162;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:160:8: ( '<=' )
-            // InternalDataDSL.g:160:10: '<='
+            // InternalDataDSL.g:160:8: ( 'octet-stream' )
+            // InternalDataDSL.g:160:10: 'octet-stream'
             {
-            match("<="); 
+            match("octet-stream"); 
 
 
             }
@@ -3321,10 +3334,10 @@
         try {
             int _type = T__163;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:161:8: ( 'isnull' )
-            // InternalDataDSL.g:161:10: 'isnull'
+            // InternalDataDSL.g:161:8: ( 'pdf' )
+            // InternalDataDSL.g:161:10: 'pdf'
             {
-            match("isnull"); 
+            match("pdf"); 
 
 
             }
@@ -3342,10 +3355,10 @@
         try {
             int _type = T__164;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:162:8: ( 'isnotnull' )
-            // InternalDataDSL.g:162:10: 'isnotnull'
+            // InternalDataDSL.g:162:8: ( 'NowDate' )
+            // InternalDataDSL.g:162:10: 'NowDate'
             {
-            match("isnotnull"); 
+            match("NowDate"); 
 
 
             }
@@ -3363,10 +3376,10 @@
         try {
             int _type = T__165;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:163:8: ( 'and' )
-            // InternalDataDSL.g:163:10: 'and'
+            // InternalDataDSL.g:163:8: ( 'StartDate' )
+            // InternalDataDSL.g:163:10: 'StartDate'
             {
-            match("and"); 
+            match("StartDate"); 
 
 
             }
@@ -3384,10 +3397,10 @@
         try {
             int _type = T__166;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:164:8: ( 'or' )
-            // InternalDataDSL.g:164:10: 'or'
+            // InternalDataDSL.g:164:8: ( 'UniversallyUniqueIdentifier' )
+            // InternalDataDSL.g:164:10: 'UniversallyUniqueIdentifier'
             {
-            match("or"); 
+            match("UniversallyUniqueIdentifier"); 
 
 
             }
@@ -3400,15 +3413,288 @@
     }
     // $ANTLR end "T__166"
 
+    // $ANTLR start "T__167"
+    public final void mT__167() throws RecognitionException {
+        try {
+            int _type = T__167;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:165:8: ( 'Date' )
+            // InternalDataDSL.g:165:10: 'Date'
+            {
+            match("Date"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__167"
+
+    // $ANTLR start "T__168"
+    public final void mT__168() throws RecognitionException {
+        try {
+            int _type = T__168;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:166:8: ( 'Milliseconds' )
+            // InternalDataDSL.g:166:10: 'Milliseconds'
+            {
+            match("Milliseconds"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__168"
+
+    // $ANTLR start "T__169"
+    public final void mT__169() throws RecognitionException {
+        try {
+            int _type = T__169;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:167:8: ( 'Nanoseconds' )
+            // InternalDataDSL.g:167:10: 'Nanoseconds'
+            {
+            match("Nanoseconds"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__169"
+
+    // $ANTLR start "T__170"
+    public final void mT__170() throws RecognitionException {
+        try {
+            int _type = T__170;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:168:8: ( 'Random' )
+            // InternalDataDSL.g:168:10: 'Random'
+            {
+            match("Random"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__170"
+
+    // $ANTLR start "T__171"
+    public final void mT__171() throws RecognitionException {
+        try {
+            int _type = T__171;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:169:8: ( 'ExecuteContext' )
+            // InternalDataDSL.g:169:10: 'ExecuteContext'
+            {
+            match("ExecuteContext"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__171"
+
+    // $ANTLR start "T__172"
+    public final void mT__172() throws RecognitionException {
+        try {
+            int _type = T__172;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:170:8: ( 'persist' )
+            // InternalDataDSL.g:170:10: 'persist'
+            {
+            match("persist"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__172"
+
+    // $ANTLR start "T__173"
+    public final void mT__173() throws RecognitionException {
+        try {
+            int _type = T__173;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:171:8: ( 'merge' )
+            // InternalDataDSL.g:171:10: 'merge'
+            {
+            match("merge"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__173"
+
+    // $ANTLR start "T__174"
+    public final void mT__174() throws RecognitionException {
+        try {
+            int _type = T__174;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:172:8: ( 'remove' )
+            // InternalDataDSL.g:172:10: 'remove'
+            {
+            match("remove"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__174"
+
+    // $ANTLR start "T__175"
+    public final void mT__175() throws RecognitionException {
+        try {
+            int _type = T__175;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:173:8: ( '<=' )
+            // InternalDataDSL.g:173:10: '<='
+            {
+            match("<="); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__175"
+
+    // $ANTLR start "T__176"
+    public final void mT__176() throws RecognitionException {
+        try {
+            int _type = T__176;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:174:8: ( 'isnull' )
+            // InternalDataDSL.g:174:10: 'isnull'
+            {
+            match("isnull"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__176"
+
+    // $ANTLR start "T__177"
+    public final void mT__177() throws RecognitionException {
+        try {
+            int _type = T__177;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:175:8: ( 'isnotnull' )
+            // InternalDataDSL.g:175:10: 'isnotnull'
+            {
+            match("isnotnull"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__177"
+
+    // $ANTLR start "T__178"
+    public final void mT__178() throws RecognitionException {
+        try {
+            int _type = T__178;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:176:8: ( 'and' )
+            // InternalDataDSL.g:176:10: 'and'
+            {
+            match("and"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__178"
+
+    // $ANTLR start "T__179"
+    public final void mT__179() throws RecognitionException {
+        try {
+            int _type = T__179;
+            int _channel = DEFAULT_TOKEN_CHANNEL;
+            // InternalDataDSL.g:177:8: ( 'or' )
+            // InternalDataDSL.g:177:10: 'or'
+            {
+            match("or"); 
+
+
+            }
+
+            state.type = _type;
+            state.channel = _channel;
+        }
+        finally {
+        }
+    }
+    // $ANTLR end "T__179"
+
     // $ANTLR start "RULE_HEX"
     public final void mRULE_HEX() throws RecognitionException {
         try {
             int _type = RULE_HEX;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10018:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
-            // InternalDataDSL.g:10018:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalDataDSL.g:10639:10: ( ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )? )
+            // InternalDataDSL.g:10639:12: ( '0x' | '0X' ) ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+ ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             {
-            // InternalDataDSL.g:10018:12: ( '0x' | '0X' )
+            // InternalDataDSL.g:10639:12: ( '0x' | '0X' )
             int alt1=2;
             int LA1_0 = input.LA(1);
 
@@ -3436,7 +3722,7 @@
             }
             switch (alt1) {
                 case 1 :
-                    // InternalDataDSL.g:10018:13: '0x'
+                    // InternalDataDSL.g:10639:13: '0x'
                     {
                     match("0x"); 
 
@@ -3444,7 +3730,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:10018:18: '0X'
+                    // InternalDataDSL.g:10639:18: '0X'
                     {
                     match("0X"); 
 
@@ -3454,7 +3740,7 @@
 
             }
 
-            // InternalDataDSL.g:10018:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
+            // InternalDataDSL.g:10639:24: ( '0' .. '9' | 'a' .. 'f' | 'A' .. 'F' | '_' )+
             int cnt2=0;
             loop2:
             do {
@@ -3492,7 +3778,7 @@
                 cnt2++;
             } while (true);
 
-            // InternalDataDSL.g:10018:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
+            // InternalDataDSL.g:10639:58: ( '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) ) )?
             int alt4=2;
             int LA4_0 = input.LA(1);
 
@@ -3501,10 +3787,10 @@
             }
             switch (alt4) {
                 case 1 :
-                    // InternalDataDSL.g:10018:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalDataDSL.g:10639:59: '#' ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     {
                     match('#'); 
-                    // InternalDataDSL.g:10018:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
+                    // InternalDataDSL.g:10639:63: ( ( 'b' | 'B' ) ( 'i' | 'I' ) | ( 'l' | 'L' ) )
                     int alt3=2;
                     int LA3_0 = input.LA(1);
 
@@ -3522,7 +3808,7 @@
                     }
                     switch (alt3) {
                         case 1 :
-                            // InternalDataDSL.g:10018:64: ( 'b' | 'B' ) ( 'i' | 'I' )
+                            // InternalDataDSL.g:10639:64: ( 'b' | 'B' ) ( 'i' | 'I' )
                             {
                             if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                                 input.consume();
@@ -3546,7 +3832,7 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:10018:84: ( 'l' | 'L' )
+                            // InternalDataDSL.g:10639:84: ( 'l' | 'L' )
                             {
                             if ( input.LA(1)=='L'||input.LA(1)=='l' ) {
                                 input.consume();
@@ -3585,11 +3871,11 @@
         try {
             int _type = RULE_INT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10020:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
-            // InternalDataDSL.g:10020:12: '0' .. '9' ( '0' .. '9' | '_' )*
+            // InternalDataDSL.g:10641:10: ( '0' .. '9' ( '0' .. '9' | '_' )* )
+            // InternalDataDSL.g:10641:12: '0' .. '9' ( '0' .. '9' | '_' )*
             {
             matchRange('0','9'); 
-            // InternalDataDSL.g:10020:21: ( '0' .. '9' | '_' )*
+            // InternalDataDSL.g:10641:21: ( '0' .. '9' | '_' )*
             loop5:
             do {
                 int alt5=2;
@@ -3638,11 +3924,11 @@
         try {
             int _type = RULE_DECIMAL;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10022:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
-            // InternalDataDSL.g:10022:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalDataDSL.g:10643:14: ( RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )? )
+            // InternalDataDSL.g:10643:16: RULE_INT ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )? ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             {
             mRULE_INT(); 
-            // InternalDataDSL.g:10022:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
+            // InternalDataDSL.g:10643:25: ( ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT )?
             int alt7=2;
             int LA7_0 = input.LA(1);
 
@@ -3651,7 +3937,7 @@
             }
             switch (alt7) {
                 case 1 :
-                    // InternalDataDSL.g:10022:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
+                    // InternalDataDSL.g:10643:26: ( 'e' | 'E' ) ( '+' | '-' )? RULE_INT
                     {
                     if ( input.LA(1)=='E'||input.LA(1)=='e' ) {
                         input.consume();
@@ -3662,7 +3948,7 @@
                         recover(mse);
                         throw mse;}
 
-                    // InternalDataDSL.g:10022:36: ( '+' | '-' )?
+                    // InternalDataDSL.g:10643:36: ( '+' | '-' )?
                     int alt6=2;
                     int LA6_0 = input.LA(1);
 
@@ -3695,7 +3981,7 @@
 
             }
 
-            // InternalDataDSL.g:10022:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
+            // InternalDataDSL.g:10643:58: ( ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' ) | ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' ) )?
             int alt8=3;
             int LA8_0 = input.LA(1);
 
@@ -3707,7 +3993,7 @@
             }
             switch (alt8) {
                 case 1 :
-                    // InternalDataDSL.g:10022:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
+                    // InternalDataDSL.g:10643:59: ( 'b' | 'B' ) ( 'i' | 'I' | 'd' | 'D' )
                     {
                     if ( input.LA(1)=='B'||input.LA(1)=='b' ) {
                         input.consume();
@@ -3731,7 +4017,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:10022:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
+                    // InternalDataDSL.g:10643:87: ( 'l' | 'L' | 'd' | 'D' | 'f' | 'F' )
                     {
                     if ( input.LA(1)=='D'||input.LA(1)=='F'||input.LA(1)=='L'||input.LA(1)=='d'||input.LA(1)=='f'||input.LA(1)=='l' ) {
                         input.consume();
@@ -3764,10 +4050,10 @@
         try {
             int _type = RULE_ID;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10024:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
-            // InternalDataDSL.g:10024:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalDataDSL.g:10645:9: ( ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )* )
+            // InternalDataDSL.g:10645:11: ( '^' )? ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' ) ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             {
-            // InternalDataDSL.g:10024:11: ( '^' )?
+            // InternalDataDSL.g:10645:11: ( '^' )?
             int alt9=2;
             int LA9_0 = input.LA(1);
 
@@ -3776,7 +4062,7 @@
             }
             switch (alt9) {
                 case 1 :
-                    // InternalDataDSL.g:10024:11: '^'
+                    // InternalDataDSL.g:10645:11: '^'
                     {
                     match('^'); 
 
@@ -3794,7 +4080,7 @@
                 recover(mse);
                 throw mse;}
 
-            // InternalDataDSL.g:10024:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
+            // InternalDataDSL.g:10645:44: ( 'a' .. 'z' | 'A' .. 'Z' | '$' | '_' | '0' .. '9' )*
             loop10:
             do {
                 int alt10=2;
@@ -3843,10 +4129,10 @@
         try {
             int _type = RULE_STRING;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10026:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
-            // InternalDataDSL.g:10026:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalDataDSL.g:10647:13: ( ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? ) )
+            // InternalDataDSL.g:10647:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             {
-            // InternalDataDSL.g:10026:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
+            // InternalDataDSL.g:10647:15: ( '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )? | '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )? )
             int alt15=2;
             int LA15_0 = input.LA(1);
 
@@ -3864,10 +4150,10 @@
             }
             switch (alt15) {
                 case 1 :
-                    // InternalDataDSL.g:10026:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
+                    // InternalDataDSL.g:10647:16: '\"' ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )* ( '\"' )?
                     {
                     match('\"'); 
-                    // InternalDataDSL.g:10026:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
+                    // InternalDataDSL.g:10647:20: ( '\\\\' . | ~ ( ( '\\\\' | '\"' ) ) )*
                     loop11:
                     do {
                         int alt11=3;
@@ -3883,7 +4169,7 @@
 
                         switch (alt11) {
                     	case 1 :
-                    	    // InternalDataDSL.g:10026:21: '\\\\' .
+                    	    // InternalDataDSL.g:10647:21: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3891,7 +4177,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalDataDSL.g:10026:28: ~ ( ( '\\\\' | '\"' ) )
+                    	    // InternalDataDSL.g:10647:28: ~ ( ( '\\\\' | '\"' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='!')||(input.LA(1)>='#' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3911,7 +4197,7 @@
                         }
                     } while (true);
 
-                    // InternalDataDSL.g:10026:44: ( '\"' )?
+                    // InternalDataDSL.g:10647:44: ( '\"' )?
                     int alt12=2;
                     int LA12_0 = input.LA(1);
 
@@ -3920,7 +4206,7 @@
                     }
                     switch (alt12) {
                         case 1 :
-                            // InternalDataDSL.g:10026:44: '\"'
+                            // InternalDataDSL.g:10647:44: '\"'
                             {
                             match('\"'); 
 
@@ -3933,10 +4219,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:10026:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
+                    // InternalDataDSL.g:10647:49: '\\'' ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )* ( '\\'' )?
                     {
                     match('\''); 
-                    // InternalDataDSL.g:10026:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
+                    // InternalDataDSL.g:10647:54: ( '\\\\' . | ~ ( ( '\\\\' | '\\'' ) ) )*
                     loop13:
                     do {
                         int alt13=3;
@@ -3952,7 +4238,7 @@
 
                         switch (alt13) {
                     	case 1 :
-                    	    // InternalDataDSL.g:10026:55: '\\\\' .
+                    	    // InternalDataDSL.g:10647:55: '\\\\' .
                     	    {
                     	    match('\\'); 
                     	    matchAny(); 
@@ -3960,7 +4246,7 @@
                     	    }
                     	    break;
                     	case 2 :
-                    	    // InternalDataDSL.g:10026:62: ~ ( ( '\\\\' | '\\'' ) )
+                    	    // InternalDataDSL.g:10647:62: ~ ( ( '\\\\' | '\\'' ) )
                     	    {
                     	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='&')||(input.LA(1)>='(' && input.LA(1)<='[')||(input.LA(1)>=']' && input.LA(1)<='\uFFFF') ) {
                     	        input.consume();
@@ -3980,7 +4266,7 @@
                         }
                     } while (true);
 
-                    // InternalDataDSL.g:10026:79: ( '\\'' )?
+                    // InternalDataDSL.g:10647:79: ( '\\'' )?
                     int alt14=2;
                     int LA14_0 = input.LA(1);
 
@@ -3989,7 +4275,7 @@
                     }
                     switch (alt14) {
                         case 1 :
-                            // InternalDataDSL.g:10026:79: '\\''
+                            // InternalDataDSL.g:10647:79: '\\''
                             {
                             match('\''); 
 
@@ -4020,12 +4306,12 @@
         try {
             int _type = RULE_ML_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10028:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
-            // InternalDataDSL.g:10028:19: '/*' ( options {greedy=false; } : . )* '*/'
+            // InternalDataDSL.g:10649:17: ( '/*' ( options {greedy=false; } : . )* '*/' )
+            // InternalDataDSL.g:10649:19: '/*' ( options {greedy=false; } : . )* '*/'
             {
             match("/*"); 
 
-            // InternalDataDSL.g:10028:24: ( options {greedy=false; } : . )*
+            // InternalDataDSL.g:10649:24: ( options {greedy=false; } : . )*
             loop16:
             do {
                 int alt16=2;
@@ -4050,7 +4336,7 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalDataDSL.g:10028:52: .
+            	    // InternalDataDSL.g:10649:52: .
             	    {
             	    matchAny(); 
 
@@ -4080,12 +4366,12 @@
         try {
             int _type = RULE_SL_COMMENT;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10030:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
-            // InternalDataDSL.g:10030:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
+            // InternalDataDSL.g:10651:17: ( '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )? )
+            // InternalDataDSL.g:10651:19: '//' (~ ( ( '\\n' | '\\r' ) ) )* ( ( '\\r' )? '\\n' )?
             {
             match("//"); 
 
-            // InternalDataDSL.g:10030:24: (~ ( ( '\\n' | '\\r' ) ) )*
+            // InternalDataDSL.g:10651:24: (~ ( ( '\\n' | '\\r' ) ) )*
             loop17:
             do {
                 int alt17=2;
@@ -4098,7 +4384,7 @@
 
                 switch (alt17) {
             	case 1 :
-            	    // InternalDataDSL.g:10030:24: ~ ( ( '\\n' | '\\r' ) )
+            	    // InternalDataDSL.g:10651:24: ~ ( ( '\\n' | '\\r' ) )
             	    {
             	    if ( (input.LA(1)>='\u0000' && input.LA(1)<='\t')||(input.LA(1)>='\u000B' && input.LA(1)<='\f')||(input.LA(1)>='\u000E' && input.LA(1)<='\uFFFF') ) {
             	        input.consume();
@@ -4118,7 +4404,7 @@
                 }
             } while (true);
 
-            // InternalDataDSL.g:10030:40: ( ( '\\r' )? '\\n' )?
+            // InternalDataDSL.g:10651:40: ( ( '\\r' )? '\\n' )?
             int alt19=2;
             int LA19_0 = input.LA(1);
 
@@ -4127,9 +4413,9 @@
             }
             switch (alt19) {
                 case 1 :
-                    // InternalDataDSL.g:10030:41: ( '\\r' )? '\\n'
+                    // InternalDataDSL.g:10651:41: ( '\\r' )? '\\n'
                     {
-                    // InternalDataDSL.g:10030:41: ( '\\r' )?
+                    // InternalDataDSL.g:10651:41: ( '\\r' )?
                     int alt18=2;
                     int LA18_0 = input.LA(1);
 
@@ -4138,7 +4424,7 @@
                     }
                     switch (alt18) {
                         case 1 :
-                            // InternalDataDSL.g:10030:41: '\\r'
+                            // InternalDataDSL.g:10651:41: '\\r'
                             {
                             match('\r'); 
 
@@ -4170,10 +4456,10 @@
         try {
             int _type = RULE_WS;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10032:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
-            // InternalDataDSL.g:10032:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalDataDSL.g:10653:9: ( ( ' ' | '\\t' | '\\r' | '\\n' )+ )
+            // InternalDataDSL.g:10653:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             {
-            // InternalDataDSL.g:10032:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
+            // InternalDataDSL.g:10653:11: ( ' ' | '\\t' | '\\r' | '\\n' )+
             int cnt20=0;
             loop20:
             do {
@@ -4227,8 +4513,8 @@
         try {
             int _type = RULE_ANY_OTHER;
             int _channel = DEFAULT_TOKEN_CHANNEL;
-            // InternalDataDSL.g:10034:16: ( . )
-            // InternalDataDSL.g:10034:18: .
+            // InternalDataDSL.g:10655:16: ( . )
+            // InternalDataDSL.g:10655:18: .
             {
             matchAny(); 
 
@@ -4243,8 +4529,8 @@
     // $ANTLR end "RULE_ANY_OTHER"
 
     public void mTokens() throws RecognitionException {
-        // InternalDataDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
-        int alt21=163;
+        // InternalDataDSL.g:1:8: ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER )
+        int alt21=176;
         alt21 = dfa21.predict(input);
         switch (alt21) {
             case 1 :
@@ -5326,63 +5612,154 @@
                 }
                 break;
             case 155 :
-                // InternalDataDSL.g:1:1001: RULE_HEX
+                // InternalDataDSL.g:1:1001: T__167
+                {
+                mT__167(); 
+
+                }
+                break;
+            case 156 :
+                // InternalDataDSL.g:1:1008: T__168
+                {
+                mT__168(); 
+
+                }
+                break;
+            case 157 :
+                // InternalDataDSL.g:1:1015: T__169
+                {
+                mT__169(); 
+
+                }
+                break;
+            case 158 :
+                // InternalDataDSL.g:1:1022: T__170
+                {
+                mT__170(); 
+
+                }
+                break;
+            case 159 :
+                // InternalDataDSL.g:1:1029: T__171
+                {
+                mT__171(); 
+
+                }
+                break;
+            case 160 :
+                // InternalDataDSL.g:1:1036: T__172
+                {
+                mT__172(); 
+
+                }
+                break;
+            case 161 :
+                // InternalDataDSL.g:1:1043: T__173
+                {
+                mT__173(); 
+
+                }
+                break;
+            case 162 :
+                // InternalDataDSL.g:1:1050: T__174
+                {
+                mT__174(); 
+
+                }
+                break;
+            case 163 :
+                // InternalDataDSL.g:1:1057: T__175
+                {
+                mT__175(); 
+
+                }
+                break;
+            case 164 :
+                // InternalDataDSL.g:1:1064: T__176
+                {
+                mT__176(); 
+
+                }
+                break;
+            case 165 :
+                // InternalDataDSL.g:1:1071: T__177
+                {
+                mT__177(); 
+
+                }
+                break;
+            case 166 :
+                // InternalDataDSL.g:1:1078: T__178
+                {
+                mT__178(); 
+
+                }
+                break;
+            case 167 :
+                // InternalDataDSL.g:1:1085: T__179
+                {
+                mT__179(); 
+
+                }
+                break;
+            case 168 :
+                // InternalDataDSL.g:1:1092: RULE_HEX
                 {
                 mRULE_HEX(); 
 
                 }
                 break;
-            case 156 :
-                // InternalDataDSL.g:1:1010: RULE_INT
+            case 169 :
+                // InternalDataDSL.g:1:1101: RULE_INT
                 {
                 mRULE_INT(); 
 
                 }
                 break;
-            case 157 :
-                // InternalDataDSL.g:1:1019: RULE_DECIMAL
+            case 170 :
+                // InternalDataDSL.g:1:1110: RULE_DECIMAL
                 {
                 mRULE_DECIMAL(); 
 
                 }
                 break;
-            case 158 :
-                // InternalDataDSL.g:1:1032: RULE_ID
+            case 171 :
+                // InternalDataDSL.g:1:1123: RULE_ID
                 {
                 mRULE_ID(); 
 
                 }
                 break;
-            case 159 :
-                // InternalDataDSL.g:1:1040: RULE_STRING
+            case 172 :
+                // InternalDataDSL.g:1:1131: RULE_STRING
                 {
                 mRULE_STRING(); 
 
                 }
                 break;
-            case 160 :
-                // InternalDataDSL.g:1:1052: RULE_ML_COMMENT
+            case 173 :
+                // InternalDataDSL.g:1:1143: RULE_ML_COMMENT
                 {
                 mRULE_ML_COMMENT(); 
 
                 }
                 break;
-            case 161 :
-                // InternalDataDSL.g:1:1068: RULE_SL_COMMENT
+            case 174 :
+                // InternalDataDSL.g:1:1159: RULE_SL_COMMENT
                 {
                 mRULE_SL_COMMENT(); 
 
                 }
                 break;
-            case 162 :
-                // InternalDataDSL.g:1:1084: RULE_WS
+            case 175 :
+                // InternalDataDSL.g:1:1175: RULE_WS
                 {
                 mRULE_WS(); 
 
                 }
                 break;
-            case 163 :
-                // InternalDataDSL.g:1:1092: RULE_ANY_OTHER
+            case 176 :
+                // InternalDataDSL.g:1:1183: RULE_ANY_OTHER
                 {
                 mRULE_ANY_OTHER(); 
 
@@ -5396,790 +5773,892 @@
 
     protected DFA21 dfa21 = new DFA21(this);
     static final String DFA21_eotS =
-        "\1\uffff\1\105\2\uffff\26\105\1\177\1\u0082\5\uffff\1\u008a\3\uffff\1\u0090\1\u0094\1\u0098\1\u009a\1\u009d\1\u009f\1\u00a1\1\u00a3\1\u00a5\1\u00a8\1\u00aa\7\105\2\u00b5\1\76\5\uffff\6\105\3\uffff\3\105\1\u00c5\2\105\1\u00ca\33\105\1\u00f0\6\105\1\u00fa\1\105\1\u00fc\3\105\1\u0102\2\105\1\u0105\3\105\1\u010b\11\uffff\1\u010d\33\uffff\1\u010f\6\uffff\10\105\1\uffff\1\u00b5\4\uffff\4\105\1\u011c\1\u011d\6\105\1\uffff\4\105\1\uffff\1\105\1\u012c\1\u012d\1\105\1\u012f\12\105\1\u013c\2\105\1\u013f\1\u0143\7\105\1\u014b\6\105\1\u0152\2\105\1\uffff\1\u0155\7\105\1\u015e\1\uffff\1\105\1\uffff\5\105\1\uffff\1\u0165\1\105\1\uffff\1\105\1\u0168\2\105\6\uffff\1\u016b\10\105\1\u0174\2\105\2\uffff\16\105\2\uffff\1\105\1\uffff\3\105\1\u0189\5\105\1\u0190\2\105\1\uffff\1\u0193\1\105\1\uffff\3\105\1\uffff\2\105\1\u019b\4\105\1\uffff\6\105\1\uffff\2\105\1\uffff\1\u01a8\2\105\1\u01ab\2\105\1\u01ae\1\u01af\1\uffff\1\105\1\u01b1\4\105\1\uffff\1\u01b6\1\u01b7\1\uffff\2\105\1\uffff\4\105\1\u01be\3\105\1\uffff\1\105\1\u01c3\1\105\1\u01c5\20\105\1\uffff\6\105\1\uffff\2\105\1\uffff\1\u01df\3\105\1\u01e3\2\105\1\uffff\1\u01e7\7\105\1\u01ef\3\105\1\uffff\2\105\1\uffff\1\u01f5\1\105\2\uffff\1\105\1\uffff\1\u01f8\1\u01f9\2\105\2\uffff\1\105\1\u01fd\4\105\1\uffff\4\105\1\uffff\1\105\1\uffff\1\105\1\u0208\1\105\1\u020a\1\u020b\7\105\1\u0213\1\u0214\1\u0215\2\105\1\u0218\1\105\1\u021a\4\105\1\u021f\1\uffff\3\105\1\uffff\3\105\1\uffff\1\u0227\1\u0228\3\105\1\u022d\1\u022e\1\uffff\5\105\1\uffff\1\u0234\3\uffff\1\105\1\u0236\1\u0237\1\uffff\5\105\1\u023d\1\u023e\1\105\1\u0240\1\105\1\uffff\1\105\2\uffff\4\105\1\u0247\2\105\3\uffff\2\105\1\uffff\1\105\1\uffff\2\105\1\u024f\1\u0250\1\uffff\1\105\1\u0252\1\u0254\4\105\2\uffff\4\105\2\uffff\5\105\1\uffff\1\105\2\uffff\1\u0264\4\105\2\uffff\1\u0269\1\uffff\6\105\1\uffff\1\105\1\u0271\1\105\1\u0273\3\105\2\uffff\1\105\1\uffff\1\105\1\uffff\2\105\1\u027b\1\u027c\6\105\1\u0283\1\u0284\3\105\1\uffff\4\105\1\uffff\2\105\1\u028e\2\105\1\u0291\1\105\1\uffff\1\105\1\uffff\2\105\1\u0296\4\105\2\uffff\3\105\1\u029e\2\105\2\uffff\1\u02a1\3\105\1\u02a5\3\105\1\u02a9\1\uffff\2\105\1\uffff\1\u02ac\1\105\1\u02ae\1\105\1\uffff\2\105\1\u02b2\4\105\1\uffff\2\105\1\uffff\3\105\1\uffff\2\105\1\u02be\1\uffff\1\u02bf\1\105\1\uffff\1\u02c1\1\uffff\3\105\1\uffff\10\105\1\u02cd\2\105\2\uffff\1\105\1\uffff\1\u02d1\1\105\1\u02d3\1\u02d4\1\u02d5\1\u02d6\1\105\1\u02d8\3\105\1\uffff\1\105\1\u02dd\1\105\1\uffff\1\105\4\uffff\1\105\1\uffff\1\105\1\u02e2\2\105\1\uffff\1\105\1\u02e6\1\u02e7\1\u02e8\1\uffff\3\105\3\uffff\17\105\1\u02fb\1\105\1\u02fd\1\uffff\1\105\1\uffff\5\105\1\u0304\1\uffff";
+        "\1\uffff\1\107\2\uffff\30\107\1\u0086\1\u0089\5\uffff\1\u0091\3\uffff\1\u0097\1\u009b\1\u009f\1\u00a1\1\u00a4\1\u00a6\1\u00a8\1\u00aa\1\u00ac\1\u00af\1\u00b1\7\107\2\u00bc\1\100\5\uffff\6\107\3\uffff\1\107\1\u00cb\1\107\1\u00cd\2\107\1\u00d2\36\107\1\u00fd\7\107\1\u010a\3\107\1\u010f\1\107\1\u0111\1\107\1\u0113\5\107\1\u011c\11\uffff\1\u011e\33\uffff\1\u0120\6\uffff\10\107\1\uffff\1\u00bc\4\uffff\4\107\1\u012d\1\u012e\5\107\1\uffff\1\107\1\uffff\4\107\1\uffff\1\107\1\u013d\1\u013e\1\107\1\u0141\13\107\1\u014f\2\107\1\u0152\1\u0157\12\107\1\u0162\6\107\1\u0169\3\107\1\uffff\1\u016d\10\107\1\u0177\2\107\1\uffff\1\u017a\3\107\1\uffff\1\107\1\uffff\1\107\1\uffff\2\107\1\u0182\4\107\6\uffff\1\u0187\10\107\1\u0190\2\107\2\uffff\16\107\2\uffff\2\107\1\uffff\4\107\1\u01a7\5\107\1\u01ae\2\107\1\uffff\1\u01b1\1\107\1\uffff\4\107\1\uffff\2\107\1\u01bb\7\107\1\uffff\6\107\1\uffff\3\107\1\uffff\1\u01cc\3\107\1\u01d0\2\107\1\u01d3\1\u01d4\1\uffff\2\107\1\uffff\2\107\1\u01d9\1\107\1\u01db\1\u01dc\1\u01dd\1\uffff\4\107\1\uffff\4\107\1\u01e6\3\107\1\uffff\1\107\1\u01eb\1\107\1\u01ed\22\107\1\uffff\6\107\1\uffff\2\107\1\uffff\1\u0209\5\107\1\u020f\2\107\1\uffff\1\u0213\12\107\1\u021e\2\107\1\u0221\1\107\1\uffff\3\107\1\uffff\1\u0226\1\107\2\uffff\2\107\1\u022a\1\u022b\1\uffff\1\107\3\uffff\1\107\1\u022e\6\107\1\uffff\4\107\1\uffff\1\107\1\uffff\1\107\1\u023b\1\107\1\u023d\1\u023e\7\107\1\u0246\1\107\1\u0248\1\u0249\3\107\1\u024d\1\107\1\u024f\4\107\1\u0254\1\uffff\5\107\1\uffff\3\107\1\uffff\1\u025e\1\u025f\2\107\1\u0263\3\107\1\u0267\1\u0268\1\uffff\2\107\1\uffff\4\107\1\uffff\1\u026f\1\107\1\u0271\3\uffff\1\u0272\1\uffff\7\107\1\u027a\1\u027b\1\107\1\u027d\1\107\1\uffff\1\107\2\uffff\4\107\1\u0284\2\107\1\uffff\1\107\2\uffff\3\107\1\uffff\1\107\1\uffff\2\107\1\u028e\1\u028f\1\uffff\1\107\1\u0291\1\u0293\1\u0294\5\107\2\uffff\3\107\1\uffff\3\107\2\uffff\6\107\1\uffff\1\107\2\uffff\2\107\1\u02a9\4\107\2\uffff\1\u02ae\1\uffff\6\107\1\uffff\1\107\1\u02b6\3\107\1\u02ba\3\107\2\uffff\1\107\1\uffff\1\107\2\uffff\3\107\1\u02c3\1\u02c4\3\107\1\u02c8\4\107\1\u02cd\1\u02ce\5\107\1\uffff\4\107\1\uffff\2\107\1\u02da\2\107\1\u02dd\1\107\1\uffff\1\107\1\u02e0\1\107\1\uffff\2\107\1\u02e4\5\107\2\uffff\1\u02ea\2\107\1\uffff\1\107\1\u02ee\2\107\2\uffff\1\u02f1\2\107\1\u02f4\2\107\1\u02f7\3\107\1\u02fb\1\uffff\2\107\1\uffff\1\u02fe\1\107\1\uffff\1\107\1\u0301\1\107\1\uffff\3\107\1\u0306\1\107\1\uffff\3\107\1\uffff\2\107\1\uffff\1\u030e\1\107\1\uffff\2\107\1\uffff\2\107\1\u0314\1\uffff\1\u0315\1\107\1\uffff\1\107\1\u0318\1\uffff\4\107\1\uffff\7\107\1\uffff\2\107\1\u0326\2\107\2\uffff\1\107\1\u032a\1\uffff\1\u032b\1\107\1\u032d\1\107\1\u032f\1\u0330\1\u0331\1\107\1\u0333\4\107\1\uffff\1\107\1\u0339\1\107\2\uffff\1\107\1\uffff\1\107\3\uffff\1\107\1\uffff\2\107\1\u0340\2\107\1\uffff\1\107\1\u0344\1\u0345\1\u0346\1\u0347\1\107\1\uffff\3\107\4\uffff\20\107\1\u035c\3\107\1\uffff\2\107\1\u0362\1\u0363\1\107\2\uffff\5\107\1\u036a\1\uffff";
     static final String DFA21_eofS =
-        "\u0305\uffff";
+        "\u036b\uffff";
     static final String DFA21_minS =
-        "\1\0\1\141\2\uffff\1\162\1\146\1\145\1\141\1\145\1\154\1\141\1\115\2\141\1\123\1\165\1\153\1\104\1\145\1\141\1\145\1\143\1\150\1\154\1\151\1\150\1\56\1\52\5\uffff\1\75\3\uffff\1\53\1\55\1\52\3\75\1\174\1\46\1\75\1\56\1\72\1\160\1\141\1\164\1\156\1\141\1\151\1\141\2\60\1\44\5\uffff\1\143\1\157\1\141\1\147\1\146\1\162\3\uffff\1\157\1\144\1\160\1\44\1\156\1\146\1\44\1\143\1\154\1\146\1\145\1\143\1\160\1\154\1\162\1\157\1\154\1\114\1\160\1\155\1\145\1\162\1\143\1\164\1\126\1\157\1\151\1\141\1\151\1\160\1\156\1\111\1\145\1\144\1\44\1\167\1\154\1\145\1\143\1\144\1\171\1\44\1\164\1\44\1\164\1\145\1\154\1\44\2\144\1\44\1\165\1\160\1\162\1\74\11\uffff\1\75\33\uffff\1\75\6\uffff\1\147\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\uffff\1\60\4\uffff\1\153\1\150\1\160\1\151\2\44\1\163\1\165\2\145\1\164\1\157\1\uffff\1\157\1\143\1\145\1\141\1\uffff\1\164\2\44\1\157\1\44\1\165\1\157\1\155\1\145\1\157\1\151\1\157\2\145\1\141\1\44\1\155\1\163\2\44\1\153\1\145\2\147\1\141\1\153\1\145\1\44\1\164\1\160\2\164\1\145\1\143\1\44\1\143\1\145\1\uffff\1\44\1\154\1\141\1\150\1\145\1\143\1\151\1\171\1\44\1\uffff\1\145\1\uffff\1\150\1\162\1\154\1\157\1\151\1\uffff\1\44\1\145\1\uffff\1\145\1\44\1\145\1\157\6\uffff\1\44\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\141\1\44\1\145\1\156\2\uffff\1\151\1\160\1\162\1\156\1\141\1\162\1\154\1\164\1\162\1\164\1\155\1\165\1\157\1\144\2\uffff\1\162\1\uffff\1\162\1\166\1\145\1\44\1\144\1\164\1\145\1\162\1\156\1\44\1\154\1\141\1\uffff\1\44\1\145\1\uffff\1\154\1\151\1\157\1\uffff\1\145\1\124\1\44\1\145\1\154\1\165\1\163\1\uffff\1\145\1\114\1\151\1\143\1\162\1\150\1\uffff\1\165\1\116\1\uffff\1\44\1\164\1\145\1\44\1\150\1\156\2\44\1\uffff\1\164\1\44\2\145\1\167\1\147\1\uffff\2\44\1\uffff\1\157\1\167\1\uffff\1\141\1\163\1\164\1\145\1\44\1\151\1\157\1\147\1\uffff\1\162\1\44\1\163\1\44\1\143\1\164\1\156\1\164\1\154\1\156\1\151\1\145\1\151\1\154\1\162\1\141\1\164\1\156\1\145\1\156\1\uffff\1\151\1\171\1\163\1\145\1\164\1\144\1\uffff\1\154\1\164\1\uffff\1\44\1\101\1\157\1\156\1\44\1\144\1\171\1\uffff\1\44\1\145\1\160\1\164\1\103\1\151\1\143\1\150\1\44\1\162\1\164\1\141\1\uffff\1\145\1\123\1\uffff\1\44\1\147\2\uffff\1\55\1\uffff\2\44\1\116\1\156\2\uffff\1\146\1\44\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\145\1\164\1\uffff\1\164\1\uffff\1\150\1\44\1\143\2\44\1\165\1\142\1\106\2\164\1\116\1\164\3\44\1\164\1\156\1\44\1\163\1\44\1\106\1\151\1\163\1\171\1\44\1\uffff\1\164\1\142\1\147\1\uffff\1\105\1\102\1\160\1\uffff\2\44\1\105\1\150\1\156\2\44\1\uffff\1\157\1\145\1\155\1\117\1\151\1\uffff\1\44\3\uffff\1\157\2\44\1\uffff\1\145\1\143\1\141\1\163\1\145\2\44\1\171\1\44\1\141\1\uffff\1\145\2\uffff\1\154\1\145\1\151\1\145\1\44\1\141\1\145\3\uffff\1\123\1\147\1\uffff\1\151\1\uffff\1\151\1\157\2\44\1\uffff\1\164\2\44\1\141\1\156\1\171\1\145\2\uffff\1\155\1\170\1\141\1\145\2\uffff\1\156\1\103\1\145\1\156\1\172\1\uffff\1\122\2\uffff\1\44\1\157\1\164\1\141\1\143\2\uffff\1\44\1\uffff\1\156\1\157\1\154\1\144\1\154\1\162\1\uffff\1\155\1\44\1\151\1\44\1\157\1\154\1\156\2\uffff\1\162\1\uffff\1\157\1\uffff\2\164\2\44\2\160\1\162\1\163\1\151\1\157\2\44\2\145\1\165\1\uffff\1\156\1\145\1\154\1\157\1\uffff\1\147\1\146\1\44\1\102\1\145\1\44\1\145\1\uffff\1\172\1\uffff\1\156\1\164\1\44\1\151\1\144\1\150\1\151\2\uffff\2\157\1\141\1\44\1\172\1\156\2\uffff\1\44\1\163\1\156\1\144\1\44\1\154\1\156\1\145\1\44\1\uffff\1\171\1\101\1\uffff\1\44\1\145\1\44\1\145\1\uffff\1\142\1\145\1\44\1\164\2\162\1\143\1\uffff\1\145\1\164\1\uffff\1\165\1\151\1\163\1\uffff\1\171\1\144\1\44\1\uffff\1\44\1\146\1\uffff\1\44\1\uffff\1\162\1\165\1\154\1\uffff\1\171\3\164\1\144\1\145\1\154\1\161\1\44\1\125\1\163\2\uffff\1\164\1\uffff\1\44\1\164\4\44\1\145\1\44\1\170\1\164\1\165\1\uffff\1\156\1\44\1\145\1\uffff\1\145\4\uffff\1\162\1\uffff\1\164\1\44\1\145\1\151\1\uffff\1\162\3\44\1\uffff\1\122\1\161\1\111\3\uffff\1\145\1\165\1\155\1\163\1\145\1\160\1\165\1\111\1\157\1\154\1\144\1\162\1\164\1\145\1\164\1\44\1\156\1\44\1\uffff\1\164\1\uffff\1\151\1\146\1\151\1\145\1\162\1\44\1\uffff";
+        "\1\0\1\141\2\uffff\1\162\1\146\1\145\1\141\1\145\1\154\1\141\1\115\2\141\1\123\1\165\1\153\1\104\1\151\1\145\1\141\1\145\1\154\1\150\1\143\1\151\1\150\1\156\1\56\1\52\5\uffff\1\75\3\uffff\1\53\1\55\1\52\3\75\1\174\1\46\1\75\1\56\1\72\1\160\1\141\1\164\1\156\1\141\1\151\1\141\2\60\1\44\5\uffff\1\143\1\157\1\141\1\147\1\146\1\162\3\uffff\1\157\1\44\1\160\1\44\1\156\1\146\1\44\1\143\1\154\1\146\1\147\1\145\1\143\1\160\1\154\1\162\1\157\1\154\1\114\1\160\1\155\1\145\1\162\1\143\1\164\1\146\1\126\1\157\1\151\1\141\1\151\1\160\1\156\1\111\1\145\1\170\1\144\1\44\1\167\1\154\1\145\1\143\1\144\1\171\1\154\1\44\1\144\1\145\1\164\1\44\1\164\1\44\1\144\1\44\1\151\1\160\1\162\1\160\1\143\1\74\11\uffff\1\75\33\uffff\1\75\6\uffff\1\147\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\uffff\1\60\4\uffff\1\153\1\150\1\160\1\151\2\44\1\163\1\165\2\145\1\164\1\uffff\1\157\1\uffff\1\157\1\143\1\145\1\141\1\uffff\1\164\2\44\1\157\1\44\1\165\1\157\1\150\1\155\1\145\1\157\1\151\1\157\2\145\1\141\1\44\1\155\1\163\2\44\1\153\1\145\2\147\1\141\1\153\2\145\1\147\1\164\1\44\1\164\1\160\2\164\1\145\1\143\1\44\1\143\2\145\1\uffff\1\44\1\154\1\141\1\150\1\151\1\145\1\143\1\151\1\171\1\44\1\157\1\151\1\uffff\1\44\1\162\1\154\1\150\1\uffff\1\145\1\uffff\1\145\1\uffff\1\155\1\145\1\44\1\145\1\157\1\145\1\141\6\uffff\1\44\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\141\1\44\1\145\1\156\2\uffff\1\151\1\160\1\162\1\156\1\141\1\162\1\154\1\164\1\162\1\164\1\155\1\165\1\157\1\144\2\uffff\2\162\1\uffff\1\162\1\166\1\164\1\145\1\44\1\144\1\164\1\145\1\162\1\156\1\44\1\154\1\141\1\uffff\1\44\1\145\1\uffff\1\154\2\151\1\157\1\uffff\1\145\1\124\1\44\1\145\1\154\1\165\1\162\1\163\1\164\1\124\1\uffff\1\145\1\114\1\151\1\143\1\162\1\150\1\uffff\1\165\1\144\1\116\1\uffff\1\44\1\164\1\145\1\164\1\44\1\150\1\156\2\44\1\uffff\1\167\1\147\1\uffff\2\145\1\44\1\164\3\44\1\uffff\1\157\1\167\1\162\1\160\1\uffff\1\141\1\163\1\164\1\145\1\44\1\151\1\157\1\147\1\uffff\1\162\1\44\1\163\1\44\1\143\1\164\1\156\1\164\1\154\1\156\1\151\1\145\1\151\1\154\1\162\1\141\1\164\1\145\1\156\1\145\1\124\1\156\1\uffff\1\151\1\171\1\163\1\145\1\164\1\144\1\uffff\1\154\1\164\1\uffff\1\44\1\101\1\157\1\156\1\157\1\170\1\44\1\144\1\171\1\uffff\1\44\1\145\1\160\1\103\1\164\1\150\1\162\1\103\1\151\1\143\1\150\1\44\1\162\1\164\1\44\1\141\1\uffff\1\145\1\123\1\141\1\uffff\1\44\1\147\2\uffff\1\116\1\156\2\44\1\uffff\1\55\3\uffff\1\146\1\44\1\103\1\151\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\145\1\164\1\uffff\1\164\1\uffff\1\150\1\44\1\143\2\44\1\165\1\142\1\106\2\164\1\116\1\164\1\44\1\156\2\44\1\162\1\164\1\156\1\44\1\163\1\44\1\106\1\151\1\163\1\171\1\44\1\uffff\1\164\1\142\1\147\1\155\1\145\1\uffff\1\105\1\102\1\160\1\uffff\2\44\1\141\1\105\1\44\1\151\1\150\1\156\2\44\1\uffff\1\157\1\145\1\uffff\1\155\1\117\1\151\1\154\1\uffff\1\44\1\157\1\44\3\uffff\1\44\1\uffff\1\141\1\164\1\145\1\143\1\141\1\163\1\145\2\44\1\171\1\44\1\141\1\uffff\1\145\2\uffff\1\154\1\145\1\151\1\145\1\44\1\141\1\145\1\uffff\1\143\2\uffff\1\151\1\123\1\147\1\uffff\1\151\1\uffff\1\151\1\157\2\44\1\uffff\1\164\3\44\1\144\1\141\1\156\1\171\1\145\2\uffff\1\163\1\155\1\170\1\uffff\1\155\1\141\1\145\2\uffff\1\156\1\103\1\145\1\156\1\172\1\151\1\uffff\1\122\2\uffff\1\163\1\141\1\44\1\157\1\164\1\141\1\143\2\uffff\1\44\1\uffff\1\156\1\157\1\154\1\144\1\154\1\162\1\uffff\1\155\1\44\1\145\1\155\1\151\1\44\1\157\1\154\1\156\2\uffff\1\162\1\uffff\1\157\2\uffff\1\114\2\164\2\44\1\145\2\160\1\44\1\162\1\163\1\151\1\157\2\44\1\145\1\172\2\145\1\154\1\uffff\1\156\1\145\1\154\1\157\1\uffff\1\147\1\146\1\44\1\102\1\145\1\44\1\145\1\uffff\1\144\1\44\1\172\1\uffff\1\156\1\164\1\44\1\151\1\144\1\145\1\150\1\151\2\uffff\1\44\2\157\1\uffff\1\141\1\44\1\172\1\156\2\uffff\1\44\1\145\1\163\1\44\1\151\1\144\1\44\1\154\1\156\1\145\1\44\1\uffff\1\171\1\101\1\uffff\1\44\1\102\1\uffff\1\145\1\44\1\145\1\uffff\1\142\1\145\1\156\1\44\1\164\1\uffff\2\162\1\143\1\uffff\1\145\1\164\1\uffff\1\44\1\165\1\uffff\1\172\1\163\1\uffff\1\171\1\144\1\44\1\uffff\1\44\1\146\1\uffff\1\171\1\44\1\uffff\1\162\1\165\1\154\1\147\1\uffff\1\171\3\164\1\144\1\145\1\151\1\uffff\1\154\1\145\1\44\1\125\1\163\2\uffff\1\164\1\44\1\uffff\1\44\1\164\1\44\1\164\3\44\1\145\1\44\1\170\1\162\1\164\1\106\1\uffff\1\156\1\44\1\145\2\uffff\1\145\1\uffff\1\150\3\uffff\1\162\1\uffff\1\164\1\163\1\44\2\151\1\uffff\1\162\4\44\1\164\1\uffff\1\162\1\161\1\111\4\uffff\1\127\1\163\1\165\1\155\1\157\1\164\1\145\1\160\1\162\1\127\1\111\1\157\1\144\1\157\1\144\1\162\1\44\1\162\1\145\1\164\1\uffff\1\144\1\156\2\44\1\164\2\uffff\1\151\1\146\1\151\1\145\1\162\1\44\1\uffff";
     static final String DFA21_maxS =
-        "\1\uffff\1\162\2\uffff\1\162\1\163\1\157\2\145\1\170\1\162\1\115\1\160\1\157\1\123\1\165\1\171\1\170\1\165\1\162\1\145\1\162\1\151\1\163\1\151\1\171\1\56\1\75\5\uffff\1\76\3\uffff\1\75\1\76\2\75\1\76\1\75\1\174\1\46\1\75\2\72\1\160\1\157\1\164\1\156\1\141\1\151\1\141\1\170\1\154\1\172\5\uffff\1\164\1\157\1\141\1\147\1\146\1\162\3\uffff\1\157\1\164\1\160\1\172\1\156\1\163\1\172\1\143\1\162\1\164\1\163\2\164\1\156\1\162\1\157\1\154\1\114\1\162\1\155\1\145\1\162\1\157\1\164\1\126\1\157\1\151\1\141\1\151\1\160\1\156\1\111\1\145\1\144\1\172\1\167\1\154\1\145\1\164\1\160\1\171\1\172\1\164\1\172\1\164\1\151\1\154\1\172\2\144\1\172\1\171\1\160\1\162\1\74\11\uffff\1\75\33\uffff\1\75\6\uffff\1\147\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\uffff\1\154\4\uffff\1\153\1\150\1\160\1\151\2\172\1\163\1\165\2\145\1\164\1\157\1\uffff\1\165\1\143\1\151\1\141\1\uffff\1\164\2\172\1\157\1\172\1\165\1\157\1\155\1\145\1\157\1\151\1\162\2\145\1\141\1\172\1\155\1\163\2\172\1\153\1\145\2\147\1\141\1\153\1\145\1\172\1\164\1\160\2\164\1\145\1\143\1\172\1\143\1\145\1\uffff\1\172\1\154\1\141\1\150\1\145\1\143\1\151\1\171\1\172\1\uffff\1\145\1\uffff\1\150\1\162\1\154\1\157\1\151\1\uffff\1\172\1\145\1\uffff\1\145\1\172\1\145\1\157\6\uffff\1\172\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\141\1\172\1\145\1\156\2\uffff\1\151\1\160\1\162\1\156\1\141\1\162\1\154\1\164\1\162\1\164\1\155\1\165\1\157\1\144\2\uffff\1\162\1\uffff\1\162\1\166\1\145\1\172\1\144\1\164\1\145\1\163\1\156\1\172\1\154\1\141\1\uffff\1\172\1\145\1\uffff\1\171\1\151\1\157\1\uffff\1\145\1\124\1\172\1\145\1\154\1\165\1\163\1\uffff\1\145\1\114\1\151\1\143\1\162\1\150\1\uffff\1\165\1\116\1\uffff\1\172\1\164\1\145\1\172\1\150\1\156\2\172\1\uffff\1\164\1\172\2\145\1\167\1\147\1\uffff\2\172\1\uffff\1\157\1\167\1\uffff\1\141\1\163\1\164\1\145\1\172\1\151\1\157\1\147\1\uffff\1\162\1\172\1\163\1\172\1\143\1\164\1\156\1\164\1\154\1\156\1\151\1\145\1\151\1\154\1\162\1\141\1\164\1\156\1\145\1\156\1\uffff\1\151\1\171\1\163\1\145\1\164\1\163\1\uffff\1\154\1\164\1\uffff\1\172\1\101\1\157\1\156\1\172\1\162\1\171\1\uffff\1\172\1\145\1\160\1\164\1\103\1\151\1\143\1\150\1\172\1\162\1\164\1\141\1\uffff\1\145\1\123\1\uffff\1\172\1\147\2\uffff\1\55\1\uffff\2\172\1\116\1\156\2\uffff\1\146\1\172\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\145\1\164\1\uffff\1\164\1\uffff\1\150\1\172\1\143\2\172\1\165\1\142\1\106\2\164\1\116\1\164\3\172\1\164\1\156\1\172\1\163\1\172\1\106\1\151\1\163\1\171\1\172\1\uffff\1\164\1\142\1\147\1\uffff\1\120\1\102\1\160\1\uffff\2\172\1\111\1\150\1\156\2\172\1\uffff\1\157\1\145\1\155\1\117\1\151\1\uffff\1\172\3\uffff\1\157\2\172\1\uffff\1\145\1\143\1\141\1\163\1\145\2\172\1\171\1\172\1\141\1\uffff\1\145\2\uffff\1\154\1\145\1\151\1\145\1\172\1\141\1\145\3\uffff\1\123\1\147\1\uffff\1\151\1\uffff\1\151\1\157\2\172\1\uffff\1\164\2\172\1\141\1\156\1\171\1\145\2\uffff\1\155\1\170\1\141\1\145\2\uffff\1\156\1\103\1\145\1\156\1\172\1\uffff\1\156\2\uffff\1\172\1\157\1\164\1\141\1\143\2\uffff\1\172\1\uffff\1\156\1\157\1\154\1\144\1\154\1\162\1\uffff\1\155\1\172\1\151\1\172\1\157\1\154\1\156\2\uffff\1\162\1\uffff\1\157\1\uffff\2\164\2\172\2\160\1\162\1\163\1\151\1\157\2\172\2\145\1\165\1\uffff\1\156\1\145\1\154\1\157\1\uffff\1\147\1\146\1\172\1\102\1\145\1\172\1\145\1\uffff\1\172\1\uffff\1\156\1\164\1\172\1\151\1\144\1\150\1\151\2\uffff\2\157\1\141\2\172\1\156\2\uffff\1\172\1\163\1\156\1\144\1\172\1\154\1\156\1\145\1\172\1\uffff\1\171\1\101\1\uffff\1\172\1\145\1\172\1\145\1\uffff\1\142\1\145\1\172\1\164\2\162\1\143\1\uffff\1\145\1\164\1\uffff\1\165\1\151\1\163\1\uffff\1\171\1\144\1\172\1\uffff\1\172\1\146\1\uffff\1\172\1\uffff\1\162\1\165\1\154\1\uffff\1\171\3\164\1\144\1\145\1\154\1\161\1\172\1\125\1\163\2\uffff\1\164\1\uffff\1\172\1\164\4\172\1\145\1\172\1\170\1\164\1\165\1\uffff\1\156\1\172\1\145\1\uffff\1\145\4\uffff\1\162\1\uffff\1\164\1\172\1\145\1\151\1\uffff\1\162\3\172\1\uffff\1\122\1\161\1\111\3\uffff\1\145\1\165\1\155\1\163\1\145\1\160\1\165\1\111\1\157\1\154\1\144\1\162\1\164\1\145\1\164\1\172\1\156\1\172\1\uffff\1\164\1\uffff\1\151\1\146\1\151\1\145\1\162\1\172\1\uffff";
+        "\1\uffff\1\162\2\uffff\1\162\1\163\1\157\1\145\1\151\1\170\1\162\1\115\1\160\1\157\1\123\1\165\1\171\1\170\1\151\1\165\1\162\1\145\1\163\1\151\1\162\1\151\1\171\1\160\1\56\1\75\5\uffff\1\76\3\uffff\1\75\1\76\2\75\1\76\1\75\1\174\1\46\1\75\2\72\1\160\1\157\1\164\1\156\1\141\1\151\1\141\1\170\1\154\1\172\5\uffff\1\164\1\157\1\141\1\147\1\146\1\162\3\uffff\1\157\1\172\1\160\1\172\1\156\1\163\1\172\1\143\1\162\1\164\1\147\1\163\2\164\1\156\1\162\1\157\1\154\1\114\1\162\1\155\1\145\1\162\1\167\1\164\1\156\1\126\1\157\1\151\1\141\1\151\1\160\1\156\1\111\1\145\1\170\1\144\1\172\1\167\1\154\1\145\1\164\1\160\1\171\1\154\1\172\1\144\1\151\1\164\1\172\1\164\1\172\1\144\1\172\1\171\1\160\1\162\1\160\1\143\1\74\11\uffff\1\75\33\uffff\1\75\6\uffff\1\147\1\167\1\156\1\141\1\151\1\164\1\154\1\156\1\uffff\1\154\4\uffff\1\153\1\150\1\160\1\151\2\172\1\163\1\165\2\145\1\164\1\uffff\1\157\1\uffff\1\165\1\143\1\151\1\141\1\uffff\1\164\2\172\1\157\1\172\1\165\1\157\1\150\1\155\1\145\1\157\1\151\1\162\2\145\1\141\1\172\1\155\1\163\2\172\1\153\1\145\2\147\1\141\1\153\2\145\1\147\1\164\1\172\1\164\1\160\2\164\1\145\1\143\1\172\1\143\2\145\1\uffff\1\172\1\154\1\141\1\150\1\151\1\145\1\143\1\151\1\171\1\172\1\157\1\151\1\uffff\1\172\1\162\1\154\1\150\1\uffff\1\145\1\uffff\1\145\1\uffff\1\155\1\145\1\172\1\145\1\157\1\145\1\141\6\uffff\1\172\1\104\1\157\1\162\1\166\1\145\1\154\1\144\1\141\1\172\1\145\1\156\2\uffff\1\151\1\160\1\162\1\156\1\141\1\162\1\154\1\164\1\162\1\164\1\155\1\165\1\157\1\144\2\uffff\2\162\1\uffff\1\162\1\166\1\164\1\145\1\172\1\144\1\164\1\145\1\163\1\156\1\172\1\154\1\141\1\uffff\1\172\1\145\1\uffff\1\171\1\151\1\162\1\157\1\uffff\1\145\1\124\1\172\1\145\1\154\1\165\1\162\1\163\1\164\1\124\1\uffff\1\145\1\114\1\151\1\143\1\162\1\150\1\uffff\1\165\1\144\1\116\1\uffff\1\172\1\164\1\145\1\164\1\172\1\150\1\156\2\172\1\uffff\1\167\1\147\1\uffff\2\145\1\172\1\164\3\172\1\uffff\1\157\1\167\1\162\1\160\1\uffff\1\141\1\163\1\164\1\145\1\172\1\151\1\157\1\147\1\uffff\1\162\1\172\1\163\1\172\1\143\1\164\1\156\1\164\1\154\1\156\1\151\1\145\1\151\1\154\1\162\1\141\1\164\1\145\1\156\1\145\1\124\1\156\1\uffff\1\151\1\171\1\163\1\145\1\164\1\163\1\uffff\1\154\1\164\1\uffff\1\172\1\101\1\157\1\156\1\157\1\170\1\172\1\162\1\171\1\uffff\1\172\1\145\1\160\1\103\1\164\1\150\1\162\1\103\1\151\1\143\1\150\1\172\1\162\1\164\1\172\1\141\1\uffff\1\145\1\123\1\141\1\uffff\1\172\1\147\2\uffff\1\116\1\156\2\172\1\uffff\1\55\3\uffff\1\146\1\172\1\103\1\151\1\164\1\145\1\104\1\162\1\uffff\1\163\1\155\1\145\1\164\1\uffff\1\164\1\uffff\1\150\1\172\1\143\2\172\1\165\1\142\1\106\2\164\1\116\1\164\1\172\1\156\2\172\1\162\1\164\1\156\1\172\1\163\1\172\1\106\1\151\1\163\1\171\1\172\1\uffff\1\164\1\142\1\147\1\155\1\145\1\uffff\1\120\1\102\1\160\1\uffff\2\172\1\141\1\111\1\172\1\151\1\150\1\156\2\172\1\uffff\1\157\1\145\1\uffff\1\155\1\117\1\151\1\154\1\uffff\1\172\1\157\1\172\3\uffff\1\172\1\uffff\1\141\1\164\1\145\1\143\1\141\1\163\1\145\2\172\1\171\1\172\1\141\1\uffff\1\145\2\uffff\1\154\1\145\1\151\1\145\1\172\1\141\1\145\1\uffff\1\143\2\uffff\1\151\1\123\1\147\1\uffff\1\151\1\uffff\1\151\1\157\2\172\1\uffff\1\164\3\172\1\144\1\141\1\156\1\171\1\145\2\uffff\1\163\1\155\1\170\1\uffff\1\155\1\141\1\145\2\uffff\1\156\1\103\1\145\1\156\1\172\1\151\1\uffff\1\122\2\uffff\1\163\1\141\1\172\1\157\1\164\1\141\1\143\2\uffff\1\172\1\uffff\1\156\1\157\1\154\1\144\1\154\1\162\1\uffff\1\155\1\172\1\145\1\155\1\151\1\172\1\157\1\154\1\156\2\uffff\1\162\1\uffff\1\157\2\uffff\1\114\2\164\2\172\1\145\2\160\1\172\1\162\1\163\1\151\1\157\2\172\1\145\1\172\2\145\1\154\1\uffff\1\156\1\145\1\154\1\157\1\uffff\1\147\1\146\1\172\1\102\1\145\1\172\1\145\1\uffff\1\144\2\172\1\uffff\1\156\1\164\1\172\1\151\1\144\1\145\1\150\1\151\2\uffff\1\172\2\157\1\uffff\1\141\2\172\1\156\2\uffff\1\172\1\145\1\163\1\172\1\151\1\144\1\172\1\154\1\156\1\145\1\172\1\uffff\1\171\1\101\1\uffff\1\172\1\102\1\uffff\1\145\1\172\1\145\1\uffff\1\142\1\145\1\156\1\172\1\164\1\uffff\2\162\1\143\1\uffff\1\145\1\164\1\uffff\1\172\1\165\1\uffff\1\172\1\163\1\uffff\1\171\1\144\1\172\1\uffff\1\172\1\146\1\uffff\1\171\1\172\1\uffff\1\162\1\165\1\154\1\147\1\uffff\1\171\3\164\1\144\1\145\1\151\1\uffff\1\154\1\145\1\172\1\125\1\163\2\uffff\1\164\1\172\1\uffff\1\172\1\164\1\172\1\164\3\172\1\145\1\172\1\170\1\162\1\164\1\106\1\uffff\1\156\1\172\1\145\2\uffff\1\145\1\uffff\1\150\3\uffff\1\162\1\uffff\1\164\1\163\1\172\2\151\1\uffff\1\162\4\172\1\164\1\uffff\1\162\1\161\1\111\4\uffff\1\127\1\163\1\165\1\155\1\157\1\164\1\145\1\160\1\162\1\127\1\111\1\157\1\144\1\157\1\144\1\162\1\172\1\162\1\145\1\164\1\uffff\1\144\1\156\2\172\1\164\2\uffff\1\151\1\146\1\151\1\145\1\162\1\172\1\uffff";
     static final String DFA21_acceptS =
-        "\2\uffff\1\2\1\3\30\uffff\1\103\1\104\1\105\1\106\1\107\1\uffff\1\111\1\112\1\113\25\uffff\1\u009e\2\u009f\1\u00a2\1\u00a3\6\uffff\1\u009e\1\2\1\3\67\uffff\1\76\1\116\1\143\1\101\1\103\1\104\1\105\1\106\1\107\1\uffff\1\136\1\110\1\111\1\112\1\113\1\114\1\147\1\141\1\115\1\133\1\150\1\142\1\117\1\u00a0\1\u00a1\1\144\1\120\1\145\1\137\1\u0096\1\121\1\123\1\122\1\124\1\153\1\125\1\u0084\1\uffff\1\146\1\140\1\152\1\u0083\1\151\1\157\10\uffff\1\u009b\1\uffff\1\u009c\1\u009d\1\u009f\1\u00a2\14\uffff\1\154\4\uffff\1\163\45\uffff\1\102\11\uffff\1\47\1\uffff\1\u009a\5\uffff\1\70\2\uffff\1\72\4\uffff\1\134\1\135\1\130\1\126\1\131\1\127\14\uffff\1\u0087\1\u008a\16\uffff\1\165\1\164\1\uffff\1\64\14\uffff\1\46\2\uffff\1\15\3\uffff\1\71\7\uffff\1\21\6\uffff\1\26\2\uffff\1\170\10\uffff\1\45\6\uffff\1\u0099\2\uffff\1\177\2\uffff\1\u0086\10\uffff\1\14\24\uffff\1\155\6\uffff\1\13\2\uffff\1\62\7\uffff\1\u0088\14\uffff\1\173\2\uffff\1\161\2\uffff\1\61\1\43\1\uffff\1\50\4\uffff\1\66\1\172\6\uffff\1\u008e\4\uffff\1\u0085\1\uffff\1\4\31\uffff\1\171\3\uffff\1\52\3\uffff\1\u0094\7\uffff\1\167\5\uffff\1\u0082\1\uffff\1\u0089\1\65\1\162\3\uffff\1\175\12\uffff\1\25\1\uffff\1\77\1\u0097\7\uffff\1\10\1\176\1\u0095\2\uffff\1\31\1\uffff\1\41\4\uffff\1\40\7\uffff\1\20\1\37\4\uffff\1\100\1\156\5\uffff\1\60\1\uffff\1\67\1\174\5\uffff\1\u0091\1\1\1\uffff\1\u0093\6\uffff\1\160\7\uffff\1\166\1\u0080\1\uffff\1\73\1\uffff\1\42\17\uffff\1\u008b\4\uffff\1\63\7\uffff\1\30\1\uffff\1\17\7\uffff\1\57\1\75\6\uffff\1\32\1\33\11\uffff\1\u0098\2\uffff\1\22\4\uffff\1\74\7\uffff\1\24\2\uffff\1\51\3\uffff\1\u008c\3\uffff\1\132\2\uffff\1\7\1\uffff\1\36\3\uffff\1\55\13\uffff\1\5\1\6\1\uffff\1\11\13\uffff\1\u0090\3\uffff\1\44\1\uffff\1\27\1\56\1\34\1\35\1\uffff\1\u0081\4\uffff\1\u008f\4\uffff\1\53\3\uffff\1\16\1\23\1\u0092\22\uffff\1\54\1\uffff\1\12\6\uffff\1\u008d";
+        "\2\uffff\1\2\1\3\32\uffff\1\120\1\121\1\122\1\123\1\124\1\uffff\1\126\1\127\1\130\25\uffff\1\u00ab\2\u00ac\1\u00af\1\u00b0\6\uffff\1\u00ab\1\2\1\3\74\uffff\1\113\1\133\1\160\1\116\1\120\1\121\1\122\1\123\1\124\1\uffff\1\153\1\125\1\126\1\127\1\130\1\131\1\164\1\156\1\132\1\150\1\165\1\157\1\134\1\u00ad\1\u00ae\1\161\1\135\1\162\1\154\1\u00a3\1\136\1\140\1\137\1\141\1\170\1\142\1\u0091\1\uffff\1\163\1\155\1\167\1\u0090\1\166\1\174\10\uffff\1\u00a8\1\uffff\1\u00a9\1\u00aa\1\u00ac\1\u00af\13\uffff\1\51\1\uffff\1\171\4\uffff\1\u0080\52\uffff\1\117\14\uffff\1\73\4\uffff\1\67\1\uffff\1\u00a7\1\uffff\1\75\7\uffff\1\151\1\152\1\145\1\143\1\146\1\144\14\uffff\1\u0094\1\u0097\16\uffff\1\u0082\1\u0081\2\uffff\1\66\15\uffff\1\50\2\uffff\1\15\4\uffff\1\74\12\uffff\1\21\6\uffff\1\26\3\uffff\1\u0085\11\uffff\1\47\2\uffff\1\u00a6\7\uffff\1\u008c\4\uffff\1\u0093\10\uffff\1\14\26\uffff\1\172\6\uffff\1\13\2\uffff\1\64\11\uffff\1\u0095\20\uffff\1\u0088\3\uffff\1\176\2\uffff\1\63\1\45\4\uffff\1\72\1\uffff\1\70\1\103\1\u0087\10\uffff\1\u009b\4\uffff\1\u0092\1\uffff\1\4\33\uffff\1\u0086\5\uffff\1\54\3\uffff\1\u00a1\12\uffff\1\u0084\2\uffff\1\31\4\uffff\1\u008f\3\uffff\1\56\1\177\1\u0096\1\uffff\1\u008a\14\uffff\1\25\1\uffff\1\114\1\u00a4\7\uffff\1\10\1\uffff\1\u008b\1\u00a2\3\uffff\1\32\1\uffff\1\43\4\uffff\1\42\11\uffff\1\20\1\41\3\uffff\1\102\3\uffff\1\115\1\173\6\uffff\1\62\1\uffff\1\71\1\u0089\7\uffff\1\u009e\1\1\1\uffff\1\u00a0\6\uffff\1\175\11\uffff\1\u0083\1\u008d\1\uffff\1\76\1\uffff\1\44\1\52\24\uffff\1\u0098\4\uffff\1\65\7\uffff\1\30\3\uffff\1\17\10\uffff\1\61\1\100\3\uffff\1\104\4\uffff\1\34\1\35\13\uffff\1\u00a5\2\uffff\1\22\2\uffff\1\105\3\uffff\1\77\5\uffff\1\106\3\uffff\1\24\2\uffff\1\55\2\uffff\1\107\2\uffff\1\u0099\3\uffff\1\147\2\uffff\1\7\2\uffff\1\40\4\uffff\1\57\7\uffff\1\112\5\uffff\1\5\1\6\2\uffff\1\11\15\uffff\1\u009d\3\uffff\1\33\1\46\1\uffff\1\27\1\uffff\1\60\1\36\1\37\1\uffff\1\u008e\5\uffff\1\u009c\6\uffff\1\53\3\uffff\1\16\1\101\1\23\1\u009f\24\uffff\1\110\5\uffff\1\12\1\111\6\uffff\1\u009a";
     static final String DFA21_specialS =
-        "\1\0\u0304\uffff}>";
+        "\1\0\u036a\uffff}>";
     static final String[] DFA21_transitionS = {
-            "\11\76\2\75\2\76\1\75\22\76\1\75\1\55\1\73\1\42\1\72\1\50\1\54\1\74\1\36\1\40\1\33\1\45\1\37\1\46\1\32\1\47\1\67\11\70\1\57\1\34\1\51\1\41\1\52\1\56\1\35\2\72\1\16\1\64\1\21\7\72\1\65\1\61\3\72\1\66\1\62\1\72\1\63\2\72\1\13\2\72\1\43\1\76\1\44\1\71\1\72\1\76\1\27\1\72\1\23\1\6\1\11\1\12\1\4\1\30\1\5\1\60\1\24\1\15\1\14\1\22\1\25\1\1\1\17\1\10\1\20\1\31\1\72\1\7\1\26\3\72\1\2\1\53\1\3\uff82\76",
-            "\1\77\2\uffff\1\103\1\104\6\uffff\1\101\1\uffff\1\102\3\uffff\1\100",
+            "\11\100\2\77\2\100\1\77\22\100\1\77\1\57\1\75\1\44\1\74\1\52\1\56\1\76\1\40\1\42\1\35\1\47\1\41\1\50\1\34\1\51\1\71\11\72\1\61\1\36\1\53\1\43\1\54\1\60\1\37\2\74\1\16\1\66\1\21\1\22\6\74\1\67\1\63\3\74\1\70\1\64\1\74\1\65\2\74\1\13\2\74\1\45\1\100\1\46\1\73\1\74\1\100\1\26\1\74\1\24\1\6\1\11\1\12\1\4\1\31\1\5\1\62\1\25\1\15\1\14\1\23\1\30\1\1\1\17\1\10\1\20\1\32\1\33\1\7\1\27\3\74\1\2\1\55\1\3\uff82\100",
+            "\1\101\2\uffff\1\105\1\106\6\uffff\1\103\1\uffff\1\104\3\uffff\1\102",
             "",
             "",
-            "\1\110",
-            "\1\113\6\uffff\1\112\1\111\4\uffff\1\114",
-            "\1\115\11\uffff\1\116",
-            "\1\120\3\uffff\1\117",
-            "\1\121",
-            "\1\122\1\uffff\1\123\11\uffff\1\124",
-            "\1\130\7\uffff\1\125\5\uffff\1\126\2\uffff\1\127",
-            "\1\131",
-            "\1\132\3\uffff\1\135\3\uffff\1\133\6\uffff\1\134",
-            "\1\137\15\uffff\1\136",
-            "\1\140",
-            "\1\141",
-            "\1\142\10\uffff\1\143\1\145\1\uffff\1\144\1\uffff\1\146",
-            "\1\147\63\uffff\1\150",
-            "\1\153\11\uffff\1\151\3\uffff\1\152\1\uffff\1\154",
-            "\1\156\15\uffff\1\157\2\uffff\1\155",
-            "\1\160",
-            "\1\162\12\uffff\1\161\3\uffff\1\163",
-            "\1\165\1\164",
+            "\1\112",
+            "\1\115\6\uffff\1\114\1\113\4\uffff\1\116",
+            "\1\117\11\uffff\1\120",
+            "\1\122\3\uffff\1\121",
+            "\1\123\3\uffff\1\124",
+            "\1\125\1\uffff\1\126\11\uffff\1\127",
+            "\1\133\7\uffff\1\130\5\uffff\1\131\2\uffff\1\132",
+            "\1\134",
+            "\1\135\3\uffff\1\140\3\uffff\1\136\6\uffff\1\137",
+            "\1\142\3\uffff\1\143\11\uffff\1\141",
+            "\1\144",
+            "\1\145",
+            "\1\146\10\uffff\1\147\1\151\1\uffff\1\150\1\uffff\1\152",
+            "\1\153\63\uffff\1\154",
+            "\1\155",
+            "\1\160\11\uffff\1\156\3\uffff\1\157\1\uffff\1\161",
+            "\1\163\15\uffff\1\164\2\uffff\1\162",
+            "\1\165",
             "\1\166\1\uffff\1\170\4\uffff\1\167",
-            "\1\171",
-            "\1\175\6\uffff\1\172\2\uffff\1\173\6\uffff\1\174",
+            "\1\171\1\172",
+            "\1\174\12\uffff\1\173\3\uffff\1\175",
             "\1\176",
-            "\1\u0081\22\uffff\1\u0080",
+            "\1\u0082\6\uffff\1\177\2\uffff\1\u0080\6\uffff\1\u0081",
+            "\1\u0084\1\uffff\1\u0083",
+            "\1\u0085",
+            "\1\u0088\22\uffff\1\u0087",
             "",
             "",
             "",
             "",
             "",
-            "\1\u0088\1\u0089",
+            "\1\u008f\1\u0090",
             "",
             "",
             "",
-            "\1\u008f\21\uffff\1\u008e",
-            "\1\u0093\17\uffff\1\u0091\1\u0092",
-            "\1\u0096\4\uffff\1\u0097\15\uffff\1\u0095",
-            "\1\u0099",
-            "\1\u009c\1\u009b",
-            "\1\u009e",
+            "\1\u0096\21\uffff\1\u0095",
+            "\1\u009a\17\uffff\1\u0098\1\u0099",
+            "\1\u009d\4\uffff\1\u009e\15\uffff\1\u009c",
             "\1\u00a0",
-            "\1\u00a2",
-            "\1\u00a4",
-            "\1\u00a7\13\uffff\1\u00a6",
+            "\1\u00a3\1\u00a2",
+            "\1\u00a5",
+            "\1\u00a7",
             "\1\u00a9",
             "\1\u00ab",
-            "\1\u00ad\15\uffff\1\u00ac",
-            "\1\u00ae",
-            "\1\u00af",
+            "\1\u00ae\13\uffff\1\u00ad",
             "\1\u00b0",
-            "\1\u00b1",
             "\1\u00b2",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3\6\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\13\uffff\1\u00b3",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "\1\105\34\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u00b4\15\uffff\1\u00b3",
+            "\1\u00b5",
+            "\1\u00b6",
+            "\1\u00b7",
+            "\1\u00b8",
+            "\1\u00b9",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\13\uffff\1\u00ba\6\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\13\uffff\1\u00ba",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\22\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd",
+            "\1\107\34\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "",
             "",
             "",
             "",
             "",
-            "\1\u00b9\20\uffff\1\u00ba",
-            "\1\u00bb",
-            "\1\u00bc",
-            "\1\u00bd",
-            "\1\u00be",
-            "\1\u00bf",
-            "",
-            "",
-            "",
-            "\1\u00c0",
-            "\1\u00c2\16\uffff\1\u00c3\1\u00c1",
+            "\1\u00c0\20\uffff\1\u00c1",
+            "\1\u00c2",
+            "\1\u00c3",
             "\1\u00c4",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u00c5",
             "\1\u00c6",
-            "\1\u00c9\5\uffff\1\u00c8\6\uffff\1\u00c7",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u00cb",
-            "\1\u00cc\5\uffff\1\u00cd",
-            "\1\u00cf\6\uffff\1\u00d1\2\uffff\1\u00ce\3\uffff\1\u00d0",
-            "\1\u00d2\15\uffff\1\u00d3",
-            "\1\u00d4\20\uffff\1\u00d5",
-            "\1\u00d6\3\uffff\1\u00d7",
-            "\1\u00d8\1\uffff\1\u00d9",
+            "",
+            "",
+            "",
+            "\1\u00c7",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\3\107\1\u00c9\16\107\1\u00ca\1\u00c8\6\107",
+            "\1\u00cc",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u00ce",
+            "\1\u00d1\5\uffff\1\u00d0\6\uffff\1\u00cf",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u00d3",
+            "\1\u00d4\5\uffff\1\u00d5",
+            "\1\u00d7\6\uffff\1\u00d9\2\uffff\1\u00d6\3\uffff\1\u00d8",
             "\1\u00da",
-            "\1\u00db",
-            "\1\u00dc",
-            "\1\u00dd",
-            "\1\u00de\1\uffff\1\u00df",
-            "\1\u00e0",
-            "\1\u00e1",
-            "\1\u00e2",
-            "\1\u00e3\13\uffff\1\u00e4",
+            "\1\u00db\15\uffff\1\u00dc",
+            "\1\u00dd\20\uffff\1\u00de",
+            "\1\u00df\3\uffff\1\u00e0",
+            "\1\u00e1\1\uffff\1\u00e2",
+            "\1\u00e3",
+            "\1\u00e4",
             "\1\u00e5",
             "\1\u00e6",
-            "\1\u00e7",
-            "\1\u00e8",
+            "\1\u00e7\1\uffff\1\u00e8",
             "\1\u00e9",
             "\1\u00ea",
             "\1\u00eb",
-            "\1\u00ec",
-            "\1\u00ed",
-            "\1\u00ee",
+            "\1\u00ec\13\uffff\1\u00ed\7\uffff\1\u00ee",
             "\1\u00ef",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u00f1",
+            "\1\u00f1\7\uffff\1\u00f0",
             "\1\u00f2",
             "\1\u00f3",
-            "\1\u00f4\17\uffff\1\u00f5\1\u00f6",
-            "\1\u00f7\13\uffff\1\u00f8",
+            "\1\u00f4",
+            "\1\u00f5",
+            "\1\u00f6",
+            "\1\u00f7",
+            "\1\u00f8",
             "\1\u00f9",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u00fa",
             "\1\u00fb",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u00fd",
-            "\1\u00fe\3\uffff\1\u00ff",
+            "\1\u00fc",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u00fe",
+            "\1\u00ff",
             "\1\u0100",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\22\105\1\u0101\7\105",
-            "\1\u0103",
-            "\1\u0104",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0106\3\uffff\1\u0107",
+            "\1\u0101\14\uffff\1\u0102\2\uffff\1\u0103\1\u0104",
+            "\1\u0105\13\uffff\1\u0106",
+            "\1\u0107",
             "\1\u0108",
-            "\1\u0109",
-            "\1\u010a",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\u010c",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\22\107\1\u0109\7\107",
+            "\1\u010b",
+            "\1\u010c\3\uffff\1\u010d",
             "\1\u010e",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0110",
-            "\1\u0111",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0112",
-            "\1\u0113",
-            "\1\u0114",
-            "\1\u0115",
-            "\1\u0116",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0114\13\uffff\1\u0115\3\uffff\1\u0116",
             "\1\u0117",
-            "",
-            "\12\u00b4\10\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6\22\uffff\1\u00b4\2\uffff\1\u00b6\1\uffff\3\u00b6\5\uffff\1\u00b6",
-            "",
-            "",
-            "",
-            "",
             "\1\u0118",
             "\1\u0119",
             "\1\u011a",
             "\1\u011b",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u011e",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\u011d",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u011f",
-            "\1\u0120",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
             "\1\u0121",
             "\1\u0122",
             "\1\u0123",
-            "",
-            "\1\u0125\5\uffff\1\u0124",
+            "\1\u0124",
+            "\1\u0125",
             "\1\u0126",
-            "\1\u0127\3\uffff\1\u0128",
-            "\1\u0129",
+            "\1\u0127",
+            "\1\u0128",
             "",
+            "\12\u00bb\10\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd\22\uffff\1\u00bb\2\uffff\1\u00bd\1\uffff\3\u00bd\5\uffff\1\u00bd",
+            "",
+            "",
+            "",
+            "",
+            "\1\u0129",
             "\1\u012a",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\10\105\1\u012b\21\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u012e",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u012b",
+            "\1\u012c",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u012f",
             "\1\u0130",
             "\1\u0131",
             "\1\u0132",
             "\1\u0133",
+            "",
             "\1\u0134",
-            "\1\u0135",
-            "\1\u0137\2\uffff\1\u0136",
-            "\1\u0138",
-            "\1\u0139",
+            "",
+            "\1\u0136\5\uffff\1\u0135",
+            "\1\u0137",
+            "\1\u0138\3\uffff\1\u0139",
             "\1\u013a",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\14\105\1\u013b\15\105",
-            "\1\u013d",
-            "\1\u013e",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\1\105\1\u0140\21\105\1\u0142\6\105\4\uffff\1\105\1\uffff\17\105\1\u0141\12\105",
+            "",
+            "\1\u013b",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\10\107\1\u013c\21\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u013f",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\4\107\1\u0140\25\107",
+            "\1\u0142",
+            "\1\u0143",
             "\1\u0144",
             "\1\u0145",
             "\1\u0146",
             "\1\u0147",
             "\1\u0148",
-            "\1\u0149",
-            "\1\u014a",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u014a\2\uffff\1\u0149",
+            "\1\u014b",
             "\1\u014c",
             "\1\u014d",
-            "\1\u014e",
-            "\1\u014f",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\14\107\1\u014e\15\107",
             "\1\u0150",
             "\1\u0151",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0153",
-            "\1\u0154",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0156",
-            "\1\u0157",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\1\107\1\u0153\3\107\1\u0155\15\107\1\u0156\6\107\4\uffff\1\107\1\uffff\17\107\1\u0154\12\107",
             "\1\u0158",
             "\1\u0159",
             "\1\u015a",
             "\1\u015b",
             "\1\u015c",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\22\105\1\u015d\7\105",
-            "",
+            "\1\u015d",
+            "\1\u015e",
             "\1\u015f",
-            "",
             "\1\u0160",
             "\1\u0161",
-            "\1\u0162",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0163",
             "\1\u0164",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0165",
             "\1\u0166",
-            "",
             "\1\u0167",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0169",
+            "\1\u0168",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u016a",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u016b",
             "\1\u016c",
-            "\1\u016d",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u016e",
             "\1\u016f",
             "\1\u0170",
             "\1\u0171",
             "\1\u0172",
             "\1\u0173",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0174",
             "\1\u0175",
-            "\1\u0176",
-            "",
-            "",
-            "\1\u0177",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\22\107\1\u0176\7\107",
             "\1\u0178",
             "\1\u0179",
-            "\1\u017a",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u017b",
             "\1\u017c",
             "\1\u017d",
+            "",
             "\1\u017e",
+            "",
             "\1\u017f",
+            "",
             "\1\u0180",
             "\1\u0181",
-            "\1\u0182",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0183",
             "\1\u0184",
-            "",
-            "",
             "\1\u0185",
-            "",
             "\1\u0186",
-            "\1\u0187",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0188",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0189",
             "\1\u018a",
             "\1\u018b",
             "\1\u018c",
-            "\1\u018e\1\u018d",
+            "\1\u018d",
+            "\1\u018e",
             "\1\u018f",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0191",
             "\1\u0192",
             "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0194",
             "",
-            "\1\u0196\14\uffff\1\u0195",
+            "\1\u0193",
+            "\1\u0194",
+            "\1\u0195",
+            "\1\u0196",
             "\1\u0197",
             "\1\u0198",
-            "",
             "\1\u0199",
             "\1\u019a",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u019b",
             "\1\u019c",
             "\1\u019d",
             "\1\u019e",
             "\1\u019f",
-            "",
             "\1\u01a0",
+            "",
+            "",
             "\1\u01a1",
             "\1\u01a2",
+            "",
             "\1\u01a3",
             "\1\u01a4",
             "\1\u01a5",
-            "",
             "\1\u01a6",
-            "\1\u01a7",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u01a8",
             "\1\u01a9",
             "\1\u01aa",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u01ac",
+            "\1\u01ac\1\u01ab",
             "\1\u01ad",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u01af",
             "\1\u01b0",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01b2",
-            "\1\u01b3",
-            "\1\u01b4",
+            "",
+            "\1\u01b4\14\uffff\1\u01b3",
             "\1\u01b5",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\u01b7\10\uffff\1\u01b6",
             "\1\u01b8",
-            "\1\u01b9",
             "",
+            "\1\u01b9",
             "\1\u01ba",
-            "\1\u01bb",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01bc",
             "\1\u01bd",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01be",
             "\1\u01bf",
             "\1\u01c0",
             "\1\u01c1",
-            "",
             "\1\u01c2",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "",
+            "\1\u01c3",
             "\1\u01c4",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01c5",
             "\1\u01c6",
             "\1\u01c7",
             "\1\u01c8",
+            "",
             "\1\u01c9",
             "\1\u01ca",
             "\1\u01cb",
-            "\1\u01cc",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01cd",
             "\1\u01ce",
             "\1\u01cf",
-            "\1\u01d0",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01d1",
             "\1\u01d2",
-            "\1\u01d3",
-            "\1\u01d4",
-            "\1\u01d5",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "",
+            "\1\u01d5",
             "\1\u01d6",
+            "",
             "\1\u01d7",
             "\1\u01d8",
-            "\1\u01d9",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01da",
-            "\1\u01dc\16\uffff\1\u01db",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "",
-            "\1\u01dd",
             "\1\u01de",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01df",
             "\1\u01e0",
             "\1\u01e1",
-            "\1\u01e2",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u01e5\15\uffff\1\u01e4",
-            "\1\u01e6",
             "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01e2",
+            "\1\u01e3",
+            "\1\u01e4",
+            "\1\u01e5",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u01e7",
             "\1\u01e8",
             "\1\u01e9",
+            "",
             "\1\u01ea",
-            "\1\u01eb",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01ec",
-            "\1\u01ed",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u01ee",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01ef",
             "\1\u01f0",
             "\1\u01f1",
             "\1\u01f2",
-            "",
             "\1\u01f3",
             "\1\u01f4",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01f5",
             "\1\u01f6",
-            "",
-            "",
             "\1\u01f7",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01f8",
+            "\1\u01f9",
             "\1\u01fa",
             "\1\u01fb",
-            "",
-            "",
             "\1\u01fc",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u01fd",
             "\1\u01fe",
             "\1\u01ff",
+            "",
             "\1\u0200",
             "\1\u0201",
-            "",
             "\1\u0202",
             "\1\u0203",
             "\1\u0204",
-            "\1\u0205",
-            "",
-            "\1\u0206",
+            "\1\u0206\16\uffff\1\u0205",
             "",
             "\1\u0207",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0209",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0208",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u020a",
+            "\1\u020b",
             "\1\u020c",
             "\1\u020d",
             "\1\u020e",
-            "\1\u020f",
-            "\1\u0210",
-            "\1\u0211",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0211\15\uffff\1\u0210",
             "\1\u0212",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0214",
+            "\1\u0215",
             "\1\u0216",
             "\1\u0217",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0218",
             "\1\u0219",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u021a",
             "\1\u021b",
             "\1\u021c",
             "\1\u021d",
-            "\1\u021e",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u021f",
             "\1\u0220",
-            "\1\u0221",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0222",
             "",
-            "\1\u0224\12\uffff\1\u0223",
+            "\1\u0223",
+            "\1\u0224",
             "\1\u0225",
-            "\1\u0226",
             "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u022a\3\uffff\1\u0229",
-            "\1\u022b",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0227",
+            "",
+            "",
+            "\1\u0228",
+            "\1\u0229",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
             "\1\u022c",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
             "",
+            "",
+            "",
+            "\1\u022d",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u022f",
             "\1\u0230",
             "\1\u0231",
             "\1\u0232",
             "\1\u0233",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
-            "",
+            "\1\u0234",
             "",
             "\1\u0235",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\u0236",
+            "\1\u0237",
             "\1\u0238",
+            "",
             "\1\u0239",
+            "",
             "\1\u023a",
-            "\1\u023b",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u023c",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u023f",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0240",
             "\1\u0241",
-            "",
             "\1\u0242",
-            "",
-            "",
             "\1\u0243",
             "\1\u0244",
             "\1\u0245",
-            "\1\u0246",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0248",
-            "\1\u0249",
-            "",
-            "",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0247",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u024a",
             "\1\u024b",
-            "",
             "\1\u024c",
-            "",
-            "\1\u024d",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u024e",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0250",
             "\1\u0251",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\14\105\1\u0253\15\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0252",
+            "\1\u0253",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
             "\1\u0255",
             "\1\u0256",
             "\1\u0257",
             "\1\u0258",
-            "",
-            "",
             "\1\u0259",
-            "\1\u025a",
-            "\1\u025b",
+            "",
+            "\1\u025b\12\uffff\1\u025a",
             "\1\u025c",
-            "",
-            "",
             "\1\u025d",
-            "\1\u025e",
-            "\1\u025f",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0260",
-            "\1\u0261",
-            "",
-            "\1\u0262\33\uffff\1\u0263",
-            "",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0262\3\uffff\1\u0261",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0264",
             "\1\u0265",
             "\1\u0266",
-            "\1\u0267",
-            "\1\u0268",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\u0269",
             "\1\u026a",
+            "",
             "\1\u026b",
             "\1\u026c",
             "\1\u026d",
             "\1\u026e",
-            "\1\u026f",
             "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0270",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0272",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "\1\u0273",
             "\1\u0274",
             "\1\u0275",
             "\1\u0276",
-            "",
-            "",
             "\1\u0277",
-            "",
             "\1\u0278",
-            "",
             "\1\u0279",
-            "\1\u027a",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u027d",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u027c",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u027e",
+            "",
             "\1\u027f",
+            "",
+            "",
             "\1\u0280",
             "\1\u0281",
             "\1\u0282",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0283",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0285",
             "\1\u0286",
+            "",
             "\1\u0287",
             "",
+            "",
             "\1\u0288",
             "\1\u0289",
             "\1\u028a",
+            "",
             "\1\u028b",
             "",
             "\1\u028c",
             "\1\u028d",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u028f",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
             "\1\u0290",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u0292",
-            "",
-            "\1\u0293",
-            "",
-            "\1\u0294",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\14\107\1\u0292\15\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0295",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0296",
             "\1\u0297",
             "\1\u0298",
             "\1\u0299",
+            "",
+            "",
             "\1\u029a",
-            "",
-            "",
             "\1\u029b",
             "\1\u029c",
+            "",
             "\1\u029d",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u029e",
             "\1\u029f",
+            "",
+            "",
             "\1\u02a0",
-            "",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02a1",
             "\1\u02a2",
             "\1\u02a3",
             "\1\u02a4",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02a5",
+            "",
             "\1\u02a6",
+            "",
+            "",
             "\1\u02a7",
             "\1\u02a8",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02aa",
             "\1\u02ab",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02ac",
             "\1\u02ad",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u02af",
             "",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "\1\u02af",
             "\1\u02b0",
             "\1\u02b1",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02b2",
             "\1\u02b3",
             "\1\u02b4",
-            "\1\u02b5",
-            "\1\u02b6",
             "",
+            "\1\u02b5",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02b7",
             "\1\u02b8",
-            "",
             "\1\u02b9",
-            "\1\u02ba",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02bb",
-            "",
             "\1\u02bc",
             "\1\u02bd",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
             "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "",
+            "\1\u02be",
+            "",
+            "\1\u02bf",
+            "",
+            "",
             "\1\u02c0",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\u02c1",
             "\1\u02c2",
-            "\1\u02c3",
-            "\1\u02c4",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02c5",
             "\1\u02c6",
             "\1\u02c7",
-            "\1\u02c8",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02c9",
             "\1\u02ca",
             "\1\u02cb",
             "\1\u02cc",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u02ce",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02cf",
-            "",
-            "",
             "\1\u02d0",
-            "",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02d1",
             "\1\u02d2",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u02d7",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\u02d9",
-            "\1\u02da",
-            "\1\u02db",
+            "\1\u02d3",
             "",
+            "\1\u02d4",
+            "\1\u02d5",
+            "\1\u02d6",
+            "\1\u02d7",
+            "",
+            "\1\u02d8",
+            "\1\u02d9",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u02db",
             "\1\u02dc",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02de",
             "",
             "\1\u02df",
-            "",
-            "",
-            "",
-            "",
-            "\1\u02e0",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02e1",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "",
+            "\1\u02e2",
             "\1\u02e3",
-            "\1\u02e4",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02e5",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
-            "",
+            "\1\u02e6",
+            "\1\u02e7",
+            "\1\u02e8",
             "\1\u02e9",
-            "\1\u02ea",
+            "",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02eb",
-            "",
-            "",
-            "",
             "\1\u02ec",
+            "",
             "\1\u02ed",
-            "\1\u02ee",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02ef",
             "\1\u02f0",
-            "\1\u02f1",
+            "",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02f2",
             "\1\u02f3",
-            "\1\u02f4",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02f5",
             "\1\u02f6",
-            "\1\u02f7",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02f8",
             "\1\u02f9",
             "\1\u02fa",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
             "\1\u02fc",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u02fd",
             "",
-            "\1\u02fe",
-            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u02ff",
+            "",
             "\1\u0300",
-            "\1\u0301",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             "\1\u0302",
+            "",
             "\1\u0303",
-            "\1\105\13\uffff\12\105\7\uffff\32\105\4\uffff\1\105\1\uffff\32\105",
+            "\1\u0304",
+            "\1\u0305",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0307",
+            "",
+            "\1\u0308",
+            "\1\u0309",
+            "\1\u030a",
+            "",
+            "\1\u030b",
+            "\1\u030c",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\5\107\1\u030d\24\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u030f",
+            "",
+            "\1\u0310",
+            "\1\u0311",
+            "",
+            "\1\u0312",
+            "\1\u0313",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0316",
+            "",
+            "\1\u0317",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "\1\u0319",
+            "\1\u031a",
+            "\1\u031b",
+            "\1\u031c",
+            "",
+            "\1\u031d",
+            "\1\u031e",
+            "\1\u031f",
+            "\1\u0320",
+            "\1\u0321",
+            "\1\u0322",
+            "\1\u0323",
+            "",
+            "\1\u0324",
+            "\1\u0325",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0327",
+            "\1\u0328",
+            "",
+            "",
+            "\1\u0329",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u032c",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u032e",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0332",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0334",
+            "\1\u0335",
+            "\1\u0336",
+            "\1\u0337",
+            "",
+            "\1\u0338",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u033a",
+            "",
+            "",
+            "\1\u033b",
+            "",
+            "\1\u033c",
+            "",
+            "",
+            "",
+            "\1\u033d",
+            "",
+            "\1\u033e",
+            "\1\u033f",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0341",
+            "\1\u0342",
+            "",
+            "\1\u0343",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0348",
+            "",
+            "\1\u0349",
+            "\1\u034a",
+            "\1\u034b",
+            "",
+            "",
+            "",
+            "",
+            "\1\u034c",
+            "\1\u034d",
+            "\1\u034e",
+            "\1\u034f",
+            "\1\u0350",
+            "\1\u0351",
+            "\1\u0352",
+            "\1\u0353",
+            "\1\u0354",
+            "\1\u0355",
+            "\1\u0356",
+            "\1\u0357",
+            "\1\u0358",
+            "\1\u0359",
+            "\1\u035a",
+            "\1\u035b",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u035d",
+            "\1\u035e",
+            "\1\u035f",
+            "",
+            "\1\u0360",
+            "\1\u0361",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
+            "\1\u0364",
+            "",
+            "",
+            "\1\u0365",
+            "\1\u0366",
+            "\1\u0367",
+            "\1\u0368",
+            "\1\u0369",
+            "\1\107\13\uffff\12\107\7\uffff\32\107\4\uffff\1\107\1\uffff\32\107",
             ""
     };
 
@@ -6213,7 +6692,7 @@
             this.transition = DFA21_transition;
         }
         public String getDescription() {
-            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
+            return "1:1: Tokens : ( T__13 | T__14 | T__15 | T__16 | T__17 | T__18 | T__19 | T__20 | T__21 | T__22 | T__23 | T__24 | T__25 | T__26 | T__27 | T__28 | T__29 | T__30 | T__31 | T__32 | T__33 | T__34 | T__35 | T__36 | T__37 | T__38 | T__39 | T__40 | T__41 | T__42 | T__43 | T__44 | T__45 | T__46 | T__47 | T__48 | T__49 | T__50 | T__51 | T__52 | T__53 | T__54 | T__55 | T__56 | T__57 | T__58 | T__59 | T__60 | T__61 | T__62 | T__63 | T__64 | T__65 | T__66 | T__67 | T__68 | T__69 | T__70 | T__71 | T__72 | T__73 | T__74 | T__75 | T__76 | T__77 | T__78 | T__79 | T__80 | T__81 | T__82 | T__83 | T__84 | T__85 | T__86 | T__87 | T__88 | T__89 | T__90 | T__91 | T__92 | T__93 | T__94 | T__95 | T__96 | T__97 | T__98 | T__99 | T__100 | T__101 | T__102 | T__103 | T__104 | T__105 | T__106 | T__107 | T__108 | T__109 | T__110 | T__111 | T__112 | T__113 | T__114 | T__115 | T__116 | T__117 | T__118 | T__119 | T__120 | T__121 | T__122 | T__123 | T__124 | T__125 | T__126 | T__127 | T__128 | T__129 | T__130 | T__131 | T__132 | T__133 | T__134 | T__135 | T__136 | T__137 | T__138 | T__139 | T__140 | T__141 | T__142 | T__143 | T__144 | T__145 | T__146 | T__147 | T__148 | T__149 | T__150 | T__151 | T__152 | T__153 | T__154 | T__155 | T__156 | T__157 | T__158 | T__159 | T__160 | T__161 | T__162 | T__163 | T__164 | T__165 | T__166 | T__167 | T__168 | T__169 | T__170 | T__171 | T__172 | T__173 | T__174 | T__175 | T__176 | T__177 | T__178 | T__179 | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_ID | RULE_STRING | RULE_ML_COMMENT | RULE_SL_COMMENT | RULE_WS | RULE_ANY_OTHER );";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             IntStream input = _input;
@@ -6257,95 +6736,99 @@
 
                         else if ( (LA21_0=='E') ) {s = 17;}
 
-                        else if ( (LA21_0=='n') ) {s = 18;}
+                        else if ( (LA21_0=='F') ) {s = 18;}
 
-                        else if ( (LA21_0=='c') ) {s = 19;}
+                        else if ( (LA21_0=='n') ) {s = 19;}
 
-                        else if ( (LA21_0=='k') ) {s = 20;}
+                        else if ( (LA21_0=='c') ) {s = 20;}
 
-                        else if ( (LA21_0=='o') ) {s = 21;}
+                        else if ( (LA21_0=='k') ) {s = 21;}
 
-                        else if ( (LA21_0=='w') ) {s = 22;}
+                        else if ( (LA21_0=='a') ) {s = 22;}
 
-                        else if ( (LA21_0=='a') ) {s = 23;}
+                        else if ( (LA21_0=='w') ) {s = 23;}
 
-                        else if ( (LA21_0=='h') ) {s = 24;}
+                        else if ( (LA21_0=='o') ) {s = 24;}
 
-                        else if ( (LA21_0=='t') ) {s = 25;}
+                        else if ( (LA21_0=='h') ) {s = 25;}
 
-                        else if ( (LA21_0=='.') ) {s = 26;}
+                        else if ( (LA21_0=='t') ) {s = 26;}
 
-                        else if ( (LA21_0=='*') ) {s = 27;}
+                        else if ( (LA21_0=='u') ) {s = 27;}
 
-                        else if ( (LA21_0==';') ) {s = 28;}
+                        else if ( (LA21_0=='.') ) {s = 28;}
 
-                        else if ( (LA21_0=='@') ) {s = 29;}
+                        else if ( (LA21_0=='*') ) {s = 29;}
 
-                        else if ( (LA21_0=='(') ) {s = 30;}
+                        else if ( (LA21_0==';') ) {s = 30;}
 
-                        else if ( (LA21_0==',') ) {s = 31;}
+                        else if ( (LA21_0=='@') ) {s = 31;}
 
-                        else if ( (LA21_0==')') ) {s = 32;}
+                        else if ( (LA21_0=='(') ) {s = 32;}
 
-                        else if ( (LA21_0=='=') ) {s = 33;}
+                        else if ( (LA21_0==',') ) {s = 33;}
 
-                        else if ( (LA21_0=='#') ) {s = 34;}
+                        else if ( (LA21_0==')') ) {s = 34;}
 
-                        else if ( (LA21_0=='[') ) {s = 35;}
+                        else if ( (LA21_0=='=') ) {s = 35;}
 
-                        else if ( (LA21_0==']') ) {s = 36;}
+                        else if ( (LA21_0=='#') ) {s = 36;}
 
-                        else if ( (LA21_0=='+') ) {s = 37;}
+                        else if ( (LA21_0=='[') ) {s = 37;}
 
-                        else if ( (LA21_0=='-') ) {s = 38;}
+                        else if ( (LA21_0==']') ) {s = 38;}
 
-                        else if ( (LA21_0=='/') ) {s = 39;}
+                        else if ( (LA21_0=='+') ) {s = 39;}
 
-                        else if ( (LA21_0=='%') ) {s = 40;}
+                        else if ( (LA21_0=='-') ) {s = 40;}
 
-                        else if ( (LA21_0=='<') ) {s = 41;}
+                        else if ( (LA21_0=='/') ) {s = 41;}
 
-                        else if ( (LA21_0=='>') ) {s = 42;}
+                        else if ( (LA21_0=='%') ) {s = 42;}
 
-                        else if ( (LA21_0=='|') ) {s = 43;}
+                        else if ( (LA21_0=='<') ) {s = 43;}
 
-                        else if ( (LA21_0=='&') ) {s = 44;}
+                        else if ( (LA21_0=='>') ) {s = 44;}
 
-                        else if ( (LA21_0=='!') ) {s = 45;}
+                        else if ( (LA21_0=='|') ) {s = 45;}
 
-                        else if ( (LA21_0=='?') ) {s = 46;}
+                        else if ( (LA21_0=='&') ) {s = 46;}
 
-                        else if ( (LA21_0==':') ) {s = 47;}
+                        else if ( (LA21_0=='!') ) {s = 47;}
 
-                        else if ( (LA21_0=='j') ) {s = 48;}
+                        else if ( (LA21_0=='?') ) {s = 48;}
 
-                        else if ( (LA21_0=='N') ) {s = 49;}
+                        else if ( (LA21_0==':') ) {s = 49;}
 
-                        else if ( (LA21_0=='S') ) {s = 50;}
+                        else if ( (LA21_0=='j') ) {s = 50;}
 
-                        else if ( (LA21_0=='U') ) {s = 51;}
+                        else if ( (LA21_0=='N') ) {s = 51;}
 
-                        else if ( (LA21_0=='D') ) {s = 52;}
+                        else if ( (LA21_0=='S') ) {s = 52;}
 
-                        else if ( (LA21_0=='M') ) {s = 53;}
+                        else if ( (LA21_0=='U') ) {s = 53;}
 
-                        else if ( (LA21_0=='R') ) {s = 54;}
+                        else if ( (LA21_0=='D') ) {s = 54;}
 
-                        else if ( (LA21_0=='0') ) {s = 55;}
+                        else if ( (LA21_0=='M') ) {s = 55;}
 
-                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 56;}
+                        else if ( (LA21_0=='R') ) {s = 56;}
 
-                        else if ( (LA21_0=='^') ) {s = 57;}
+                        else if ( (LA21_0=='0') ) {s = 57;}
 
-                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='B')||(LA21_0>='F' && LA21_0<='L')||(LA21_0>='O' && LA21_0<='Q')||LA21_0=='T'||(LA21_0>='V' && LA21_0<='W')||(LA21_0>='Y' && LA21_0<='Z')||LA21_0=='_'||LA21_0=='b'||LA21_0=='u'||(LA21_0>='x' && LA21_0<='z')) ) {s = 58;}
+                        else if ( ((LA21_0>='1' && LA21_0<='9')) ) {s = 58;}
 
-                        else if ( (LA21_0=='\"') ) {s = 59;}
+                        else if ( (LA21_0=='^') ) {s = 59;}
 
-                        else if ( (LA21_0=='\'') ) {s = 60;}
+                        else if ( (LA21_0=='$'||(LA21_0>='A' && LA21_0<='B')||(LA21_0>='G' && LA21_0<='L')||(LA21_0>='O' && LA21_0<='Q')||LA21_0=='T'||(LA21_0>='V' && LA21_0<='W')||(LA21_0>='Y' && LA21_0<='Z')||LA21_0=='_'||LA21_0=='b'||(LA21_0>='x' && LA21_0<='z')) ) {s = 60;}
 
-                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 61;}
+                        else if ( (LA21_0=='\"') ) {s = 61;}
 
-                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 62;}
+                        else if ( (LA21_0=='\'') ) {s = 62;}
+
+                        else if ( ((LA21_0>='\t' && LA21_0<='\n')||LA21_0=='\r'||LA21_0==' ') ) {s = 63;}
+
+                        else if ( ((LA21_0>='\u0000' && LA21_0<='\b')||(LA21_0>='\u000B' && LA21_0<='\f')||(LA21_0>='\u000E' && LA21_0<='\u001F')||LA21_0=='\\'||LA21_0=='`'||(LA21_0>='~' && LA21_0<='\uFFFF')) ) {s = 64;}
 
                         if ( s>=0 ) return s;
                         break;
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLParser.java b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLParser.java
index b3d4bd6..7ef1648 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLParser.java
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/parser/antlr/internal/InternalDataDSLParser.java
@@ -40,7 +40,7 @@
 @SuppressWarnings("all")
 public class InternalDataDSLParser extends AbstractInternalAntlrParser {
     public static final String[] tokenNames = new String[] {
-        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_INT", "RULE_ID", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'group'", "'interchange'", "'describedBy'", "'vectorName'", "'report'", "'elementSize'", "'deleteFileAfterImport'", "'file'", "'path'", "'XML'", "'mapByAttribute'", "'encoding'", "'locale'", "'CSV'", "'delimiter'", "'quoteCharacter'", "'skipLines'", "'indent'", "'EDI'", "'mappingModel'", "'validate'", "'entity'", "'nodeName'", "'createOn'", "'latestImport'", "'latestExport'", "'expression'", "'lookup'", "'format'", "'expose'", "'mapping'", "'keys'", "'exportFilter'", "'key'", "'for'", "'on'", "'with'", "'cacheSize'", "'mapTo'", "'allowNoResult'", "'allowNonuniqueResult'", "'markerPath'", "'markerEntity'", "'markedBy'", "'coding'", "'copy'", "'from'", "'property'", "'ref'", "'where'", "'hide'", "'assign'", "'as'", "'map'", "'to'", "'mapBlob'", "'extension'", "'mimeType'", "'.'", "'import'", "'static'", "'*'", "'ns'", "';'", "'@'", "'('", "','", "')'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'plain'", "'jpg'", "'png'", "'mpeg'", "'octet-stream'", "'pdf'", "'NowDate'", "'StartDate'", "'UniversallyUniqueIdentifier'", "'Date'", "'Milliseconds'", "'Nanoseconds'", "'Random'", "'ExecuteContext'", "'persist'", "'merge'", "'remove'", "'<='", "'isnull'", "'isnotnull'", "'and'", "'or'"
+        "<invalid>", "<EOR>", "<DOWN>", "<UP>", "RULE_STRING", "RULE_INT", "RULE_ID", "RULE_HEX", "RULE_DECIMAL", "RULE_ML_COMMENT", "RULE_SL_COMMENT", "RULE_WS", "RULE_ANY_OTHER", "'package'", "'{'", "'}'", "'group'", "'interchange'", "'describedBy'", "'vectorName'", "'report'", "'elementSize'", "'deleteFileAfterImport'", "'file'", "'path'", "'XML'", "'mapByAttribute'", "'encoding'", "'locale'", "'CSV'", "'delimiter'", "'quoteCharacter'", "'skipLines'", "'indent'", "'EDI'", "'mappingModel'", "'validate'", "'Fixed'", "'entity'", "'referencedBy'", "'nodeName'", "'createOn'", "'latestImport'", "'latestExport'", "'expression'", "'lookup'", "'format'", "'expose'", "'mapping'", "'keys'", "'exportFilter'", "'key'", "'for'", "'in'", "'mapFrom'", "'allowNoResult'", "'mapTo'", "'cacheSize'", "'where'", "'markerPath'", "'markerEntity'", "'markedBy'", "'coding'", "'copy'", "'from'", "'property'", "'ref'", "'on'", "'hide'", "'assign'", "'with'", "'as'", "'map'", "'to'", "'mapBlob'", "'extension'", "'mimeType'", "'mapFixedLength'", "'length'", "'trim'", "'leftTrim'", "'rightTrim'", "'lowerCase'", "'upperCase'", "'capitalizeFirstWord'", "'uncapitalizeFirstWord'", "'capitalize'", "'.'", "'import'", "'static'", "'*'", "'ns'", "';'", "'@'", "'('", "','", "')'", "'='", "'#'", "'['", "']'", "'+='", "'-='", "'*='", "'/='", "'%='", "'<'", "'>'", "'>='", "'||'", "'&&'", "'=='", "'!='", "'==='", "'!=='", "'instanceof'", "'->'", "'..<'", "'..'", "'=>'", "'<>'", "'?:'", "'+'", "'-'", "'**'", "'/'", "'%'", "'!'", "'++'", "'--'", "'::'", "'?.'", "'|'", "'if'", "'else'", "'switch'", "':'", "'default'", "'case'", "'while'", "'do'", "'var'", "'val'", "'extends'", "'super'", "'new'", "'false'", "'true'", "'null'", "'typeof'", "'throw'", "'return'", "'try'", "'finally'", "'synchronized'", "'catch'", "'?'", "'&'", "'plain'", "'jpg'", "'png'", "'mpeg'", "'octet-stream'", "'pdf'", "'NowDate'", "'StartDate'", "'UniversallyUniqueIdentifier'", "'Date'", "'Milliseconds'", "'Nanoseconds'", "'Random'", "'ExecuteContext'", "'persist'", "'merge'", "'remove'", "'<='", "'isnull'", "'isnotnull'", "'and'", "'or'"
     };
     public static final int T__144=144;
     public static final int T__143=143;
@@ -90,6 +90,8 @@
     public static final int T__127=127;
     public static final int T__166=166;
     public static final int T__165=165;
+    public static final int T__168=168;
+    public static final int T__167=167;
     public static final int T__162=162;
     public static final int T__161=161;
     public static final int T__164=164;
@@ -148,6 +150,16 @@
     public static final int T__96=96;
     public static final int T__97=97;
     public static final int T__98=98;
+    public static final int T__177=177;
+    public static final int T__176=176;
+    public static final int T__179=179;
+    public static final int T__178=178;
+    public static final int T__173=173;
+    public static final int T__172=172;
+    public static final int T__175=175;
+    public static final int T__174=174;
+    public static final int T__171=171;
+    public static final int T__170=170;
     public static final int RULE_DECIMAL=8;
     public static final int T__26=26;
     public static final int T__27=27;
@@ -157,6 +169,7 @@
     public static final int T__23=23;
     public static final int T__24=24;
     public static final int T__25=25;
+    public static final int T__169=169;
     public static final int T__20=20;
     public static final int T__21=21;
     public static final int T__122=122;
@@ -310,7 +323,7 @@
             int alt1=2;
             int LA1_0 = input.LA(1);
 
-            if ( (LA1_0==75) ) {
+            if ( (LA1_0==88) ) {
                 alt1=1;
             }
             switch (alt1) {
@@ -1379,7 +1392,7 @@
                 int alt12=2;
                 int LA12_0 = input.LA(1);
 
-                if ( (LA12_0==37) ) {
+                if ( (LA12_0==38) ) {
                     alt12=1;
                 }
 
@@ -1497,7 +1510,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeFile"
-    // InternalDataDSL.g:543:1: ruleDataInterchangeFile returns [EObject current=null] : (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI ) ;
+    // InternalDataDSL.g:543:1: ruleDataInterchangeFile returns [EObject current=null] : (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI | this_DataInterchangeFileFixed_3= ruleDataInterchangeFileFixed ) ;
     public final EObject ruleDataInterchangeFile() throws RecognitionException {
         EObject current = null;
 
@@ -1507,16 +1520,18 @@
 
         EObject this_DataInterchangeFileEDI_2 = null;
 
+        EObject this_DataInterchangeFileFixed_3 = null;
+
 
 
         	enterRule();
 
         try {
-            // InternalDataDSL.g:549:2: ( (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI ) )
-            // InternalDataDSL.g:550:2: (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI )
+            // InternalDataDSL.g:549:2: ( (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI | this_DataInterchangeFileFixed_3= ruleDataInterchangeFileFixed ) )
+            // InternalDataDSL.g:550:2: (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI | this_DataInterchangeFileFixed_3= ruleDataInterchangeFileFixed )
             {
-            // InternalDataDSL.g:550:2: (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI )
-            int alt13=3;
+            // InternalDataDSL.g:550:2: (this_DataInterchangeFileXML_0= ruleDataInterchangeFileXML | this_DataInterchangeFileCSV_1= ruleDataInterchangeFileCSV | this_DataInterchangeFileEDI_2= ruleDataInterchangeFileEDI | this_DataInterchangeFileFixed_3= ruleDataInterchangeFileFixed )
+            int alt13=4;
             switch ( input.LA(1) ) {
             case 25:
                 {
@@ -1533,6 +1548,11 @@
                 alt13=3;
                 }
                 break;
+            case 37:
+                {
+                alt13=4;
+                }
+                break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
@@ -1608,6 +1628,28 @@
 
                     }
                     break;
+                case 4 :
+                    // InternalDataDSL.g:578:3: this_DataInterchangeFileFixed_3= ruleDataInterchangeFileFixed
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataInterchangeFileAccess().getDataInterchangeFileFixedParserRuleCall_3());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_DataInterchangeFileFixed_3=ruleDataInterchangeFileFixed();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DataInterchangeFileFixed_3;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
 
             }
 
@@ -1633,7 +1675,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeFileXML"
-    // InternalDataDSL.g:581:1: entryRuleDataInterchangeFileXML returns [EObject current=null] : iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF ;
+    // InternalDataDSL.g:590:1: entryRuleDataInterchangeFileXML returns [EObject current=null] : iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF ;
     public final EObject entryRuleDataInterchangeFileXML() throws RecognitionException {
         EObject current = null;
 
@@ -1641,8 +1683,8 @@
 
 
         try {
-            // InternalDataDSL.g:581:63: (iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF )
-            // InternalDataDSL.g:582:2: iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF
+            // InternalDataDSL.g:590:63: (iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF )
+            // InternalDataDSL.g:591:2: iv_ruleDataInterchangeFileXML= ruleDataInterchangeFileXML EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeFileXMLRule()); 
@@ -1673,7 +1715,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeFileXML"
-    // InternalDataDSL.g:588:1: ruleDataInterchangeFileXML returns [EObject current=null] : ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) ;
+    // InternalDataDSL.g:597:1: ruleDataInterchangeFileXML returns [EObject current=null] : ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) ;
     public final EObject ruleDataInterchangeFileXML() throws RecognitionException {
         EObject current = null;
 
@@ -1689,14 +1731,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:594:2: ( ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) )
-            // InternalDataDSL.g:595:2: ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:603:2: ( ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalDataDSL.g:604:2: ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
             {
-            // InternalDataDSL.g:595:2: ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
-            // InternalDataDSL.g:596:3: () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:604:2: ( () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:605:3: () otherlv_1= 'XML' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
             {
-            // InternalDataDSL.g:596:3: ()
-            // InternalDataDSL.g:597:4: 
+            // InternalDataDSL.g:605:3: ()
+            // InternalDataDSL.g:606:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -1714,11 +1756,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFileXMLAccess().getXMLKeyword_1());
               		
             }
-            // InternalDataDSL.g:607:3: ( (lv_fileURL_2_0= RULE_STRING ) )
-            // InternalDataDSL.g:608:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:616:3: ( (lv_fileURL_2_0= RULE_STRING ) )
+            // InternalDataDSL.g:617:4: (lv_fileURL_2_0= RULE_STRING )
             {
-            // InternalDataDSL.g:608:4: (lv_fileURL_2_0= RULE_STRING )
-            // InternalDataDSL.g:609:5: lv_fileURL_2_0= RULE_STRING
+            // InternalDataDSL.g:617:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:618:5: lv_fileURL_2_0= RULE_STRING
             {
             lv_fileURL_2_0=(Token)match(input,RULE_STRING,FOLLOW_20); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -1744,17 +1786,17 @@
 
             }
 
-            // InternalDataDSL.g:625:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
-            // InternalDataDSL.g:626:4: ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:634:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:635:4: ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) )
             {
-            // InternalDataDSL.g:626:4: ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) )
-            // InternalDataDSL.g:627:5: ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:635:4: ( ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:636:5: ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3());
-            // InternalDataDSL.g:630:5: ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* )
-            // InternalDataDSL.g:631:6: ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:639:5: ( ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:640:6: ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )*
             {
-            // InternalDataDSL.g:631:6: ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:640:6: ( ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) ) )*
             loop14:
             do {
                 int alt14=4;
@@ -1773,31 +1815,31 @@
 
                 switch (alt14) {
             	case 1 :
-            	    // InternalDataDSL.g:632:4: ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) )
+            	    // InternalDataDSL.g:641:4: ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:632:4: ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) )
-            	    // InternalDataDSL.g:633:5: {...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) )
+            	    // InternalDataDSL.g:641:4: ({...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) ) )
+            	    // InternalDataDSL.g:642:5: {...}? => ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalDataDSL.g:633:119: ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) )
-            	    // InternalDataDSL.g:634:6: ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) )
+            	    // InternalDataDSL.g:642:119: ( ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) ) )
+            	    // InternalDataDSL.g:643:6: ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 0);
-            	    // InternalDataDSL.g:637:9: ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) )
-            	    // InternalDataDSL.g:637:10: {...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) )
+            	    // InternalDataDSL.g:646:9: ({...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) ) )
+            	    // InternalDataDSL.g:646:10: {...}? => ( (lv_byAttribute_4_0= 'mapByAttribute' ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "true");
             	    }
-            	    // InternalDataDSL.g:637:19: ( (lv_byAttribute_4_0= 'mapByAttribute' ) )
-            	    // InternalDataDSL.g:637:20: (lv_byAttribute_4_0= 'mapByAttribute' )
+            	    // InternalDataDSL.g:646:19: ( (lv_byAttribute_4_0= 'mapByAttribute' ) )
+            	    // InternalDataDSL.g:646:20: (lv_byAttribute_4_0= 'mapByAttribute' )
             	    {
-            	    // InternalDataDSL.g:637:20: (lv_byAttribute_4_0= 'mapByAttribute' )
-            	    // InternalDataDSL.g:638:10: lv_byAttribute_4_0= 'mapByAttribute'
+            	    // InternalDataDSL.g:646:20: (lv_byAttribute_4_0= 'mapByAttribute' )
+            	    // InternalDataDSL.g:647:10: lv_byAttribute_4_0= 'mapByAttribute'
             	    {
             	    lv_byAttribute_4_0=(Token)match(input,26,FOLLOW_20); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1833,28 +1875,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:655:4: ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:664:4: ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:655:4: ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:656:5: {...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:664:4: ({...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:665:5: {...}? => ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalDataDSL.g:656:119: ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:657:6: ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:665:119: ( ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:666:6: ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 1);
-            	    // InternalDataDSL.g:660:9: ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:660:10: {...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:669:9: ({...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:669:10: {...}? => (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "true");
             	    }
-            	    // InternalDataDSL.g:660:19: (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:660:20: otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:669:19: (otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:669:20: otherlv_5= 'encoding' ( (lv_encoding_6_0= RULE_STRING ) )
             	    {
             	    otherlv_5=(Token)match(input,27,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1862,11 +1904,11 @@
             	      									newLeafNode(otherlv_5, grammarAccess.getDataInterchangeFileXMLAccess().getEncodingKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:664:9: ( (lv_encoding_6_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:665:10: (lv_encoding_6_0= RULE_STRING )
+            	    // InternalDataDSL.g:673:9: ( (lv_encoding_6_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:674:10: (lv_encoding_6_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:665:10: (lv_encoding_6_0= RULE_STRING )
-            	    // InternalDataDSL.g:666:11: lv_encoding_6_0= RULE_STRING
+            	    // InternalDataDSL.g:674:10: (lv_encoding_6_0= RULE_STRING )
+            	    // InternalDataDSL.g:675:11: lv_encoding_6_0= RULE_STRING
             	    {
             	    lv_encoding_6_0=(Token)match(input,RULE_STRING,FOLLOW_20); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1909,28 +1951,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalDataDSL.g:688:4: ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:697:4: ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:688:4: ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:689:5: {...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:697:4: ({...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:698:5: {...}? => ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // InternalDataDSL.g:689:119: ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:690:6: ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:698:119: ( ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:699:6: ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileXMLAccess().getUnorderedGroup_3(), 2);
-            	    // InternalDataDSL.g:693:9: ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:693:10: {...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:702:9: ({...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:702:10: {...}? => (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileXML", "true");
             	    }
-            	    // InternalDataDSL.g:693:19: (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:693:20: otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:702:19: (otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:702:20: otherlv_7= 'locale' ( (lv_locale_8_0= RULE_STRING ) )
             	    {
             	    otherlv_7=(Token)match(input,28,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -1938,11 +1980,11 @@
             	      									newLeafNode(otherlv_7, grammarAccess.getDataInterchangeFileXMLAccess().getLocaleKeyword_3_2_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:697:9: ( (lv_locale_8_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:698:10: (lv_locale_8_0= RULE_STRING )
+            	    // InternalDataDSL.g:706:9: ( (lv_locale_8_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:707:10: (lv_locale_8_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:698:10: (lv_locale_8_0= RULE_STRING )
-            	    // InternalDataDSL.g:699:11: lv_locale_8_0= RULE_STRING
+            	    // InternalDataDSL.g:707:10: (lv_locale_8_0= RULE_STRING )
+            	    // InternalDataDSL.g:708:11: lv_locale_8_0= RULE_STRING
             	    {
             	    lv_locale_8_0=(Token)match(input,RULE_STRING,FOLLOW_20); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2025,7 +2067,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeFileCSV"
-    // InternalDataDSL.g:732:1: entryRuleDataInterchangeFileCSV returns [EObject current=null] : iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF ;
+    // InternalDataDSL.g:741:1: entryRuleDataInterchangeFileCSV returns [EObject current=null] : iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF ;
     public final EObject entryRuleDataInterchangeFileCSV() throws RecognitionException {
         EObject current = null;
 
@@ -2033,8 +2075,8 @@
 
 
         try {
-            // InternalDataDSL.g:732:63: (iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF )
-            // InternalDataDSL.g:733:2: iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF
+            // InternalDataDSL.g:741:63: (iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF )
+            // InternalDataDSL.g:742:2: iv_ruleDataInterchangeFileCSV= ruleDataInterchangeFileCSV EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeFileCSVRule()); 
@@ -2065,7 +2107,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeFileCSV"
-    // InternalDataDSL.g:739:1: ruleDataInterchangeFileCSV returns [EObject current=null] : ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) ;
+    // InternalDataDSL.g:748:1: ruleDataInterchangeFileCSV returns [EObject current=null] : ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) ;
     public final EObject ruleDataInterchangeFileCSV() throws RecognitionException {
         EObject current = null;
 
@@ -2087,14 +2129,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:745:2: ( ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) )
-            // InternalDataDSL.g:746:2: ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:754:2: ( ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalDataDSL.g:755:2: ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
             {
-            // InternalDataDSL.g:746:2: ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
-            // InternalDataDSL.g:747:3: () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:755:2: ( () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:756:3: () otherlv_1= 'CSV' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
             {
-            // InternalDataDSL.g:747:3: ()
-            // InternalDataDSL.g:748:4: 
+            // InternalDataDSL.g:756:3: ()
+            // InternalDataDSL.g:757:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -2112,11 +2154,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFileCSVAccess().getCSVKeyword_1());
               		
             }
-            // InternalDataDSL.g:758:3: ( (lv_fileURL_2_0= RULE_STRING ) )
-            // InternalDataDSL.g:759:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:767:3: ( (lv_fileURL_2_0= RULE_STRING ) )
+            // InternalDataDSL.g:768:4: (lv_fileURL_2_0= RULE_STRING )
             {
-            // InternalDataDSL.g:759:4: (lv_fileURL_2_0= RULE_STRING )
-            // InternalDataDSL.g:760:5: lv_fileURL_2_0= RULE_STRING
+            // InternalDataDSL.g:768:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:769:5: lv_fileURL_2_0= RULE_STRING
             {
             lv_fileURL_2_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -2142,17 +2184,17 @@
 
             }
 
-            // InternalDataDSL.g:776:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
-            // InternalDataDSL.g:777:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:785:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:786:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) )
             {
-            // InternalDataDSL.g:777:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) )
-            // InternalDataDSL.g:778:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:786:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:787:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3());
-            // InternalDataDSL.g:781:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* )
-            // InternalDataDSL.g:782:6: ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:790:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:791:6: ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )*
             {
-            // InternalDataDSL.g:782:6: ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:791:6: ( ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) ) )*
             loop15:
             do {
                 int alt15=7;
@@ -2180,28 +2222,28 @@
 
                 switch (alt15) {
             	case 1 :
-            	    // InternalDataDSL.g:783:4: ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:792:4: ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:783:4: ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:784:5: {...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:792:4: ({...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:793:5: {...}? => ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalDataDSL.g:784:119: ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:785:6: ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:793:119: ( ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:794:6: ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 0);
-            	    // InternalDataDSL.g:788:9: ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:788:10: {...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:797:9: ({...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:797:10: {...}? => (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:788:19: (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:788:20: otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:797:19: (otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:797:20: otherlv_4= 'delimiter' ( (lv_delimiter_5_0= RULE_STRING ) )
             	    {
             	    otherlv_4=(Token)match(input,30,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2209,11 +2251,11 @@
             	      									newLeafNode(otherlv_4, grammarAccess.getDataInterchangeFileCSVAccess().getDelimiterKeyword_3_0_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:792:9: ( (lv_delimiter_5_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:793:10: (lv_delimiter_5_0= RULE_STRING )
+            	    // InternalDataDSL.g:801:9: ( (lv_delimiter_5_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:802:10: (lv_delimiter_5_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:793:10: (lv_delimiter_5_0= RULE_STRING )
-            	    // InternalDataDSL.g:794:11: lv_delimiter_5_0= RULE_STRING
+            	    // InternalDataDSL.g:802:10: (lv_delimiter_5_0= RULE_STRING )
+            	    // InternalDataDSL.g:803:11: lv_delimiter_5_0= RULE_STRING
             	    {
             	    lv_delimiter_5_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2256,28 +2298,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:816:4: ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:825:4: ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:816:4: ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:817:5: {...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:825:4: ({...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:826:5: {...}? => ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalDataDSL.g:817:119: ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:818:6: ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:826:119: ( ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:827:6: ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 1);
-            	    // InternalDataDSL.g:821:9: ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:821:10: {...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:830:9: ({...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:830:10: {...}? => (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:821:19: (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:821:20: otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:830:19: (otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:830:20: otherlv_6= 'quoteCharacter' ( (lv_quoteCharacter_7_0= RULE_STRING ) )
             	    {
             	    otherlv_6=(Token)match(input,31,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2285,11 +2327,11 @@
             	      									newLeafNode(otherlv_6, grammarAccess.getDataInterchangeFileCSVAccess().getQuoteCharacterKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:825:9: ( (lv_quoteCharacter_7_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:826:10: (lv_quoteCharacter_7_0= RULE_STRING )
+            	    // InternalDataDSL.g:834:9: ( (lv_quoteCharacter_7_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:835:10: (lv_quoteCharacter_7_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:826:10: (lv_quoteCharacter_7_0= RULE_STRING )
-            	    // InternalDataDSL.g:827:11: lv_quoteCharacter_7_0= RULE_STRING
+            	    // InternalDataDSL.g:835:10: (lv_quoteCharacter_7_0= RULE_STRING )
+            	    // InternalDataDSL.g:836:11: lv_quoteCharacter_7_0= RULE_STRING
             	    {
             	    lv_quoteCharacter_7_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2332,28 +2374,28 @@
             	    }
             	    break;
             	case 3 :
-            	    // InternalDataDSL.g:849:4: ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) )
+            	    // InternalDataDSL.g:858:4: ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:849:4: ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) )
-            	    // InternalDataDSL.g:850:5: {...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) )
+            	    // InternalDataDSL.g:858:4: ({...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) ) )
+            	    // InternalDataDSL.g:859:5: {...}? => ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2)");
             	    }
-            	    // InternalDataDSL.g:850:119: ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) )
-            	    // InternalDataDSL.g:851:6: ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) )
+            	    // InternalDataDSL.g:859:119: ( ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) ) )
+            	    // InternalDataDSL.g:860:6: ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 2);
-            	    // InternalDataDSL.g:854:9: ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) )
-            	    // InternalDataDSL.g:854:10: {...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) )
+            	    // InternalDataDSL.g:863:9: ({...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) ) )
+            	    // InternalDataDSL.g:863:10: {...}? => (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:854:19: (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) )
-            	    // InternalDataDSL.g:854:20: otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) )
+            	    // InternalDataDSL.g:863:19: (otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) ) )
+            	    // InternalDataDSL.g:863:20: otherlv_8= 'skipLines' ( (lv_skipLines_9_0= RULE_INT ) )
             	    {
             	    otherlv_8=(Token)match(input,32,FOLLOW_13); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2361,11 +2403,11 @@
             	      									newLeafNode(otherlv_8, grammarAccess.getDataInterchangeFileCSVAccess().getSkipLinesKeyword_3_2_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:858:9: ( (lv_skipLines_9_0= RULE_INT ) )
-            	    // InternalDataDSL.g:859:10: (lv_skipLines_9_0= RULE_INT )
+            	    // InternalDataDSL.g:867:9: ( (lv_skipLines_9_0= RULE_INT ) )
+            	    // InternalDataDSL.g:868:10: (lv_skipLines_9_0= RULE_INT )
             	    {
-            	    // InternalDataDSL.g:859:10: (lv_skipLines_9_0= RULE_INT )
-            	    // InternalDataDSL.g:860:11: lv_skipLines_9_0= RULE_INT
+            	    // InternalDataDSL.g:868:10: (lv_skipLines_9_0= RULE_INT )
+            	    // InternalDataDSL.g:869:11: lv_skipLines_9_0= RULE_INT
             	    {
             	    lv_skipLines_9_0=(Token)match(input,RULE_INT,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2408,31 +2450,31 @@
             	    }
             	    break;
             	case 4 :
-            	    // InternalDataDSL.g:882:4: ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) )
+            	    // InternalDataDSL.g:891:4: ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:882:4: ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) )
-            	    // InternalDataDSL.g:883:5: {...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) )
+            	    // InternalDataDSL.g:891:4: ({...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) ) )
+            	    // InternalDataDSL.g:892:5: {...}? => ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3)");
             	    }
-            	    // InternalDataDSL.g:883:119: ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) )
-            	    // InternalDataDSL.g:884:6: ({...}? => ( (lv_indent_10_0= 'indent' ) ) )
+            	    // InternalDataDSL.g:892:119: ( ({...}? => ( (lv_indent_10_0= 'indent' ) ) ) )
+            	    // InternalDataDSL.g:893:6: ({...}? => ( (lv_indent_10_0= 'indent' ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 3);
-            	    // InternalDataDSL.g:887:9: ({...}? => ( (lv_indent_10_0= 'indent' ) ) )
-            	    // InternalDataDSL.g:887:10: {...}? => ( (lv_indent_10_0= 'indent' ) )
+            	    // InternalDataDSL.g:896:9: ({...}? => ( (lv_indent_10_0= 'indent' ) ) )
+            	    // InternalDataDSL.g:896:10: {...}? => ( (lv_indent_10_0= 'indent' ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:887:19: ( (lv_indent_10_0= 'indent' ) )
-            	    // InternalDataDSL.g:887:20: (lv_indent_10_0= 'indent' )
+            	    // InternalDataDSL.g:896:19: ( (lv_indent_10_0= 'indent' ) )
+            	    // InternalDataDSL.g:896:20: (lv_indent_10_0= 'indent' )
             	    {
-            	    // InternalDataDSL.g:887:20: (lv_indent_10_0= 'indent' )
-            	    // InternalDataDSL.g:888:10: lv_indent_10_0= 'indent'
+            	    // InternalDataDSL.g:896:20: (lv_indent_10_0= 'indent' )
+            	    // InternalDataDSL.g:897:10: lv_indent_10_0= 'indent'
             	    {
             	    lv_indent_10_0=(Token)match(input,33,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2468,28 +2510,28 @@
             	    }
             	    break;
             	case 5 :
-            	    // InternalDataDSL.g:905:4: ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:914:4: ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:905:4: ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:906:5: {...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:914:4: ({...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:915:5: {...}? => ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4)");
             	    }
-            	    // InternalDataDSL.g:906:119: ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:907:6: ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:915:119: ( ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:916:6: ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 4);
-            	    // InternalDataDSL.g:910:9: ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:910:10: {...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:919:9: ({...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:919:10: {...}? => (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:910:19: (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:910:20: otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:919:19: (otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:919:20: otherlv_11= 'encoding' ( (lv_encoding_12_0= RULE_STRING ) )
             	    {
             	    otherlv_11=(Token)match(input,27,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2497,11 +2539,11 @@
             	      									newLeafNode(otherlv_11, grammarAccess.getDataInterchangeFileCSVAccess().getEncodingKeyword_3_4_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:914:9: ( (lv_encoding_12_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:915:10: (lv_encoding_12_0= RULE_STRING )
+            	    // InternalDataDSL.g:923:9: ( (lv_encoding_12_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:924:10: (lv_encoding_12_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:915:10: (lv_encoding_12_0= RULE_STRING )
-            	    // InternalDataDSL.g:916:11: lv_encoding_12_0= RULE_STRING
+            	    // InternalDataDSL.g:924:10: (lv_encoding_12_0= RULE_STRING )
+            	    // InternalDataDSL.g:925:11: lv_encoding_12_0= RULE_STRING
             	    {
             	    lv_encoding_12_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2544,28 +2586,28 @@
             	    }
             	    break;
             	case 6 :
-            	    // InternalDataDSL.g:938:4: ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:947:4: ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:938:4: ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:939:5: {...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:947:4: ({...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:948:5: {...}? => ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5)");
             	    }
-            	    // InternalDataDSL.g:939:119: ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:940:6: ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:948:119: ( ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:949:6: ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileCSVAccess().getUnorderedGroup_3(), 5);
-            	    // InternalDataDSL.g:943:9: ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:943:10: {...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:952:9: ({...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:952:10: {...}? => (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileCSV", "true");
             	    }
-            	    // InternalDataDSL.g:943:19: (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:943:20: otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:952:19: (otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:952:20: otherlv_13= 'locale' ( (lv_locale_14_0= RULE_STRING ) )
             	    {
             	    otherlv_13=(Token)match(input,28,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2573,11 +2615,11 @@
             	      									newLeafNode(otherlv_13, grammarAccess.getDataInterchangeFileCSVAccess().getLocaleKeyword_3_5_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:947:9: ( (lv_locale_14_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:948:10: (lv_locale_14_0= RULE_STRING )
+            	    // InternalDataDSL.g:956:9: ( (lv_locale_14_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:957:10: (lv_locale_14_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:948:10: (lv_locale_14_0= RULE_STRING )
-            	    // InternalDataDSL.g:949:11: lv_locale_14_0= RULE_STRING
+            	    // InternalDataDSL.g:957:10: (lv_locale_14_0= RULE_STRING )
+            	    // InternalDataDSL.g:958:11: lv_locale_14_0= RULE_STRING
             	    {
             	    lv_locale_14_0=(Token)match(input,RULE_STRING,FOLLOW_21); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2660,7 +2702,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeFileEDI"
-    // InternalDataDSL.g:982:1: entryRuleDataInterchangeFileEDI returns [EObject current=null] : iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF ;
+    // InternalDataDSL.g:991:1: entryRuleDataInterchangeFileEDI returns [EObject current=null] : iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF ;
     public final EObject entryRuleDataInterchangeFileEDI() throws RecognitionException {
         EObject current = null;
 
@@ -2668,8 +2710,8 @@
 
 
         try {
-            // InternalDataDSL.g:982:63: (iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF )
-            // InternalDataDSL.g:983:2: iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF
+            // InternalDataDSL.g:991:63: (iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF )
+            // InternalDataDSL.g:992:2: iv_ruleDataInterchangeFileEDI= ruleDataInterchangeFileEDI EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeFileEDIRule()); 
@@ -2700,7 +2742,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeFileEDI"
-    // InternalDataDSL.g:989:1: ruleDataInterchangeFileEDI returns [EObject current=null] : ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? ) ;
+    // InternalDataDSL.g:998:1: ruleDataInterchangeFileEDI returns [EObject current=null] : ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? ) ;
     public final EObject ruleDataInterchangeFileEDI() throws RecognitionException {
         EObject current = null;
 
@@ -2718,14 +2760,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:995:2: ( ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? ) )
-            // InternalDataDSL.g:996:2: ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? )
+            // InternalDataDSL.g:1004:2: ( ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? ) )
+            // InternalDataDSL.g:1005:2: ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? )
             {
-            // InternalDataDSL.g:996:2: ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? )
-            // InternalDataDSL.g:997:3: () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )?
+            // InternalDataDSL.g:1005:2: ( () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )? )
+            // InternalDataDSL.g:1006:3: () otherlv_1= 'EDI' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) otherlv_8= 'mappingModel' ( (lv_mappingModel_9_0= RULE_STRING ) ) ( (lv_validate_10_0= 'validate' ) )?
             {
-            // InternalDataDSL.g:997:3: ()
-            // InternalDataDSL.g:998:4: 
+            // InternalDataDSL.g:1006:3: ()
+            // InternalDataDSL.g:1007:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -2743,11 +2785,11 @@
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFileEDIAccess().getEDIKeyword_1());
               		
             }
-            // InternalDataDSL.g:1008:3: ( (lv_fileURL_2_0= RULE_STRING ) )
-            // InternalDataDSL.g:1009:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:1017:3: ( (lv_fileURL_2_0= RULE_STRING ) )
+            // InternalDataDSL.g:1018:4: (lv_fileURL_2_0= RULE_STRING )
             {
-            // InternalDataDSL.g:1009:4: (lv_fileURL_2_0= RULE_STRING )
-            // InternalDataDSL.g:1010:5: lv_fileURL_2_0= RULE_STRING
+            // InternalDataDSL.g:1018:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:1019:5: lv_fileURL_2_0= RULE_STRING
             {
             lv_fileURL_2_0=(Token)match(input,RULE_STRING,FOLLOW_22); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -2773,17 +2815,17 @@
 
             }
 
-            // InternalDataDSL.g:1026:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
-            // InternalDataDSL.g:1027:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:1035:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:1036:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
             {
-            // InternalDataDSL.g:1027:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
-            // InternalDataDSL.g:1028:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:1036:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:1037:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
             {
             getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3());
-            // InternalDataDSL.g:1031:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
-            // InternalDataDSL.g:1032:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:1040:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:1041:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
             {
-            // InternalDataDSL.g:1032:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
+            // InternalDataDSL.g:1041:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
             loop16:
             do {
                 int alt16=3;
@@ -2799,28 +2841,28 @@
 
                 switch (alt16) {
             	case 1 :
-            	    // InternalDataDSL.g:1033:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1042:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:1033:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:1034:5: {...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1042:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1043:5: {...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileEDI", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0)");
             	    }
-            	    // InternalDataDSL.g:1034:119: ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:1035:6: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1043:119: ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1044:6: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 0);
-            	    // InternalDataDSL.g:1038:9: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:1038:10: {...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1047:9: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1047:10: {...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileEDI", "true");
             	    }
-            	    // InternalDataDSL.g:1038:19: (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:1038:20: otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1047:19: (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1047:20: otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) )
             	    {
             	    otherlv_4=(Token)match(input,27,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2828,11 +2870,11 @@
             	      									newLeafNode(otherlv_4, grammarAccess.getDataInterchangeFileEDIAccess().getEncodingKeyword_3_0_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:1042:9: ( (lv_encoding_5_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:1043:10: (lv_encoding_5_0= RULE_STRING )
+            	    // InternalDataDSL.g:1051:9: ( (lv_encoding_5_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1052:10: (lv_encoding_5_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:1043:10: (lv_encoding_5_0= RULE_STRING )
-            	    // InternalDataDSL.g:1044:11: lv_encoding_5_0= RULE_STRING
+            	    // InternalDataDSL.g:1052:10: (lv_encoding_5_0= RULE_STRING )
+            	    // InternalDataDSL.g:1053:11: lv_encoding_5_0= RULE_STRING
             	    {
             	    lv_encoding_5_0=(Token)match(input,RULE_STRING,FOLLOW_22); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2875,28 +2917,28 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:1066:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1075:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:1066:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
-            	    // InternalDataDSL.g:1067:5: {...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1075:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1076:5: {...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
             	    {
             	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileEDI", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1)");
             	    }
-            	    // InternalDataDSL.g:1067:119: ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
-            	    // InternalDataDSL.g:1068:6: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1076:119: ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1077:6: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
             	    {
             	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileEDIAccess().getUnorderedGroup_3(), 1);
-            	    // InternalDataDSL.g:1071:9: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
-            	    // InternalDataDSL.g:1071:10: {...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1080:9: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1080:10: {...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeFileEDI", "true");
             	    }
-            	    // InternalDataDSL.g:1071:19: (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
-            	    // InternalDataDSL.g:1071:20: otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1080:19: (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1080:20: otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) )
             	    {
             	    otherlv_6=(Token)match(input,28,FOLLOW_9); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2904,11 +2946,11 @@
             	      									newLeafNode(otherlv_6, grammarAccess.getDataInterchangeFileEDIAccess().getLocaleKeyword_3_1_0());
             	      								
             	    }
-            	    // InternalDataDSL.g:1075:9: ( (lv_locale_7_0= RULE_STRING ) )
-            	    // InternalDataDSL.g:1076:10: (lv_locale_7_0= RULE_STRING )
+            	    // InternalDataDSL.g:1084:9: ( (lv_locale_7_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1085:10: (lv_locale_7_0= RULE_STRING )
             	    {
-            	    // InternalDataDSL.g:1076:10: (lv_locale_7_0= RULE_STRING )
-            	    // InternalDataDSL.g:1077:11: lv_locale_7_0= RULE_STRING
+            	    // InternalDataDSL.g:1085:10: (lv_locale_7_0= RULE_STRING )
+            	    // InternalDataDSL.g:1086:11: lv_locale_7_0= RULE_STRING
             	    {
             	    lv_locale_7_0=(Token)match(input,RULE_STRING,FOLLOW_22); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
@@ -2972,11 +3014,11 @@
               			newLeafNode(otherlv_8, grammarAccess.getDataInterchangeFileEDIAccess().getMappingModelKeyword_4());
               		
             }
-            // InternalDataDSL.g:1110:3: ( (lv_mappingModel_9_0= RULE_STRING ) )
-            // InternalDataDSL.g:1111:4: (lv_mappingModel_9_0= RULE_STRING )
+            // InternalDataDSL.g:1119:3: ( (lv_mappingModel_9_0= RULE_STRING ) )
+            // InternalDataDSL.g:1120:4: (lv_mappingModel_9_0= RULE_STRING )
             {
-            // InternalDataDSL.g:1111:4: (lv_mappingModel_9_0= RULE_STRING )
-            // InternalDataDSL.g:1112:5: lv_mappingModel_9_0= RULE_STRING
+            // InternalDataDSL.g:1120:4: (lv_mappingModel_9_0= RULE_STRING )
+            // InternalDataDSL.g:1121:5: lv_mappingModel_9_0= RULE_STRING
             {
             lv_mappingModel_9_0=(Token)match(input,RULE_STRING,FOLLOW_23); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -3002,7 +3044,7 @@
 
             }
 
-            // InternalDataDSL.g:1128:3: ( (lv_validate_10_0= 'validate' ) )?
+            // InternalDataDSL.g:1137:3: ( (lv_validate_10_0= 'validate' ) )?
             int alt17=2;
             int LA17_0 = input.LA(1);
 
@@ -3011,10 +3053,10 @@
             }
             switch (alt17) {
                 case 1 :
-                    // InternalDataDSL.g:1129:4: (lv_validate_10_0= 'validate' )
+                    // InternalDataDSL.g:1138:4: (lv_validate_10_0= 'validate' )
                     {
-                    // InternalDataDSL.g:1129:4: (lv_validate_10_0= 'validate' )
-                    // InternalDataDSL.g:1130:5: lv_validate_10_0= 'validate'
+                    // InternalDataDSL.g:1138:4: (lv_validate_10_0= 'validate' )
+                    // InternalDataDSL.g:1139:5: lv_validate_10_0= 'validate'
                     {
                     lv_validate_10_0=(Token)match(input,36,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -3063,8 +3105,336 @@
     // $ANTLR end "ruleDataInterchangeFileEDI"
 
 
+    // $ANTLR start "entryRuleDataInterchangeFileFixed"
+    // InternalDataDSL.g:1155:1: entryRuleDataInterchangeFileFixed returns [EObject current=null] : iv_ruleDataInterchangeFileFixed= ruleDataInterchangeFileFixed EOF ;
+    public final EObject entryRuleDataInterchangeFileFixed() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeFileFixed = null;
+
+
+        try {
+            // InternalDataDSL.g:1155:65: (iv_ruleDataInterchangeFileFixed= ruleDataInterchangeFileFixed EOF )
+            // InternalDataDSL.g:1156:2: iv_ruleDataInterchangeFileFixed= ruleDataInterchangeFileFixed EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeFileFixedRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeFileFixed=ruleDataInterchangeFileFixed();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeFileFixed; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeFileFixed"
+
+
+    // $ANTLR start "ruleDataInterchangeFileFixed"
+    // InternalDataDSL.g:1162:1: ruleDataInterchangeFileFixed returns [EObject current=null] : ( () otherlv_1= 'Fixed' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) ;
+    public final EObject ruleDataInterchangeFileFixed() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token lv_fileURL_2_0=null;
+        Token otherlv_4=null;
+        Token lv_encoding_5_0=null;
+        Token otherlv_6=null;
+        Token lv_locale_7_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:1168:2: ( ( () otherlv_1= 'Fixed' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalDataDSL.g:1169:2: ( () otherlv_1= 'Fixed' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            {
+            // InternalDataDSL.g:1169:2: ( () otherlv_1= 'Fixed' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:1170:3: () otherlv_1= 'Fixed' ( (lv_fileURL_2_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            {
+            // InternalDataDSL.g:1170:3: ()
+            // InternalDataDSL.g:1171:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDataInterchangeFileFixedAccess().getDataInterchangeFileFixedAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,37,FOLLOW_9); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFileFixedAccess().getFixedKeyword_1());
+              		
+            }
+            // InternalDataDSL.g:1181:3: ( (lv_fileURL_2_0= RULE_STRING ) )
+            // InternalDataDSL.g:1182:4: (lv_fileURL_2_0= RULE_STRING )
+            {
+            // InternalDataDSL.g:1182:4: (lv_fileURL_2_0= RULE_STRING )
+            // InternalDataDSL.g:1183:5: lv_fileURL_2_0= RULE_STRING
+            {
+            lv_fileURL_2_0=(Token)match(input,RULE_STRING,FOLLOW_24); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_fileURL_2_0, grammarAccess.getDataInterchangeFileFixedAccess().getFileURLSTRINGTerminalRuleCall_2_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"fileURL",
+              						lv_fileURL_2_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalDataDSL.g:1199:3: ( ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:1200:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            {
+            // InternalDataDSL.g:1200:4: ( ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:1201:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+            // InternalDataDSL.g:1204:5: ( ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:1205:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
+            {
+            // InternalDataDSL.g:1205:6: ( ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) ) | ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) ) )*
+            loop18:
+            do {
+                int alt18=3;
+                int LA18_0 = input.LA(1);
+
+                if ( LA18_0 == 27 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+                    alt18=1;
+                }
+                else if ( LA18_0 == 28 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
+                    alt18=2;
+                }
+
+
+                switch (alt18) {
+            	case 1 :
+            	    // InternalDataDSL.g:1206:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
+            	    {
+            	    // InternalDataDSL.g:1206:4: ({...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1207:5: {...}? => ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFileFixed", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0)");
+            	    }
+            	    // InternalDataDSL.g:1207:121: ( ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1208:6: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 0);
+            	    // InternalDataDSL.g:1211:9: ({...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1211:10: {...}? => (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFileFixed", "true");
+            	    }
+            	    // InternalDataDSL.g:1211:19: (otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1211:20: otherlv_4= 'encoding' ( (lv_encoding_5_0= RULE_STRING ) )
+            	    {
+            	    otherlv_4=(Token)match(input,27,FOLLOW_9); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_4, grammarAccess.getDataInterchangeFileFixedAccess().getEncodingKeyword_3_0_0());
+            	      								
+            	    }
+            	    // InternalDataDSL.g:1215:9: ( (lv_encoding_5_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1216:10: (lv_encoding_5_0= RULE_STRING )
+            	    {
+            	    // InternalDataDSL.g:1216:10: (lv_encoding_5_0= RULE_STRING )
+            	    // InternalDataDSL.g:1217:11: lv_encoding_5_0= RULE_STRING
+            	    {
+            	    lv_encoding_5_0=(Token)match(input,RULE_STRING,FOLLOW_24); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											newLeafNode(lv_encoding_5_0, grammarAccess.getDataInterchangeFileFixedAccess().getEncodingSTRINGTerminalRuleCall_3_0_1_0());
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+            	      											}
+            	      											setWithLastConsumed(
+            	      												current,
+            	      												"encoding",
+            	      												lv_encoding_5_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalDataDSL.g:1239:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
+            	    {
+            	    // InternalDataDSL.g:1239:4: ({...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) ) )
+            	    // InternalDataDSL.g:1240:5: {...}? => ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFileFixed", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1)");
+            	    }
+            	    // InternalDataDSL.g:1240:121: ( ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) ) )
+            	    // InternalDataDSL.g:1241:6: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3(), 1);
+            	    // InternalDataDSL.g:1244:9: ({...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) ) )
+            	    // InternalDataDSL.g:1244:10: {...}? => (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFileFixed", "true");
+            	    }
+            	    // InternalDataDSL.g:1244:19: (otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) ) )
+            	    // InternalDataDSL.g:1244:20: otherlv_6= 'locale' ( (lv_locale_7_0= RULE_STRING ) )
+            	    {
+            	    otherlv_6=(Token)match(input,28,FOLLOW_9); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      									newLeafNode(otherlv_6, grammarAccess.getDataInterchangeFileFixedAccess().getLocaleKeyword_3_1_0());
+            	      								
+            	    }
+            	    // InternalDataDSL.g:1248:9: ( (lv_locale_7_0= RULE_STRING ) )
+            	    // InternalDataDSL.g:1249:10: (lv_locale_7_0= RULE_STRING )
+            	    {
+            	    // InternalDataDSL.g:1249:10: (lv_locale_7_0= RULE_STRING )
+            	    // InternalDataDSL.g:1250:11: lv_locale_7_0= RULE_STRING
+            	    {
+            	    lv_locale_7_0=(Token)match(input,RULE_STRING,FOLLOW_24); if (state.failed) return current;
+            	    if ( state.backtracking==0 ) {
+
+            	      											newLeafNode(lv_locale_7_0, grammarAccess.getDataInterchangeFileFixedAccess().getLocaleSTRINGTerminalRuleCall_3_1_1_0());
+            	      										
+            	    }
+            	    if ( state.backtracking==0 ) {
+
+            	      											if (current==null) {
+            	      												current = createModelElement(grammarAccess.getDataInterchangeFileFixedRule());
+            	      											}
+            	      											setWithLastConsumed(
+            	      												current,
+            	      												"locale",
+            	      												lv_locale_7_0,
+            	      												"org.eclipse.xtext.xbase.Xtype.STRING");
+            	      										
+            	    }
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop18;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFileFixedAccess().getUnorderedGroup_3());
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeFileFixed"
+
+
     // $ANTLR start "entryRuleDataInterchangeBean"
-    // InternalDataDSL.g:1146:1: entryRuleDataInterchangeBean returns [EObject current=null] : iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF ;
+    // InternalDataDSL.g:1283:1: entryRuleDataInterchangeBean returns [EObject current=null] : iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF ;
     public final EObject entryRuleDataInterchangeBean() throws RecognitionException {
         EObject current = null;
 
@@ -3072,8 +3442,8 @@
 
 
         try {
-            // InternalDataDSL.g:1146:60: (iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF )
-            // InternalDataDSL.g:1147:2: iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF
+            // InternalDataDSL.g:1283:60: (iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF )
+            // InternalDataDSL.g:1284:2: iv_ruleDataInterchangeBean= ruleDataInterchangeBean EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeBeanRule()); 
@@ -3104,67 +3474,69 @@
 
 
     // $ANTLR start "ruleDataInterchangeBean"
-    // InternalDataDSL.g:1153:1: ruleDataInterchangeBean returns [EObject current=null] : ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )? (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )? ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )? (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )? (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )? (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )? (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )? (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )? (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )? (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )? ) ;
+    // InternalDataDSL.g:1290:1: ruleDataInterchangeBean returns [EObject current=null] : ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )? (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )? (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )? ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )? ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? ) ) ;
     public final EObject ruleDataInterchangeBean() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_1=null;
         Token otherlv_3=null;
-        Token lv_nodeName_4_0=null;
+        Token otherlv_4=null;
         Token otherlv_5=null;
-        Token lv_elementMap_6_0=null;
-        Token lv_markLatestImport_7_0=null;
-        Token otherlv_8=null;
-        Token lv_markLatestExport_9_0=null;
+        Token lv_nodeName_6_0=null;
+        Token otherlv_7=null;
+        Token lv_elementMap_8_0=null;
+        Token lv_markLatestImport_9_0=null;
         Token otherlv_10=null;
-        Token otherlv_11=null;
+        Token lv_markLatestExport_11_0=null;
         Token otherlv_12=null;
+        Token otherlv_13=null;
         Token otherlv_14=null;
-        Token otherlv_15=null;
         Token otherlv_16=null;
+        Token otherlv_17=null;
         Token otherlv_18=null;
-        Token otherlv_19=null;
         Token otherlv_20=null;
+        Token otherlv_21=null;
         Token otherlv_22=null;
-        Token otherlv_23=null;
         Token otherlv_24=null;
+        Token otherlv_25=null;
         Token otherlv_26=null;
-        Token otherlv_27=null;
         Token otherlv_28=null;
+        Token otherlv_29=null;
         Token otherlv_30=null;
-        Token otherlv_31=null;
         Token otherlv_32=null;
+        Token otherlv_33=null;
         Token otherlv_34=null;
-        Token otherlv_35=null;
         Token otherlv_36=null;
+        Token otherlv_37=null;
         Token otherlv_38=null;
-        EObject lv_expression_13_0 = null;
+        Token otherlv_40=null;
+        EObject lv_expression_15_0 = null;
 
-        EObject lv_lookup_17_0 = null;
+        EObject lv_lookup_19_0 = null;
 
-        EObject lv_format_21_0 = null;
+        EObject lv_format_23_0 = null;
 
-        EObject lv_exportExposes_25_0 = null;
+        EObject lv_exportExposes_27_0 = null;
 
-        EObject lv_mappings_29_0 = null;
+        EObject lv_mappings_31_0 = null;
 
-        EObject lv_lookupKeys_33_0 = null;
+        EObject lv_lookupKeys_35_0 = null;
 
-        EObject lv_exportFilter_37_0 = null;
+        EObject lv_exportFilter_39_0 = null;
 
 
 
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1159:2: ( ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )? (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )? ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )? (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )? (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )? (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )? (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )? (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )? (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )? (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )? ) )
-            // InternalDataDSL.g:1160:2: ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )? (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )? ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )? (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )? (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )? (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )? (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )? (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )? (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )? (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )? )
+            // InternalDataDSL.g:1296:2: ( ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )? (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )? (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )? ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )? ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? ) ) )
+            // InternalDataDSL.g:1297:2: ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )? (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )? (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )? ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )? ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? ) )
             {
-            // InternalDataDSL.g:1160:2: ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )? (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )? ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )? (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )? (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )? (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )? (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )? (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )? (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )? (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )? )
-            // InternalDataDSL.g:1161:3: () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )? (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )? ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )? (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )? (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )? (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )? (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )? (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )? (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )? (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )?
+            // InternalDataDSL.g:1297:2: ( () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )? (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )? (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )? ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )? ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? ) )
+            // InternalDataDSL.g:1298:3: () otherlv_1= 'entity' ( ( ruleLFQN ) ) (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )? (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )? (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )? ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )? ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )? ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? )
             {
-            // InternalDataDSL.g:1161:3: ()
-            // InternalDataDSL.g:1162:4: 
+            // InternalDataDSL.g:1298:3: ()
+            // InternalDataDSL.g:1299:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -3176,17 +3548,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,37,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,38,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeBeanAccess().getEntityKeyword_1());
               		
             }
-            // InternalDataDSL.g:1172:3: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:1173:4: ( ruleLFQN )
+            // InternalDataDSL.g:1309:3: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:1310:4: ( ruleLFQN )
             {
-            // InternalDataDSL.g:1173:4: ( ruleLFQN )
-            // InternalDataDSL.g:1174:5: ruleLFQN
+            // InternalDataDSL.g:1310:4: ( ruleLFQN )
+            // InternalDataDSL.g:1311:5: ruleLFQN
             {
             if ( state.backtracking==0 ) {
 
@@ -3200,7 +3572,7 @@
               					newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getEntityLEntityCrossReference_2_0());
               				
             }
-            pushFollow(FOLLOW_24);
+            pushFollow(FOLLOW_25);
             ruleLFQN();
 
             state._fsp--;
@@ -3216,33 +3588,81 @@
 
             }
 
-            // InternalDataDSL.g:1188:3: (otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) ) )?
-            int alt18=2;
-            int LA18_0 = input.LA(1);
+            // InternalDataDSL.g:1325:3: (otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) ) )?
+            int alt19=2;
+            int LA19_0 = input.LA(1);
 
-            if ( (LA18_0==38) ) {
-                alt18=1;
+            if ( (LA19_0==39) ) {
+                alt19=1;
             }
-            switch (alt18) {
+            switch (alt19) {
                 case 1 :
-                    // InternalDataDSL.g:1189:4: otherlv_3= 'nodeName' ( (lv_nodeName_4_0= RULE_STRING ) )
+                    // InternalDataDSL.g:1326:4: otherlv_3= 'referencedBy' ( (otherlv_4= RULE_ID ) )
                     {
-                    otherlv_3=(Token)match(input,38,FOLLOW_9); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,39,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_3, grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_3_0());
+                      				newLeafNode(otherlv_3, grammarAccess.getDataInterchangeBeanAccess().getReferencedByKeyword_3_0());
                       			
                     }
-                    // InternalDataDSL.g:1193:4: ( (lv_nodeName_4_0= RULE_STRING ) )
-                    // InternalDataDSL.g:1194:5: (lv_nodeName_4_0= RULE_STRING )
+                    // InternalDataDSL.g:1330:4: ( (otherlv_4= RULE_ID ) )
+                    // InternalDataDSL.g:1331:5: (otherlv_4= RULE_ID )
                     {
-                    // InternalDataDSL.g:1194:5: (lv_nodeName_4_0= RULE_STRING )
-                    // InternalDataDSL.g:1195:6: lv_nodeName_4_0= RULE_STRING
+                    // InternalDataDSL.g:1331:5: (otherlv_4= RULE_ID )
+                    // InternalDataDSL.g:1332:6: otherlv_4= RULE_ID
                     {
-                    lv_nodeName_4_0=(Token)match(input,RULE_STRING,FOLLOW_25); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(lv_nodeName_4_0, grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_3_1_0());
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDataInterchangeBeanRule());
+                      						}
+                      					
+                    }
+                    otherlv_4=(Token)match(input,RULE_ID,FOLLOW_26); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(otherlv_4, grammarAccess.getDataInterchangeBeanAccess().getRefDataSourceLEntityFeatureCrossReference_3_1_0());
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalDataDSL.g:1344:3: (otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) ) )?
+            int alt20=2;
+            int LA20_0 = input.LA(1);
+
+            if ( (LA20_0==40) ) {
+                alt20=1;
+            }
+            switch (alt20) {
+                case 1 :
+                    // InternalDataDSL.g:1345:4: otherlv_5= 'nodeName' ( (lv_nodeName_6_0= RULE_STRING ) )
+                    {
+                    otherlv_5=(Token)match(input,40,FOLLOW_9); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeBeanAccess().getNodeNameKeyword_4_0());
+                      			
+                    }
+                    // InternalDataDSL.g:1349:4: ( (lv_nodeName_6_0= RULE_STRING ) )
+                    // InternalDataDSL.g:1350:5: (lv_nodeName_6_0= RULE_STRING )
+                    {
+                    // InternalDataDSL.g:1350:5: (lv_nodeName_6_0= RULE_STRING )
+                    // InternalDataDSL.g:1351:6: lv_nodeName_6_0= RULE_STRING
+                    {
+                    lv_nodeName_6_0=(Token)match(input,RULE_STRING,FOLLOW_27); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_nodeName_6_0, grammarAccess.getDataInterchangeBeanAccess().getNodeNameSTRINGTerminalRuleCall_4_1_0());
                       					
                     }
                     if ( state.backtracking==0 ) {
@@ -3253,7 +3673,7 @@
                       						setWithLastConsumed(
                       							current,
                       							"nodeName",
-                      							lv_nodeName_4_0,
+                      							lv_nodeName_6_0,
                       							"org.eclipse.xtext.xbase.Xtype.STRING");
                       					
                     }
@@ -3269,33 +3689,33 @@
 
             }
 
-            // InternalDataDSL.g:1212:3: (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )?
-            int alt19=2;
-            int LA19_0 = input.LA(1);
+            // InternalDataDSL.g:1368:3: (otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) ) )?
+            int alt21=2;
+            int LA21_0 = input.LA(1);
 
-            if ( (LA19_0==39) ) {
-                alt19=1;
+            if ( (LA21_0==41) ) {
+                alt21=1;
             }
-            switch (alt19) {
+            switch (alt21) {
                 case 1 :
-                    // InternalDataDSL.g:1213:4: otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) )
+                    // InternalDataDSL.g:1369:4: otherlv_7= 'createOn' ( (lv_elementMap_8_0= RULE_STRING ) )
                     {
-                    otherlv_5=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,41,FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_4_0());
+                      				newLeafNode(otherlv_7, grammarAccess.getDataInterchangeBeanAccess().getCreateOnKeyword_5_0());
                       			
                     }
-                    // InternalDataDSL.g:1217:4: ( (lv_elementMap_6_0= RULE_STRING ) )
-                    // InternalDataDSL.g:1218:5: (lv_elementMap_6_0= RULE_STRING )
+                    // InternalDataDSL.g:1373:4: ( (lv_elementMap_8_0= RULE_STRING ) )
+                    // InternalDataDSL.g:1374:5: (lv_elementMap_8_0= RULE_STRING )
                     {
-                    // InternalDataDSL.g:1218:5: (lv_elementMap_6_0= RULE_STRING )
-                    // InternalDataDSL.g:1219:6: lv_elementMap_6_0= RULE_STRING
+                    // InternalDataDSL.g:1374:5: (lv_elementMap_8_0= RULE_STRING )
+                    // InternalDataDSL.g:1375:6: lv_elementMap_8_0= RULE_STRING
                     {
-                    lv_elementMap_6_0=(Token)match(input,RULE_STRING,FOLLOW_26); if (state.failed) return current;
+                    lv_elementMap_8_0=(Token)match(input,RULE_STRING,FOLLOW_28); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_4_1_0());
+                      						newLeafNode(lv_elementMap_8_0, grammarAccess.getDataInterchangeBeanAccess().getElementMapSTRINGTerminalRuleCall_5_1_0());
                       					
                     }
                     if ( state.backtracking==0 ) {
@@ -3306,7 +3726,7 @@
                       						setWithLastConsumed(
                       							current,
                       							"elementMap",
-                      							lv_elementMap_6_0,
+                      							lv_elementMap_8_0,
                       							"org.eclipse.xtext.xbase.Xtype.STRING");
                       					
                     }
@@ -3322,27 +3742,27 @@
 
             }
 
-            // InternalDataDSL.g:1236:3: ( ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) ) )?
-            int alt20=2;
-            int LA20_0 = input.LA(1);
+            // InternalDataDSL.g:1392:3: ( ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) ) )?
+            int alt22=2;
+            int LA22_0 = input.LA(1);
 
-            if ( (LA20_0==40) ) {
-                alt20=1;
+            if ( (LA22_0==42) ) {
+                alt22=1;
             }
-            switch (alt20) {
+            switch (alt22) {
                 case 1 :
-                    // InternalDataDSL.g:1237:4: ( (lv_markLatestImport_7_0= 'latestImport' ) ) ( (otherlv_8= RULE_ID ) )
+                    // InternalDataDSL.g:1393:4: ( (lv_markLatestImport_9_0= 'latestImport' ) ) ( (otherlv_10= RULE_ID ) )
                     {
-                    // InternalDataDSL.g:1237:4: ( (lv_markLatestImport_7_0= 'latestImport' ) )
-                    // InternalDataDSL.g:1238:5: (lv_markLatestImport_7_0= 'latestImport' )
+                    // InternalDataDSL.g:1393:4: ( (lv_markLatestImport_9_0= 'latestImport' ) )
+                    // InternalDataDSL.g:1394:5: (lv_markLatestImport_9_0= 'latestImport' )
                     {
-                    // InternalDataDSL.g:1238:5: (lv_markLatestImport_7_0= 'latestImport' )
-                    // InternalDataDSL.g:1239:6: lv_markLatestImport_7_0= 'latestImport'
+                    // InternalDataDSL.g:1394:5: (lv_markLatestImport_9_0= 'latestImport' )
+                    // InternalDataDSL.g:1395:6: lv_markLatestImport_9_0= 'latestImport'
                     {
-                    lv_markLatestImport_7_0=(Token)match(input,40,FOLLOW_4); if (state.failed) return current;
+                    lv_markLatestImport_9_0=(Token)match(input,42,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(lv_markLatestImport_7_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_5_0_0());
+                      						newLeafNode(lv_markLatestImport_9_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestImportLatestImportKeyword_6_0_0());
                       					
                     }
                     if ( state.backtracking==0 ) {
@@ -3359,11 +3779,11 @@
 
                     }
 
-                    // InternalDataDSL.g:1251:4: ( (otherlv_8= RULE_ID ) )
-                    // InternalDataDSL.g:1252:5: (otherlv_8= RULE_ID )
+                    // InternalDataDSL.g:1407:4: ( (otherlv_10= RULE_ID ) )
+                    // InternalDataDSL.g:1408:5: (otherlv_10= RULE_ID )
                     {
-                    // InternalDataDSL.g:1252:5: (otherlv_8= RULE_ID )
-                    // InternalDataDSL.g:1253:6: otherlv_8= RULE_ID
+                    // InternalDataDSL.g:1408:5: (otherlv_10= RULE_ID )
+                    // InternalDataDSL.g:1409:6: otherlv_10= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3372,10 +3792,10 @@
                       						}
                       					
                     }
-                    otherlv_8=(Token)match(input,RULE_ID,FOLLOW_27); if (state.failed) return current;
+                    otherlv_10=(Token)match(input,RULE_ID,FOLLOW_29); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(otherlv_8, grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_5_1_0());
+                      						newLeafNode(otherlv_10, grammarAccess.getDataInterchangeBeanAccess().getLatestPropertyLEntityAttributeCrossReference_6_1_0());
                       					
                     }
 
@@ -3390,27 +3810,27 @@
 
             }
 
-            // InternalDataDSL.g:1265:3: ( ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) ) )?
-            int alt21=2;
-            int LA21_0 = input.LA(1);
+            // InternalDataDSL.g:1421:3: ( ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) ) )?
+            int alt23=2;
+            int LA23_0 = input.LA(1);
 
-            if ( (LA21_0==41) ) {
-                alt21=1;
+            if ( (LA23_0==43) ) {
+                alt23=1;
             }
-            switch (alt21) {
+            switch (alt23) {
                 case 1 :
-                    // InternalDataDSL.g:1266:4: ( (lv_markLatestExport_9_0= 'latestExport' ) ) ( (otherlv_10= RULE_ID ) )
+                    // InternalDataDSL.g:1422:4: ( (lv_markLatestExport_11_0= 'latestExport' ) ) ( (otherlv_12= RULE_ID ) )
                     {
-                    // InternalDataDSL.g:1266:4: ( (lv_markLatestExport_9_0= 'latestExport' ) )
-                    // InternalDataDSL.g:1267:5: (lv_markLatestExport_9_0= 'latestExport' )
+                    // InternalDataDSL.g:1422:4: ( (lv_markLatestExport_11_0= 'latestExport' ) )
+                    // InternalDataDSL.g:1423:5: (lv_markLatestExport_11_0= 'latestExport' )
                     {
-                    // InternalDataDSL.g:1267:5: (lv_markLatestExport_9_0= 'latestExport' )
-                    // InternalDataDSL.g:1268:6: lv_markLatestExport_9_0= 'latestExport'
+                    // InternalDataDSL.g:1423:5: (lv_markLatestExport_11_0= 'latestExport' )
+                    // InternalDataDSL.g:1424:6: lv_markLatestExport_11_0= 'latestExport'
                     {
-                    lv_markLatestExport_9_0=(Token)match(input,41,FOLLOW_4); if (state.failed) return current;
+                    lv_markLatestExport_11_0=(Token)match(input,43,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(lv_markLatestExport_9_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_6_0_0());
+                      						newLeafNode(lv_markLatestExport_11_0, grammarAccess.getDataInterchangeBeanAccess().getMarkLatestExportLatestExportKeyword_7_0_0());
                       					
                     }
                     if ( state.backtracking==0 ) {
@@ -3427,11 +3847,11 @@
 
                     }
 
-                    // InternalDataDSL.g:1280:4: ( (otherlv_10= RULE_ID ) )
-                    // InternalDataDSL.g:1281:5: (otherlv_10= RULE_ID )
+                    // InternalDataDSL.g:1436:4: ( (otherlv_12= RULE_ID ) )
+                    // InternalDataDSL.g:1437:5: (otherlv_12= RULE_ID )
                     {
-                    // InternalDataDSL.g:1281:5: (otherlv_10= RULE_ID )
-                    // InternalDataDSL.g:1282:6: otherlv_10= RULE_ID
+                    // InternalDataDSL.g:1437:5: (otherlv_12= RULE_ID )
+                    // InternalDataDSL.g:1438:6: otherlv_12= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -3440,10 +3860,10 @@
                       						}
                       					
                     }
-                    otherlv_10=(Token)match(input,RULE_ID,FOLLOW_28); if (state.failed) return current;
+                    otherlv_12=(Token)match(input,RULE_ID,FOLLOW_30); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						newLeafNode(otherlv_10, grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_6_1_0());
+                      						newLeafNode(otherlv_12, grammarAccess.getDataInterchangeBeanAccess().getLatestExpPropertyLEntityAttributeCrossReference_7_1_0());
                       					
                     }
 
@@ -3458,157 +3878,72 @@
 
             }
 
-            // InternalDataDSL.g:1294:3: (otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}' )?
-            int alt23=2;
-            int LA23_0 = input.LA(1);
-
-            if ( (LA23_0==42) ) {
-                alt23=1;
-            }
-            switch (alt23) {
-                case 1 :
-                    // InternalDataDSL.g:1295:4: otherlv_11= 'expression' otherlv_12= '{' ( (lv_expression_13_0= ruleDataInterchangeExpression ) )* otherlv_14= '}'
-                    {
-                    otherlv_11=(Token)match(input,42,FOLLOW_18); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      				newLeafNode(otherlv_11, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0());
-                      			
-                    }
-                    otherlv_12=(Token)match(input,14,FOLLOW_29); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      				newLeafNode(otherlv_12, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1());
-                      			
-                    }
-                    // InternalDataDSL.g:1303:4: ( (lv_expression_13_0= ruleDataInterchangeExpression ) )*
-                    loop22:
-                    do {
-                        int alt22=2;
-                        int LA22_0 = input.LA(1);
-
-                        if ( (LA22_0==61||LA22_0==67) ) {
-                            alt22=1;
-                        }
-
-
-                        switch (alt22) {
-                    	case 1 :
-                    	    // InternalDataDSL.g:1304:5: (lv_expression_13_0= ruleDataInterchangeExpression )
-                    	    {
-                    	    // InternalDataDSL.g:1304:5: (lv_expression_13_0= ruleDataInterchangeExpression )
-                    	    // InternalDataDSL.g:1305:6: lv_expression_13_0= ruleDataInterchangeExpression
-                    	    {
-                    	    if ( state.backtracking==0 ) {
-
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_7_2_0());
-                    	      					
-                    	    }
-                    	    pushFollow(FOLLOW_29);
-                    	    lv_expression_13_0=ruleDataInterchangeExpression();
-
-                    	    state._fsp--;
-                    	    if (state.failed) return current;
-                    	    if ( state.backtracking==0 ) {
-
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"expression",
-                    	      							lv_expression_13_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpression");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
-                    	    }
-
-                    	    }
-
-
-                    	    }
-                    	    break;
-
-                    	default :
-                    	    break loop22;
-                        }
-                    } while (true);
-
-                    otherlv_14=(Token)match(input,15,FOLLOW_30); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      				newLeafNode(otherlv_14, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3());
-                      			
-                    }
-
-                    }
-                    break;
-
-            }
-
-            // InternalDataDSL.g:1327:3: (otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}' )?
+            // InternalDataDSL.g:1450:3: ( (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )? )
+            // InternalDataDSL.g:1451:4: (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )? (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )? (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )? (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )? (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )? (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )? (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )?
+            {
+            // InternalDataDSL.g:1451:4: (otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}' )?
             int alt25=2;
             int LA25_0 = input.LA(1);
 
-            if ( (LA25_0==43) ) {
+            if ( (LA25_0==44) ) {
                 alt25=1;
             }
             switch (alt25) {
                 case 1 :
-                    // InternalDataDSL.g:1328:4: otherlv_15= 'lookup' otherlv_16= '{' ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )* otherlv_18= '}'
+                    // InternalDataDSL.g:1452:5: otherlv_13= 'expression' otherlv_14= '{' ( (lv_expression_15_0= ruleDataInterchangeExpression ) )* otherlv_16= '}'
                     {
-                    otherlv_15=(Token)match(input,43,FOLLOW_18); if (state.failed) return current;
+                    otherlv_13=(Token)match(input,44,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_15, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0());
-                      			
+                      					newLeafNode(otherlv_13, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0());
+                      				
                     }
-                    otherlv_16=(Token)match(input,14,FOLLOW_31); if (state.failed) return current;
+                    otherlv_14=(Token)match(input,14,FOLLOW_31); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_16, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1());
-                      			
+                      					newLeafNode(otherlv_14, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1());
+                      				
                     }
-                    // InternalDataDSL.g:1336:4: ( (lv_lookup_17_0= ruleDataInterchangeLookup ) )*
+                    // InternalDataDSL.g:1460:5: ( (lv_expression_15_0= ruleDataInterchangeExpression ) )*
                     loop24:
                     do {
                         int alt24=2;
                         int LA24_0 = input.LA(1);
 
-                        if ( (LA24_0==50) ) {
+                        if ( (LA24_0==63||LA24_0==69) ) {
                             alt24=1;
                         }
 
 
                         switch (alt24) {
                     	case 1 :
-                    	    // InternalDataDSL.g:1337:5: (lv_lookup_17_0= ruleDataInterchangeLookup )
+                    	    // InternalDataDSL.g:1461:6: (lv_expression_15_0= ruleDataInterchangeExpression )
                     	    {
-                    	    // InternalDataDSL.g:1337:5: (lv_lookup_17_0= ruleDataInterchangeLookup )
-                    	    // InternalDataDSL.g:1338:6: lv_lookup_17_0= ruleDataInterchangeLookup
+                    	    // InternalDataDSL.g:1461:6: (lv_expression_15_0= ruleDataInterchangeExpression )
+                    	    // InternalDataDSL.g:1462:7: lv_expression_15_0= ruleDataInterchangeExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_2_0());
-                    	      					
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0());
+                    	      						
                     	    }
                     	    pushFollow(FOLLOW_31);
-                    	    lv_lookup_17_0=ruleDataInterchangeLookup();
+                    	    lv_expression_15_0=ruleDataInterchangeExpression();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"lookup",
-                    	      							lv_lookup_17_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookup");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"expression",
+                    	      								lv_expression_15_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpression");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -3622,11 +3957,11 @@
                         }
                     } while (true);
 
-                    otherlv_18=(Token)match(input,15,FOLLOW_32); if (state.failed) return current;
+                    otherlv_16=(Token)match(input,15,FOLLOW_32); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_18, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3());
-                      			
+                      					newLeafNode(otherlv_16, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3());
+                      				
                     }
 
                     }
@@ -3634,69 +3969,69 @@
 
             }
 
-            // InternalDataDSL.g:1360:3: (otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}' )?
+            // InternalDataDSL.g:1484:4: (otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}' )?
             int alt27=2;
             int LA27_0 = input.LA(1);
 
-            if ( (LA27_0==44) ) {
+            if ( (LA27_0==45) ) {
                 alt27=1;
             }
             switch (alt27) {
                 case 1 :
-                    // InternalDataDSL.g:1361:4: otherlv_19= 'format' otherlv_20= '{' ( (lv_format_21_0= ruleDataInterchangeFormat ) )* otherlv_22= '}'
+                    // InternalDataDSL.g:1485:5: otherlv_17= 'lookup' otherlv_18= '{' ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )* otherlv_20= '}'
                     {
-                    otherlv_19=(Token)match(input,44,FOLLOW_18); if (state.failed) return current;
+                    otherlv_17=(Token)match(input,45,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_19, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0());
-                      			
+                      					newLeafNode(otherlv_17, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0());
+                      				
                     }
-                    otherlv_20=(Token)match(input,14,FOLLOW_31); if (state.failed) return current;
+                    otherlv_18=(Token)match(input,14,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_20, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1());
-                      			
+                      					newLeafNode(otherlv_18, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1());
+                      				
                     }
-                    // InternalDataDSL.g:1369:4: ( (lv_format_21_0= ruleDataInterchangeFormat ) )*
+                    // InternalDataDSL.g:1493:5: ( (lv_lookup_19_0= ruleDataInterchangeLookup ) )*
                     loop26:
                     do {
                         int alt26=2;
                         int LA26_0 = input.LA(1);
 
-                        if ( (LA26_0==50) ) {
+                        if ( (LA26_0==52) ) {
                             alt26=1;
                         }
 
 
                         switch (alt26) {
                     	case 1 :
-                    	    // InternalDataDSL.g:1370:5: (lv_format_21_0= ruleDataInterchangeFormat )
+                    	    // InternalDataDSL.g:1494:6: (lv_lookup_19_0= ruleDataInterchangeLookup )
                     	    {
-                    	    // InternalDataDSL.g:1370:5: (lv_format_21_0= ruleDataInterchangeFormat )
-                    	    // InternalDataDSL.g:1371:6: lv_format_21_0= ruleDataInterchangeFormat
+                    	    // InternalDataDSL.g:1494:6: (lv_lookup_19_0= ruleDataInterchangeLookup )
+                    	    // InternalDataDSL.g:1495:7: lv_lookup_19_0= ruleDataInterchangeLookup
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_9_2_0());
-                    	      					
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupDataInterchangeLookupParserRuleCall_8_1_2_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_31);
-                    	    lv_format_21_0=ruleDataInterchangeFormat();
+                    	    pushFollow(FOLLOW_33);
+                    	    lv_lookup_19_0=ruleDataInterchangeLookup();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"format",
-                    	      							lv_format_21_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFormat");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"lookup",
+                    	      								lv_lookup_19_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookup");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -3710,11 +4045,11 @@
                         }
                     } while (true);
 
-                    otherlv_22=(Token)match(input,15,FOLLOW_33); if (state.failed) return current;
+                    otherlv_20=(Token)match(input,15,FOLLOW_34); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_22, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3());
-                      			
+                      					newLeafNode(otherlv_20, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3());
+                      				
                     }
 
                     }
@@ -3722,69 +4057,69 @@
 
             }
 
-            // InternalDataDSL.g:1393:3: (otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}' )?
+            // InternalDataDSL.g:1517:4: (otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}' )?
             int alt29=2;
             int LA29_0 = input.LA(1);
 
-            if ( (LA29_0==45) ) {
+            if ( (LA29_0==46) ) {
                 alt29=1;
             }
             switch (alt29) {
                 case 1 :
-                    // InternalDataDSL.g:1394:4: otherlv_23= 'expose' otherlv_24= '{' ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )* otherlv_26= '}'
+                    // InternalDataDSL.g:1518:5: otherlv_21= 'format' otherlv_22= '{' ( (lv_format_23_0= ruleDataInterchangeFormat ) )* otherlv_24= '}'
                     {
-                    otherlv_23=(Token)match(input,45,FOLLOW_18); if (state.failed) return current;
+                    otherlv_21=(Token)match(input,46,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_23, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0());
-                      			
+                      					newLeafNode(otherlv_21, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0());
+                      				
                     }
-                    otherlv_24=(Token)match(input,14,FOLLOW_34); if (state.failed) return current;
+                    otherlv_22=(Token)match(input,14,FOLLOW_33); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_24, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1());
-                      			
+                      					newLeafNode(otherlv_22, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1());
+                      				
                     }
-                    // InternalDataDSL.g:1402:4: ( (lv_exportExposes_25_0= ruleDataInterchangeExpose ) )*
+                    // InternalDataDSL.g:1526:5: ( (lv_format_23_0= ruleDataInterchangeFormat ) )*
                     loop28:
                     do {
                         int alt28=2;
                         int LA28_0 = input.LA(1);
 
-                        if ( (LA28_0==64) ) {
+                        if ( (LA28_0==52) ) {
                             alt28=1;
                         }
 
 
                         switch (alt28) {
                     	case 1 :
-                    	    // InternalDataDSL.g:1403:5: (lv_exportExposes_25_0= ruleDataInterchangeExpose )
+                    	    // InternalDataDSL.g:1527:6: (lv_format_23_0= ruleDataInterchangeFormat )
                     	    {
-                    	    // InternalDataDSL.g:1403:5: (lv_exportExposes_25_0= ruleDataInterchangeExpose )
-                    	    // InternalDataDSL.g:1404:6: lv_exportExposes_25_0= ruleDataInterchangeExpose
+                    	    // InternalDataDSL.g:1527:6: (lv_format_23_0= ruleDataInterchangeFormat )
+                    	    // InternalDataDSL.g:1528:7: lv_format_23_0= ruleDataInterchangeFormat
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_10_2_0());
-                    	      					
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getFormatDataInterchangeFormatParserRuleCall_8_2_2_0());
+                    	      						
                     	    }
-                    	    pushFollow(FOLLOW_34);
-                    	    lv_exportExposes_25_0=ruleDataInterchangeExpose();
+                    	    pushFollow(FOLLOW_33);
+                    	    lv_format_23_0=ruleDataInterchangeFormat();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"exportExposes",
-                    	      							lv_exportExposes_25_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpose");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"format",
+                    	      								lv_format_23_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFormat");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -3798,11 +4133,11 @@
                         }
                     } while (true);
 
-                    otherlv_26=(Token)match(input,15,FOLLOW_35); if (state.failed) return current;
+                    otherlv_24=(Token)match(input,15,FOLLOW_35); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_26, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3());
-                      			
+                      					newLeafNode(otherlv_24, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3());
+                      				
                     }
 
                     }
@@ -3810,69 +4145,69 @@
 
             }
 
-            // InternalDataDSL.g:1426:3: (otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}' )?
+            // InternalDataDSL.g:1550:4: (otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}' )?
             int alt31=2;
             int LA31_0 = input.LA(1);
 
-            if ( (LA31_0==46) ) {
+            if ( (LA31_0==47) ) {
                 alt31=1;
             }
             switch (alt31) {
                 case 1 :
-                    // InternalDataDSL.g:1427:4: otherlv_27= 'mapping' otherlv_28= '{' ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )* otherlv_30= '}'
+                    // InternalDataDSL.g:1551:5: otherlv_25= 'expose' otherlv_26= '{' ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )* otherlv_28= '}'
                     {
-                    otherlv_27=(Token)match(input,46,FOLLOW_18); if (state.failed) return current;
+                    otherlv_25=(Token)match(input,47,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_27, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0());
-                      			
+                      					newLeafNode(otherlv_25, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0());
+                      				
                     }
-                    otherlv_28=(Token)match(input,14,FOLLOW_36); if (state.failed) return current;
+                    otherlv_26=(Token)match(input,14,FOLLOW_36); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_28, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1());
-                      			
+                      					newLeafNode(otherlv_26, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1());
+                      				
                     }
-                    // InternalDataDSL.g:1435:4: ( (lv_mappings_29_0= ruleDataInterchangeMapping ) )*
+                    // InternalDataDSL.g:1559:5: ( (lv_exportExposes_27_0= ruleDataInterchangeExpose ) )*
                     loop30:
                     do {
                         int alt30=2;
                         int LA30_0 = input.LA(1);
 
-                        if ( (LA30_0==69||LA30_0==71) ) {
+                        if ( (LA30_0==66) ) {
                             alt30=1;
                         }
 
 
                         switch (alt30) {
                     	case 1 :
-                    	    // InternalDataDSL.g:1436:5: (lv_mappings_29_0= ruleDataInterchangeMapping )
+                    	    // InternalDataDSL.g:1560:6: (lv_exportExposes_27_0= ruleDataInterchangeExpose )
                     	    {
-                    	    // InternalDataDSL.g:1436:5: (lv_mappings_29_0= ruleDataInterchangeMapping )
-                    	    // InternalDataDSL.g:1437:6: lv_mappings_29_0= ruleDataInterchangeMapping
+                    	    // InternalDataDSL.g:1560:6: (lv_exportExposes_27_0= ruleDataInterchangeExpose )
+                    	    // InternalDataDSL.g:1561:7: lv_exportExposes_27_0= ruleDataInterchangeExpose
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_11_2_0());
-                    	      					
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0());
+                    	      						
                     	    }
                     	    pushFollow(FOLLOW_36);
-                    	    lv_mappings_29_0=ruleDataInterchangeMapping();
+                    	    lv_exportExposes_27_0=ruleDataInterchangeExpose();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"mappings",
-                    	      							lv_mappings_29_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMapping");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"exportExposes",
+                    	      								lv_exportExposes_27_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExpose");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -3886,11 +4221,11 @@
                         }
                     } while (true);
 
-                    otherlv_30=(Token)match(input,15,FOLLOW_37); if (state.failed) return current;
+                    otherlv_28=(Token)match(input,15,FOLLOW_37); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_30, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3());
-                      			
+                      					newLeafNode(otherlv_28, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3());
+                      				
                     }
 
                     }
@@ -3898,69 +4233,69 @@
 
             }
 
-            // InternalDataDSL.g:1459:3: (otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}' )?
+            // InternalDataDSL.g:1583:4: (otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}' )?
             int alt33=2;
             int LA33_0 = input.LA(1);
 
-            if ( (LA33_0==47) ) {
+            if ( (LA33_0==48) ) {
                 alt33=1;
             }
             switch (alt33) {
                 case 1 :
-                    // InternalDataDSL.g:1460:4: otherlv_31= 'keys' otherlv_32= '{' ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )* otherlv_34= '}'
+                    // InternalDataDSL.g:1584:5: otherlv_29= 'mapping' otherlv_30= '{' ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )* otherlv_32= '}'
                     {
-                    otherlv_31=(Token)match(input,47,FOLLOW_18); if (state.failed) return current;
+                    otherlv_29=(Token)match(input,48,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_31, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0());
-                      			
+                      					newLeafNode(otherlv_29, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0());
+                      				
                     }
-                    otherlv_32=(Token)match(input,14,FOLLOW_38); if (state.failed) return current;
+                    otherlv_30=(Token)match(input,14,FOLLOW_38); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_32, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1());
-                      			
+                      					newLeafNode(otherlv_30, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1());
+                      				
                     }
-                    // InternalDataDSL.g:1468:4: ( (lv_lookupKeys_33_0= ruleDataInterchangeKey ) )*
+                    // InternalDataDSL.g:1592:5: ( (lv_mappings_31_0= ruleDataInterchangeMapping ) )*
                     loop32:
                     do {
                         int alt32=2;
                         int LA32_0 = input.LA(1);
 
-                        if ( (LA32_0==49) ) {
+                        if ( (LA32_0==72||LA32_0==74||LA32_0==77) ) {
                             alt32=1;
                         }
 
 
                         switch (alt32) {
                     	case 1 :
-                    	    // InternalDataDSL.g:1469:5: (lv_lookupKeys_33_0= ruleDataInterchangeKey )
+                    	    // InternalDataDSL.g:1593:6: (lv_mappings_31_0= ruleDataInterchangeMapping )
                     	    {
-                    	    // InternalDataDSL.g:1469:5: (lv_lookupKeys_33_0= ruleDataInterchangeKey )
-                    	    // InternalDataDSL.g:1470:6: lv_lookupKeys_33_0= ruleDataInterchangeKey
+                    	    // InternalDataDSL.g:1593:6: (lv_mappings_31_0= ruleDataInterchangeMapping )
+                    	    // InternalDataDSL.g:1594:7: lv_mappings_31_0= ruleDataInterchangeMapping
                     	    {
                     	    if ( state.backtracking==0 ) {
 
-                    	      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0());
-                    	      					
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0());
+                    	      						
                     	    }
                     	    pushFollow(FOLLOW_38);
-                    	    lv_lookupKeys_33_0=ruleDataInterchangeKey();
+                    	    lv_mappings_31_0=ruleDataInterchangeMapping();
 
                     	    state._fsp--;
                     	    if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
-                    	      						if (current==null) {
-                    	      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                    	      						}
-                    	      						add(
-                    	      							current,
-                    	      							"lookupKeys",
-                    	      							lv_lookupKeys_33_0,
-                    	      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeKey");
-                    	      						afterParserOrEnumRuleCall();
-                    	      					
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"mappings",
+                    	      								lv_mappings_31_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMapping");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
                     	    }
 
                     	    }
@@ -3974,11 +4309,11 @@
                         }
                     } while (true);
 
-                    otherlv_34=(Token)match(input,15,FOLLOW_39); if (state.failed) return current;
+                    otherlv_32=(Token)match(input,15,FOLLOW_39); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_34, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3());
-                      			
+                      					newLeafNode(otherlv_32, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3());
+                      				
                     }
 
                     }
@@ -3986,57 +4321,145 @@
 
             }
 
-            // InternalDataDSL.g:1492:3: (otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}' )?
-            int alt34=2;
-            int LA34_0 = input.LA(1);
+            // InternalDataDSL.g:1616:4: (otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}' )?
+            int alt35=2;
+            int LA35_0 = input.LA(1);
 
-            if ( (LA34_0==48) ) {
-                alt34=1;
+            if ( (LA35_0==49) ) {
+                alt35=1;
             }
-            switch (alt34) {
+            switch (alt35) {
                 case 1 :
-                    // InternalDataDSL.g:1493:4: otherlv_35= 'exportFilter' otherlv_36= '{' ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) ) otherlv_38= '}'
+                    // InternalDataDSL.g:1617:5: otherlv_33= 'keys' otherlv_34= '{' ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )* otherlv_36= '}'
                     {
-                    otherlv_35=(Token)match(input,48,FOLLOW_18); if (state.failed) return current;
+                    otherlv_33=(Token)match(input,49,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_35, grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_13_0());
-                      			
+                      					newLeafNode(otherlv_33, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0());
+                      				
                     }
-                    otherlv_36=(Token)match(input,14,FOLLOW_40); if (state.failed) return current;
+                    otherlv_34=(Token)match(input,14,FOLLOW_40); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_36, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_13_1());
-                      			
+                      					newLeafNode(otherlv_34, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1());
+                      				
                     }
-                    // InternalDataDSL.g:1501:4: ( (lv_exportFilter_37_0= ruleDataInterchangeExportFilter ) )
-                    // InternalDataDSL.g:1502:5: (lv_exportFilter_37_0= ruleDataInterchangeExportFilter )
+                    // InternalDataDSL.g:1625:5: ( (lv_lookupKeys_35_0= ruleDataInterchangeKey ) )*
+                    loop34:
+                    do {
+                        int alt34=2;
+                        int LA34_0 = input.LA(1);
+
+                        if ( (LA34_0==51) ) {
+                            alt34=1;
+                        }
+
+
+                        switch (alt34) {
+                    	case 1 :
+                    	    // InternalDataDSL.g:1626:6: (lv_lookupKeys_35_0= ruleDataInterchangeKey )
+                    	    {
+                    	    // InternalDataDSL.g:1626:6: (lv_lookupKeys_35_0= ruleDataInterchangeKey )
+                    	    // InternalDataDSL.g:1627:7: lv_lookupKeys_35_0= ruleDataInterchangeKey
+                    	    {
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0());
+                    	      						
+                    	    }
+                    	    pushFollow(FOLLOW_40);
+                    	    lv_lookupKeys_35_0=ruleDataInterchangeKey();
+
+                    	    state._fsp--;
+                    	    if (state.failed) return current;
+                    	    if ( state.backtracking==0 ) {
+
+                    	      							if (current==null) {
+                    	      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                    	      							}
+                    	      							add(
+                    	      								current,
+                    	      								"lookupKeys",
+                    	      								lv_lookupKeys_35_0,
+                    	      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeKey");
+                    	      							afterParserOrEnumRuleCall();
+                    	      						
+                    	    }
+
+                    	    }
+
+
+                    	    }
+                    	    break;
+
+                    	default :
+                    	    break loop34;
+                        }
+                    } while (true);
+
+                    otherlv_36=(Token)match(input,15,FOLLOW_41); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_36, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3());
+                      				
+                    }
+
+                    }
+                    break;
+
+            }
+
+            // InternalDataDSL.g:1649:4: (otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}' )?
+            int alt36=2;
+            int LA36_0 = input.LA(1);
+
+            if ( (LA36_0==50) ) {
+                alt36=1;
+            }
+            switch (alt36) {
+                case 1 :
+                    // InternalDataDSL.g:1650:5: otherlv_37= 'exportFilter' otherlv_38= '{' ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) ) otherlv_40= '}'
                     {
-                    // InternalDataDSL.g:1502:5: (lv_exportFilter_37_0= ruleDataInterchangeExportFilter )
-                    // InternalDataDSL.g:1503:6: lv_exportFilter_37_0= ruleDataInterchangeExportFilter
+                    otherlv_37=(Token)match(input,50,FOLLOW_18); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_37, grammarAccess.getDataInterchangeBeanAccess().getExportFilterKeyword_8_6_0());
+                      				
+                    }
+                    otherlv_38=(Token)match(input,14,FOLLOW_42); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					newLeafNode(otherlv_38, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_6_1());
+                      				
+                    }
+                    // InternalDataDSL.g:1658:5: ( (lv_exportFilter_39_0= ruleDataInterchangeExportFilter ) )
+                    // InternalDataDSL.g:1659:6: (lv_exportFilter_39_0= ruleDataInterchangeExportFilter )
+                    {
+                    // InternalDataDSL.g:1659:6: (lv_exportFilter_39_0= ruleDataInterchangeExportFilter )
+                    // InternalDataDSL.g:1660:7: lv_exportFilter_39_0= ruleDataInterchangeExportFilter
                     {
                     if ( state.backtracking==0 ) {
 
-                      						newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0());
-                      					
+                      							newCompositeNode(grammarAccess.getDataInterchangeBeanAccess().getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0());
+                      						
                     }
-                    pushFollow(FOLLOW_41);
-                    lv_exportFilter_37_0=ruleDataInterchangeExportFilter();
+                    pushFollow(FOLLOW_43);
+                    lv_exportFilter_39_0=ruleDataInterchangeExportFilter();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      						if (current==null) {
-                      							current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
-                      						}
-                      						set(
-                      							current,
-                      							"exportFilter",
-                      							lv_exportFilter_37_0,
-                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilter");
-                      						afterParserOrEnumRuleCall();
-                      					
+                      							if (current==null) {
+                      								current = createModelElementForParent(grammarAccess.getDataInterchangeBeanRule());
+                      							}
+                      							set(
+                      								current,
+                      								"exportFilter",
+                      								lv_exportFilter_39_0,
+                      								"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilter");
+                      							afterParserOrEnumRuleCall();
+                      						
                     }
 
                     }
@@ -4044,11 +4467,11 @@
 
                     }
 
-                    otherlv_38=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+                    otherlv_40=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				newLeafNode(otherlv_38, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_13_3());
-                      			
+                      					newLeafNode(otherlv_40, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_6_3());
+                      				
                     }
 
                     }
@@ -4062,6 +4485,9 @@
 
             }
 
+
+            }
+
             if ( state.backtracking==0 ) {
 
               	leaveRule();
@@ -4081,7 +4507,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeKey"
-    // InternalDataDSL.g:1529:1: entryRuleDataInterchangeKey returns [EObject current=null] : iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF ;
+    // InternalDataDSL.g:1687:1: entryRuleDataInterchangeKey returns [EObject current=null] : iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF ;
     public final EObject entryRuleDataInterchangeKey() throws RecognitionException {
         EObject current = null;
 
@@ -4089,8 +4515,8 @@
 
 
         try {
-            // InternalDataDSL.g:1529:59: (iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF )
-            // InternalDataDSL.g:1530:2: iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF
+            // InternalDataDSL.g:1687:59: (iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF )
+            // InternalDataDSL.g:1688:2: iv_ruleDataInterchangeKey= ruleDataInterchangeKey EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeKeyRule()); 
@@ -4121,7 +4547,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeKey"
-    // InternalDataDSL.g:1536:1: ruleDataInterchangeKey returns [EObject current=null] : ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) ) ;
+    // InternalDataDSL.g:1694:1: ruleDataInterchangeKey returns [EObject current=null] : ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) ) ;
     public final EObject ruleDataInterchangeKey() throws RecognitionException {
         EObject current = null;
 
@@ -4132,14 +4558,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1542:2: ( ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) ) )
-            // InternalDataDSL.g:1543:2: ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) )
+            // InternalDataDSL.g:1700:2: ( ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) ) )
+            // InternalDataDSL.g:1701:2: ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) )
             {
-            // InternalDataDSL.g:1543:2: ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) )
-            // InternalDataDSL.g:1544:3: () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:1701:2: ( () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) ) )
+            // InternalDataDSL.g:1702:3: () otherlv_1= 'key' ( (otherlv_2= RULE_ID ) )
             {
-            // InternalDataDSL.g:1544:3: ()
-            // InternalDataDSL.g:1545:4: 
+            // InternalDataDSL.g:1702:3: ()
+            // InternalDataDSL.g:1703:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4151,17 +4577,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,49,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,51,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeKeyAccess().getKeyKeyword_1());
               		
             }
-            // InternalDataDSL.g:1555:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:1556:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:1713:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:1714:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:1556:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:1557:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:1714:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:1715:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4207,7 +4633,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeLookup"
-    // InternalDataDSL.g:1572:1: entryRuleDataInterchangeLookup returns [EObject current=null] : iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF ;
+    // InternalDataDSL.g:1730:1: entryRuleDataInterchangeLookup returns [EObject current=null] : iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF ;
     public final EObject entryRuleDataInterchangeLookup() throws RecognitionException {
         EObject current = null;
 
@@ -4215,8 +4641,8 @@
 
 
         try {
-            // InternalDataDSL.g:1572:62: (iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF )
-            // InternalDataDSL.g:1573:2: iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF
+            // InternalDataDSL.g:1730:62: (iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF )
+            // InternalDataDSL.g:1731:2: iv_ruleDataInterchangeLookup= ruleDataInterchangeLookup EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeLookupRule()); 
@@ -4247,7 +4673,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeLookup"
-    // InternalDataDSL.g:1579:1: ruleDataInterchangeLookup returns [EObject current=null] : ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? otherlv_7= 'with' ( (otherlv_8= RULE_ID ) ) ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )? (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) ) ;
+    // InternalDataDSL.g:1737:1: ruleDataInterchangeLookup returns [EObject current=null] : ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'in' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) otherlv_7= 'mapFrom' ( (lv_dataMap_8_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) otherlv_12= 'mapTo' ( (otherlv_13= RULE_ID ) ) ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )? (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )? ) ;
     public final EObject ruleDataInterchangeLookup() throws RecognitionException {
         EObject current = null;
 
@@ -4258,28 +4684,32 @@
         Token otherlv_5=null;
         Token lv_elementMap_6_0=null;
         Token otherlv_7=null;
-        Token otherlv_8=null;
-        Token lv_cached_9_0=null;
-        Token lv_cacheSize_10_0=null;
-        Token otherlv_11=null;
-        Token lv_dataMap_12_0=null;
-        Token lv_allowNoResult_14_0=null;
-        Token lv_allowNonuniqueResult_15_0=null;
-        EObject lv_markerPath_16_0 = null;
+        Token lv_dataMap_8_0=null;
+        Token lv_allowNoResult_10_0=null;
+        Token otherlv_12=null;
+        Token otherlv_13=null;
+        Token lv_cached_14_0=null;
+        Token lv_cacheSize_15_0=null;
+        Token otherlv_16=null;
+        Token otherlv_17=null;
+        Token otherlv_19=null;
+        EObject lv_markerPath_11_0 = null;
+
+        EObject lv_condition_18_0 = null;
 
 
 
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1585:2: ( ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? otherlv_7= 'with' ( (otherlv_8= RULE_ID ) ) ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )? (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) ) )
-            // InternalDataDSL.g:1586:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? otherlv_7= 'with' ( (otherlv_8= RULE_ID ) ) ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )? (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:1743:2: ( ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'in' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) otherlv_7= 'mapFrom' ( (lv_dataMap_8_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) otherlv_12= 'mapTo' ( (otherlv_13= RULE_ID ) ) ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )? (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )? ) )
+            // InternalDataDSL.g:1744:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'in' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) otherlv_7= 'mapFrom' ( (lv_dataMap_8_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) otherlv_12= 'mapTo' ( (otherlv_13= RULE_ID ) ) ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )? (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )? )
             {
-            // InternalDataDSL.g:1586:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? otherlv_7= 'with' ( (otherlv_8= RULE_ID ) ) ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )? (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) )
-            // InternalDataDSL.g:1587:3: () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )? otherlv_7= 'with' ( (otherlv_8= RULE_ID ) ) ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )? (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )? ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:1744:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'in' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) otherlv_7= 'mapFrom' ( (lv_dataMap_8_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) otherlv_12= 'mapTo' ( (otherlv_13= RULE_ID ) ) ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )? (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )? )
+            // InternalDataDSL.g:1745:3: () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'in' ( (otherlv_4= RULE_ID ) ) otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) otherlv_7= 'mapFrom' ( (lv_dataMap_8_0= RULE_STRING ) ) ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) ) otherlv_12= 'mapTo' ( (otherlv_13= RULE_ID ) ) ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )? (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )?
             {
-            // InternalDataDSL.g:1587:3: ()
-            // InternalDataDSL.g:1588:4: 
+            // InternalDataDSL.g:1745:3: ()
+            // InternalDataDSL.g:1746:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4291,17 +4721,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,50,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,52,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeLookupAccess().getForKeyword_1());
               		
             }
-            // InternalDataDSL.g:1598:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:1599:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:1756:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:1757:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:1599:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:1600:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:1757:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:1758:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4310,7 +4740,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_42); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_44); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeLookupAccess().getTargetPropertyLEntityReferenceCrossReference_2_0());
@@ -4322,17 +4752,17 @@
 
             }
 
-            otherlv_3=(Token)match(input,51,FOLLOW_4); if (state.failed) return current;
+            otherlv_3=(Token)match(input,53,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeLookupAccess().getOnKeyword_3());
+              			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeLookupAccess().getInKeyword_3());
               		
             }
-            // InternalDataDSL.g:1615:3: ( (otherlv_4= RULE_ID ) )
-            // InternalDataDSL.g:1616:4: (otherlv_4= RULE_ID )
+            // InternalDataDSL.g:1773:3: ( (otherlv_4= RULE_ID ) )
+            // InternalDataDSL.g:1774:4: (otherlv_4= RULE_ID )
             {
-            // InternalDataDSL.g:1616:4: (otherlv_4= RULE_ID )
-            // InternalDataDSL.g:1617:5: otherlv_4= RULE_ID
+            // InternalDataDSL.g:1774:4: (otherlv_4= RULE_ID )
+            // InternalDataDSL.g:1775:5: otherlv_4= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -4341,7 +4771,7 @@
               					}
               				
             }
-            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_43); if (state.failed) return current;
+            otherlv_4=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_4, grammarAccess.getDataInterchangeLookupAccess().getEntityLEntityCrossReference_4_0());
@@ -4353,82 +4783,70 @@
 
             }
 
-            // InternalDataDSL.g:1628:3: (otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) ) )?
-            int alt35=2;
-            int LA35_0 = input.LA(1);
-
-            if ( (LA35_0==39) ) {
-                alt35=1;
-            }
-            switch (alt35) {
-                case 1 :
-                    // InternalDataDSL.g:1629:4: otherlv_5= 'createOn' ( (lv_elementMap_6_0= RULE_STRING ) )
-                    {
-                    otherlv_5=(Token)match(input,39,FOLLOW_9); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5_0());
-                      			
-                    }
-                    // InternalDataDSL.g:1633:4: ( (lv_elementMap_6_0= RULE_STRING ) )
-                    // InternalDataDSL.g:1634:5: (lv_elementMap_6_0= RULE_STRING )
-                    {
-                    // InternalDataDSL.g:1634:5: (lv_elementMap_6_0= RULE_STRING )
-                    // InternalDataDSL.g:1635:6: lv_elementMap_6_0= RULE_STRING
-                    {
-                    lv_elementMap_6_0=(Token)match(input,RULE_STRING,FOLLOW_44); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      						newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_5_1_0());
-                      					
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      						if (current==null) {
-                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-                      						}
-                      						setWithLastConsumed(
-                      							current,
-                      							"elementMap",
-                      							lv_elementMap_6_0,
-                      							"org.eclipse.xtext.xbase.Xtype.STRING");
-                      					
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            otherlv_7=(Token)match(input,52,FOLLOW_4); if (state.failed) return current;
+            otherlv_5=(Token)match(input,41,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              			newLeafNode(otherlv_7, grammarAccess.getDataInterchangeLookupAccess().getWithKeyword_6());
+              			newLeafNode(otherlv_5, grammarAccess.getDataInterchangeLookupAccess().getCreateOnKeyword_5());
               		
             }
-            // InternalDataDSL.g:1656:3: ( (otherlv_8= RULE_ID ) )
-            // InternalDataDSL.g:1657:4: (otherlv_8= RULE_ID )
+            // InternalDataDSL.g:1790:3: ( (lv_elementMap_6_0= RULE_STRING ) )
+            // InternalDataDSL.g:1791:4: (lv_elementMap_6_0= RULE_STRING )
             {
-            // InternalDataDSL.g:1657:4: (otherlv_8= RULE_ID )
-            // InternalDataDSL.g:1658:5: otherlv_8= RULE_ID
+            // InternalDataDSL.g:1791:4: (lv_elementMap_6_0= RULE_STRING )
+            // InternalDataDSL.g:1792:5: lv_elementMap_6_0= RULE_STRING
             {
+            lv_elementMap_6_0=(Token)match(input,RULE_STRING,FOLLOW_46); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_elementMap_6_0, grammarAccess.getDataInterchangeLookupAccess().getElementMapSTRINGTerminalRuleCall_6_0());
+              				
+            }
             if ( state.backtracking==0 ) {
 
               					if (current==null) {
               						current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
               					}
+              					setWithLastConsumed(
+              						current,
+              						"elementMap",
+              						lv_elementMap_6_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
               				
             }
-            otherlv_8=(Token)match(input,RULE_ID,FOLLOW_45); if (state.failed) return current;
+
+            }
+
+
+            }
+
+            otherlv_7=(Token)match(input,54,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              					newLeafNode(otherlv_8, grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_7_0());
+              			newLeafNode(otherlv_7, grammarAccess.getDataInterchangeLookupAccess().getMapFromKeyword_7());
+              		
+            }
+            // InternalDataDSL.g:1812:3: ( (lv_dataMap_8_0= RULE_STRING ) )
+            // InternalDataDSL.g:1813:4: (lv_dataMap_8_0= RULE_STRING )
+            {
+            // InternalDataDSL.g:1813:4: (lv_dataMap_8_0= RULE_STRING )
+            // InternalDataDSL.g:1814:5: lv_dataMap_8_0= RULE_STRING
+            {
+            lv_dataMap_8_0=(Token)match(input,RULE_STRING,FOLLOW_47); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_dataMap_8_0, grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_8_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"dataMap",
+              						lv_dataMap_8_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
               				
             }
 
@@ -4437,191 +4855,62 @@
 
             }
 
-            // InternalDataDSL.g:1669:3: ( ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) ) )?
-            int alt36=2;
-            int LA36_0 = input.LA(1);
-
-            if ( (LA36_0==53) ) {
-                alt36=1;
-            }
-            switch (alt36) {
-                case 1 :
-                    // InternalDataDSL.g:1670:4: ( (lv_cached_9_0= 'cacheSize' ) ) ( (lv_cacheSize_10_0= RULE_INT ) )
-                    {
-                    // InternalDataDSL.g:1670:4: ( (lv_cached_9_0= 'cacheSize' ) )
-                    // InternalDataDSL.g:1671:5: (lv_cached_9_0= 'cacheSize' )
-                    {
-                    // InternalDataDSL.g:1671:5: (lv_cached_9_0= 'cacheSize' )
-                    // InternalDataDSL.g:1672:6: lv_cached_9_0= 'cacheSize'
-                    {
-                    lv_cached_9_0=(Token)match(input,53,FOLLOW_13); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      						newLeafNode(lv_cached_9_0, grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_8_0_0());
-                      					
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      						if (current==null) {
-                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-                      						}
-                      						setWithLastConsumed(current, "cached", true, "cacheSize");
-                      					
-                    }
-
-                    }
-
-
-                    }
-
-                    // InternalDataDSL.g:1684:4: ( (lv_cacheSize_10_0= RULE_INT ) )
-                    // InternalDataDSL.g:1685:5: (lv_cacheSize_10_0= RULE_INT )
-                    {
-                    // InternalDataDSL.g:1685:5: (lv_cacheSize_10_0= RULE_INT )
-                    // InternalDataDSL.g:1686:6: lv_cacheSize_10_0= RULE_INT
-                    {
-                    lv_cacheSize_10_0=(Token)match(input,RULE_INT,FOLLOW_46); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      						newLeafNode(lv_cacheSize_10_0, grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_8_1_0());
-                      					
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      						if (current==null) {
-                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-                      						}
-                      						setWithLastConsumed(
-                      							current,
-                      							"cacheSize",
-                      							lv_cacheSize_10_0,
-                      							"org.eclipse.xtext.xbase.Xbase.INT");
-                      					
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // InternalDataDSL.g:1703:3: (otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) ) )?
-            int alt37=2;
-            int LA37_0 = input.LA(1);
-
-            if ( (LA37_0==54) ) {
-                alt37=1;
-            }
-            switch (alt37) {
-                case 1 :
-                    // InternalDataDSL.g:1704:4: otherlv_11= 'mapTo' ( (lv_dataMap_12_0= RULE_STRING ) )
-                    {
-                    otherlv_11=(Token)match(input,54,FOLLOW_9); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      				newLeafNode(otherlv_11, grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_9_0());
-                      			
-                    }
-                    // InternalDataDSL.g:1708:4: ( (lv_dataMap_12_0= RULE_STRING ) )
-                    // InternalDataDSL.g:1709:5: (lv_dataMap_12_0= RULE_STRING )
-                    {
-                    // InternalDataDSL.g:1709:5: (lv_dataMap_12_0= RULE_STRING )
-                    // InternalDataDSL.g:1710:6: lv_dataMap_12_0= RULE_STRING
-                    {
-                    lv_dataMap_12_0=(Token)match(input,RULE_STRING,FOLLOW_47); if (state.failed) return current;
-                    if ( state.backtracking==0 ) {
-
-                      						newLeafNode(lv_dataMap_12_0, grammarAccess.getDataInterchangeLookupAccess().getDataMapSTRINGTerminalRuleCall_9_1_0());
-                      					
-                    }
-                    if ( state.backtracking==0 ) {
-
-                      						if (current==null) {
-                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-                      						}
-                      						setWithLastConsumed(
-                      							current,
-                      							"dataMap",
-                      							lv_dataMap_12_0,
-                      							"org.eclipse.xtext.xbase.Xtype.STRING");
-                      					
-                    }
-
-                    }
-
-
-                    }
-
-
-                    }
-                    break;
-
-            }
-
-            // InternalDataDSL.g:1727:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) )
-            // InternalDataDSL.g:1728:4: ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:1830:3: ( ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:1831:4: ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) )
             {
-            // InternalDataDSL.g:1728:4: ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) )
-            // InternalDataDSL.g:1729:5: ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* )
+            // InternalDataDSL.g:1831:4: ( ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:1832:5: ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* )
             {
-            getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-            // InternalDataDSL.g:1732:5: ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* )
-            // InternalDataDSL.g:1733:6: ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )*
+            getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+            // InternalDataDSL.g:1835:5: ( ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )* )
+            // InternalDataDSL.g:1836:6: ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )*
             {
-            // InternalDataDSL.g:1733:6: ( ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )*
-            loop38:
+            // InternalDataDSL.g:1836:6: ( ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) ) | ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) ) )*
+            loop37:
             do {
-                int alt38=4;
-                int LA38_0 = input.LA(1);
+                int alt37=3;
+                int LA37_0 = input.LA(1);
 
-                if ( LA38_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
-                    alt38=1;
+                if ( LA37_0 == 55 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
+                    alt37=1;
                 }
-                else if ( LA38_0 == 56 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
-                    alt38=2;
-                }
-                else if ( LA38_0 == 57 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-                    alt38=3;
+                else if ( LA37_0 == 59 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
+                    alt37=2;
                 }
 
 
-                switch (alt38) {
+                switch (alt37) {
             	case 1 :
-            	    // InternalDataDSL.g:1734:4: ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) )
+            	    // InternalDataDSL.g:1837:4: ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:1734:4: ({...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) ) )
-            	    // InternalDataDSL.g:1735:5: {...}? => ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) )
+            	    // InternalDataDSL.g:1837:4: ({...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) ) )
+            	    // InternalDataDSL.g:1838:5: {...}? => ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) )
             	    {
-            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0) ) {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
-            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0)");
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0)");
             	    }
-            	    // InternalDataDSL.g:1735:119: ( ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) ) )
-            	    // InternalDataDSL.g:1736:6: ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) )
+            	    // InternalDataDSL.g:1838:118: ( ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) ) )
+            	    // InternalDataDSL.g:1839:6: ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) )
             	    {
-            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 0);
-            	    // InternalDataDSL.g:1739:9: ({...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) ) )
-            	    // InternalDataDSL.g:1739:10: {...}? => ( (lv_allowNoResult_14_0= 'allowNoResult' ) )
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 0);
+            	    // InternalDataDSL.g:1842:9: ({...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) ) )
+            	    // InternalDataDSL.g:1842:10: {...}? => ( (lv_allowNoResult_10_0= 'allowNoResult' ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "true");
             	    }
-            	    // InternalDataDSL.g:1739:19: ( (lv_allowNoResult_14_0= 'allowNoResult' ) )
-            	    // InternalDataDSL.g:1739:20: (lv_allowNoResult_14_0= 'allowNoResult' )
+            	    // InternalDataDSL.g:1842:19: ( (lv_allowNoResult_10_0= 'allowNoResult' ) )
+            	    // InternalDataDSL.g:1842:20: (lv_allowNoResult_10_0= 'allowNoResult' )
             	    {
-            	    // InternalDataDSL.g:1739:20: (lv_allowNoResult_14_0= 'allowNoResult' )
-            	    // InternalDataDSL.g:1740:10: lv_allowNoResult_14_0= 'allowNoResult'
+            	    // InternalDataDSL.g:1842:20: (lv_allowNoResult_10_0= 'allowNoResult' )
+            	    // InternalDataDSL.g:1843:10: lv_allowNoResult_10_0= 'allowNoResult'
             	    {
-            	    lv_allowNoResult_14_0=(Token)match(input,55,FOLLOW_47); if (state.failed) return current;
+            	    lv_allowNoResult_10_0=(Token)match(input,55,FOLLOW_47); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
-            	      										newLeafNode(lv_allowNoResult_14_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_10_0_0());
+            	      										newLeafNode(lv_allowNoResult_10_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNoResultAllowNoResultKeyword_9_0_0());
             	      									
             	    }
             	    if ( state.backtracking==0 ) {
@@ -4641,7 +4930,7 @@
 
             	    }
 
-            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
 
             	    }
 
@@ -4652,99 +4941,39 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:1757:4: ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) )
+            	    // InternalDataDSL.g:1860:4: ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) )
             	    {
-            	    // InternalDataDSL.g:1757:4: ({...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) ) )
-            	    // InternalDataDSL.g:1758:5: {...}? => ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) )
+            	    // InternalDataDSL.g:1860:4: ({...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) ) )
+            	    // InternalDataDSL.g:1861:5: {...}? => ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) )
             	    {
-            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1) ) {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
-            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1)");
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1)");
             	    }
-            	    // InternalDataDSL.g:1758:119: ( ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) ) )
-            	    // InternalDataDSL.g:1759:6: ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) )
+            	    // InternalDataDSL.g:1861:118: ( ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) ) )
+            	    // InternalDataDSL.g:1862:6: ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) )
             	    {
-            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 1);
-            	    // InternalDataDSL.g:1762:9: ({...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) ) )
-            	    // InternalDataDSL.g:1762:10: {...}? => ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) )
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9(), 1);
+            	    // InternalDataDSL.g:1865:9: ({...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) ) )
+            	    // InternalDataDSL.g:1865:10: {...}? => ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) )
             	    {
             	    if ( !((true)) ) {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "true");
             	    }
-            	    // InternalDataDSL.g:1762:19: ( (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' ) )
-            	    // InternalDataDSL.g:1762:20: (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' )
+            	    // InternalDataDSL.g:1865:19: ( (lv_markerPath_11_0= ruleDataInterchangeMarkerPath ) )
+            	    // InternalDataDSL.g:1865:20: (lv_markerPath_11_0= ruleDataInterchangeMarkerPath )
             	    {
-            	    // InternalDataDSL.g:1762:20: (lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult' )
-            	    // InternalDataDSL.g:1763:10: lv_allowNonuniqueResult_15_0= 'allowNonuniqueResult'
-            	    {
-            	    lv_allowNonuniqueResult_15_0=(Token)match(input,56,FOLLOW_47); if (state.failed) return current;
-            	    if ( state.backtracking==0 ) {
-
-            	      										newLeafNode(lv_allowNonuniqueResult_15_0, grammarAccess.getDataInterchangeLookupAccess().getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0());
-            	      									
-            	    }
-            	    if ( state.backtracking==0 ) {
-
-            	      										if (current==null) {
-            	      											current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
-            	      										}
-            	      										setWithLastConsumed(current, "allowNonuniqueResult", true, "allowNonuniqueResult");
-            	      									
-            	    }
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-
-            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
-
-            	    }
-
-
-            	    }
-
-
-            	    }
-            	    break;
-            	case 3 :
-            	    // InternalDataDSL.g:1780:4: ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) )
-            	    {
-            	    // InternalDataDSL.g:1780:4: ({...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) ) )
-            	    // InternalDataDSL.g:1781:5: {...}? => ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) )
-            	    {
-            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2) ) {
-            	        if (state.backtracking>0) {state.failed=true; return current;}
-            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2)");
-            	    }
-            	    // InternalDataDSL.g:1781:119: ( ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) ) )
-            	    // InternalDataDSL.g:1782:6: ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) )
-            	    {
-            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10(), 2);
-            	    // InternalDataDSL.g:1785:9: ({...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) ) )
-            	    // InternalDataDSL.g:1785:10: {...}? => ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) )
-            	    {
-            	    if ( !((true)) ) {
-            	        if (state.backtracking>0) {state.failed=true; return current;}
-            	        throw new FailedPredicateException(input, "ruleDataInterchangeLookup", "true");
-            	    }
-            	    // InternalDataDSL.g:1785:19: ( (lv_markerPath_16_0= ruleDataInterchangeMarkerPath ) )
-            	    // InternalDataDSL.g:1785:20: (lv_markerPath_16_0= ruleDataInterchangeMarkerPath )
-            	    {
-            	    // InternalDataDSL.g:1785:20: (lv_markerPath_16_0= ruleDataInterchangeMarkerPath )
-            	    // InternalDataDSL.g:1786:10: lv_markerPath_16_0= ruleDataInterchangeMarkerPath
+            	    // InternalDataDSL.g:1865:20: (lv_markerPath_11_0= ruleDataInterchangeMarkerPath )
+            	    // InternalDataDSL.g:1866:10: lv_markerPath_11_0= ruleDataInterchangeMarkerPath
             	    {
             	    if ( state.backtracking==0 ) {
 
-            	      										newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0());
+            	      										newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0());
             	      									
             	    }
             	    pushFollow(FOLLOW_47);
-            	    lv_markerPath_16_0=ruleDataInterchangeMarkerPath();
+            	    lv_markerPath_11_0=ruleDataInterchangeMarkerPath();
 
             	    state._fsp--;
             	    if (state.failed) return current;
@@ -4756,7 +4985,7 @@
             	      										set(
             	      											current,
             	      											"markerPath",
-            	      											lv_markerPath_16_0,
+            	      											lv_markerPath_11_0,
             	      											"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMarkerPath");
             	      										afterParserOrEnumRuleCall();
             	      									
@@ -4770,7 +4999,7 @@
 
             	    }
 
-            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
 
             	    }
 
@@ -4782,7 +5011,7 @@
             	    break;
 
             	default :
-            	    break loop38;
+            	    break loop37;
                 }
             } while (true);
 
@@ -4792,7 +5021,181 @@
 
             }
 
-            getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_10());
+            getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeLookupAccess().getUnorderedGroup_9());
+
+            }
+
+            otherlv_12=(Token)match(input,56,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_12, grammarAccess.getDataInterchangeLookupAccess().getMapToKeyword_10());
+              		
+            }
+            // InternalDataDSL.g:1899:3: ( (otherlv_13= RULE_ID ) )
+            // InternalDataDSL.g:1900:4: (otherlv_13= RULE_ID )
+            {
+            // InternalDataDSL.g:1900:4: (otherlv_13= RULE_ID )
+            // InternalDataDSL.g:1901:5: otherlv_13= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+              					}
+              				
+            }
+            otherlv_13=(Token)match(input,RULE_ID,FOLLOW_48); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_13, grammarAccess.getDataInterchangeLookupAccess().getQueryPropertyLEntityAttributeCrossReference_11_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalDataDSL.g:1912:3: ( ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) ) )?
+            int alt38=2;
+            int LA38_0 = input.LA(1);
+
+            if ( (LA38_0==57) ) {
+                alt38=1;
+            }
+            switch (alt38) {
+                case 1 :
+                    // InternalDataDSL.g:1913:4: ( (lv_cached_14_0= 'cacheSize' ) ) ( (lv_cacheSize_15_0= RULE_INT ) )
+                    {
+                    // InternalDataDSL.g:1913:4: ( (lv_cached_14_0= 'cacheSize' ) )
+                    // InternalDataDSL.g:1914:5: (lv_cached_14_0= 'cacheSize' )
+                    {
+                    // InternalDataDSL.g:1914:5: (lv_cached_14_0= 'cacheSize' )
+                    // InternalDataDSL.g:1915:6: lv_cached_14_0= 'cacheSize'
+                    {
+                    lv_cached_14_0=(Token)match(input,57,FOLLOW_13); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_cached_14_0, grammarAccess.getDataInterchangeLookupAccess().getCachedCacheSizeKeyword_12_0_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+                      						}
+                      						setWithLastConsumed(current, "cached", true, "cacheSize");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalDataDSL.g:1927:4: ( (lv_cacheSize_15_0= RULE_INT ) )
+                    // InternalDataDSL.g:1928:5: (lv_cacheSize_15_0= RULE_INT )
+                    {
+                    // InternalDataDSL.g:1928:5: (lv_cacheSize_15_0= RULE_INT )
+                    // InternalDataDSL.g:1929:6: lv_cacheSize_15_0= RULE_INT
+                    {
+                    lv_cacheSize_15_0=(Token)match(input,RULE_INT,FOLLOW_49); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						newLeafNode(lv_cacheSize_15_0, grammarAccess.getDataInterchangeLookupAccess().getCacheSizeINTTerminalRuleCall_12_1_0());
+                      					
+                    }
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElement(grammarAccess.getDataInterchangeLookupRule());
+                      						}
+                      						setWithLastConsumed(
+                      							current,
+                      							"cacheSize",
+                      							lv_cacheSize_15_0,
+                      							"org.eclipse.xtext.xbase.Xbase.INT");
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalDataDSL.g:1946:3: (otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}' )?
+            int alt39=2;
+            int LA39_0 = input.LA(1);
+
+            if ( (LA39_0==58) ) {
+                alt39=1;
+            }
+            switch (alt39) {
+                case 1 :
+                    // InternalDataDSL.g:1947:4: otherlv_16= 'where' otherlv_17= '{' ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) ) otherlv_19= '}'
+                    {
+                    otherlv_16=(Token)match(input,58,FOLLOW_18); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_16, grammarAccess.getDataInterchangeLookupAccess().getWhereKeyword_13_0());
+                      			
+                    }
+                    otherlv_17=(Token)match(input,14,FOLLOW_4); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_17, grammarAccess.getDataInterchangeLookupAccess().getLeftCurlyBracketKeyword_13_1());
+                      			
+                    }
+                    // InternalDataDSL.g:1955:4: ( (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition ) )
+                    // InternalDataDSL.g:1956:5: (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition )
+                    {
+                    // InternalDataDSL.g:1956:5: (lv_condition_18_0= ruleDataInterchangeLookupFilterCondition )
+                    // InternalDataDSL.g:1957:6: lv_condition_18_0= ruleDataInterchangeLookupFilterCondition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDataInterchangeLookupAccess().getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_43);
+                    lv_condition_18_0=ruleDataInterchangeLookupFilterCondition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDataInterchangeLookupRule());
+                      						}
+                      						set(
+                      							current,
+                      							"condition",
+                      							lv_condition_18_0,
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterCondition");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    otherlv_19=(Token)match(input,15,FOLLOW_2); if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      				newLeafNode(otherlv_19, grammarAccess.getDataInterchangeLookupAccess().getRightCurlyBracketKeyword_13_3());
+                      			
+                    }
+
+                    }
+                    break;
 
             }
 
@@ -4821,7 +5224,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMarkerPath"
-    // InternalDataDSL.g:1819:1: entryRuleDataInterchangeMarkerPath returns [EObject current=null] : iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF ;
+    // InternalDataDSL.g:1983:1: entryRuleDataInterchangeMarkerPath returns [EObject current=null] : iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF ;
     public final EObject entryRuleDataInterchangeMarkerPath() throws RecognitionException {
         EObject current = null;
 
@@ -4829,8 +5232,8 @@
 
 
         try {
-            // InternalDataDSL.g:1819:66: (iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF )
-            // InternalDataDSL.g:1820:2: iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF
+            // InternalDataDSL.g:1983:66: (iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF )
+            // InternalDataDSL.g:1984:2: iv_ruleDataInterchangeMarkerPath= ruleDataInterchangeMarkerPath EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeMarkerPathRule()); 
@@ -4861,7 +5264,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeMarkerPath"
-    // InternalDataDSL.g:1826:1: ruleDataInterchangeMarkerPath returns [EObject current=null] : ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' ) ;
+    // InternalDataDSL.g:1990:1: ruleDataInterchangeMarkerPath returns [EObject current=null] : ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' ) ;
     public final EObject ruleDataInterchangeMarkerPath() throws RecognitionException {
         EObject current = null;
 
@@ -4875,14 +5278,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1832:2: ( ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' ) )
-            // InternalDataDSL.g:1833:2: ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' )
+            // InternalDataDSL.g:1996:2: ( ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' ) )
+            // InternalDataDSL.g:1997:2: ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' )
             {
-            // InternalDataDSL.g:1833:2: ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' )
-            // InternalDataDSL.g:1834:3: () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}'
+            // InternalDataDSL.g:1997:2: ( () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}' )
+            // InternalDataDSL.g:1998:3: () otherlv_1= 'markerPath' otherlv_2= '{' ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )* otherlv_4= '}'
             {
-            // InternalDataDSL.g:1834:3: ()
-            // InternalDataDSL.g:1835:4: 
+            // InternalDataDSL.g:1998:3: ()
+            // InternalDataDSL.g:1999:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -4894,42 +5297,42 @@
 
             }
 
-            otherlv_1=(Token)match(input,57,FOLLOW_18); if (state.failed) return current;
+            otherlv_1=(Token)match(input,59,FOLLOW_18); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeMarkerPathAccess().getMarkerPathKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_48); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_50); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getDataInterchangeMarkerPathAccess().getLeftCurlyBracketKeyword_2());
               		
             }
-            // InternalDataDSL.g:1849:3: ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )*
-            loop39:
+            // InternalDataDSL.g:2013:3: ( (lv_path_3_0= ruleDataInterchangeMarkerEntity ) )*
+            loop40:
             do {
-                int alt39=2;
-                int LA39_0 = input.LA(1);
+                int alt40=2;
+                int LA40_0 = input.LA(1);
 
-                if ( (LA39_0==58) ) {
-                    alt39=1;
+                if ( (LA40_0==60) ) {
+                    alt40=1;
                 }
 
 
-                switch (alt39) {
+                switch (alt40) {
             	case 1 :
-            	    // InternalDataDSL.g:1850:4: (lv_path_3_0= ruleDataInterchangeMarkerEntity )
+            	    // InternalDataDSL.g:2014:4: (lv_path_3_0= ruleDataInterchangeMarkerEntity )
             	    {
-            	    // InternalDataDSL.g:1850:4: (lv_path_3_0= ruleDataInterchangeMarkerEntity )
-            	    // InternalDataDSL.g:1851:5: lv_path_3_0= ruleDataInterchangeMarkerEntity
+            	    // InternalDataDSL.g:2014:4: (lv_path_3_0= ruleDataInterchangeMarkerEntity )
+            	    // InternalDataDSL.g:2015:5: lv_path_3_0= ruleDataInterchangeMarkerEntity
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      					newCompositeNode(grammarAccess.getDataInterchangeMarkerPathAccess().getPathDataInterchangeMarkerEntityParserRuleCall_3_0());
             	      				
             	    }
-            	    pushFollow(FOLLOW_48);
+            	    pushFollow(FOLLOW_50);
             	    lv_path_3_0=ruleDataInterchangeMarkerEntity();
 
             	    state._fsp--;
@@ -4955,7 +5358,7 @@
             	    break;
 
             	default :
-            	    break loop39;
+            	    break loop40;
                 }
             } while (true);
 
@@ -4990,7 +5393,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMarkerEntity"
-    // InternalDataDSL.g:1876:1: entryRuleDataInterchangeMarkerEntity returns [EObject current=null] : iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF ;
+    // InternalDataDSL.g:2040:1: entryRuleDataInterchangeMarkerEntity returns [EObject current=null] : iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF ;
     public final EObject entryRuleDataInterchangeMarkerEntity() throws RecognitionException {
         EObject current = null;
 
@@ -4998,8 +5401,8 @@
 
 
         try {
-            // InternalDataDSL.g:1876:68: (iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF )
-            // InternalDataDSL.g:1877:2: iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF
+            // InternalDataDSL.g:2040:68: (iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF )
+            // InternalDataDSL.g:2041:2: iv_ruleDataInterchangeMarkerEntity= ruleDataInterchangeMarkerEntity EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeMarkerEntityRule()); 
@@ -5030,7 +5433,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeMarkerEntity"
-    // InternalDataDSL.g:1883:1: ruleDataInterchangeMarkerEntity returns [EObject current=null] : ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? ) ;
+    // InternalDataDSL.g:2047:1: ruleDataInterchangeMarkerEntity returns [EObject current=null] : ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? ) ;
     public final EObject ruleDataInterchangeMarkerEntity() throws RecognitionException {
         EObject current = null;
 
@@ -5042,14 +5445,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1889:2: ( ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? ) )
-            // InternalDataDSL.g:1890:2: ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? )
+            // InternalDataDSL.g:2053:2: ( ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? ) )
+            // InternalDataDSL.g:2054:2: ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? )
             {
-            // InternalDataDSL.g:1890:2: ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? )
-            // InternalDataDSL.g:1891:3: () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )?
+            // InternalDataDSL.g:2054:2: ( () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )? )
+            // InternalDataDSL.g:2055:3: () otherlv_1= 'markerEntity' ( ( ruleLFQN ) ) ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )?
             {
-            // InternalDataDSL.g:1891:3: ()
-            // InternalDataDSL.g:1892:4: 
+            // InternalDataDSL.g:2055:3: ()
+            // InternalDataDSL.g:2056:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5061,17 +5464,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,58,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,60,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityKeyword_1());
               		
             }
-            // InternalDataDSL.g:1902:3: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:1903:4: ( ruleLFQN )
+            // InternalDataDSL.g:2066:3: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:2067:4: ( ruleLFQN )
             {
-            // InternalDataDSL.g:1903:4: ( ruleLFQN )
-            // InternalDataDSL.g:1904:5: ruleLFQN
+            // InternalDataDSL.g:2067:4: ( ruleLFQN )
+            // InternalDataDSL.g:2068:5: ruleLFQN
             {
             if ( state.backtracking==0 ) {
 
@@ -5085,7 +5488,7 @@
               					newCompositeNode(grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkerEntityLEntityCrossReference_2_0());
               				
             }
-            pushFollow(FOLLOW_49);
+            pushFollow(FOLLOW_51);
             ruleLFQN();
 
             state._fsp--;
@@ -5101,24 +5504,24 @@
 
             }
 
-            // InternalDataDSL.g:1918:3: ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )?
-            int alt40=2;
-            int LA40_0 = input.LA(1);
+            // InternalDataDSL.g:2082:3: ( ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) ) )?
+            int alt41=2;
+            int LA41_0 = input.LA(1);
 
-            if ( (LA40_0==59) ) {
-                alt40=1;
+            if ( (LA41_0==61) ) {
+                alt41=1;
             }
-            switch (alt40) {
+            switch (alt41) {
                 case 1 :
-                    // InternalDataDSL.g:1919:4: ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) )
+                    // InternalDataDSL.g:2083:4: ( (lv_markLatest_3_0= 'markedBy' ) ) ( (otherlv_4= RULE_ID ) )
                     {
-                    // InternalDataDSL.g:1919:4: ( (lv_markLatest_3_0= 'markedBy' ) )
-                    // InternalDataDSL.g:1920:5: (lv_markLatest_3_0= 'markedBy' )
+                    // InternalDataDSL.g:2083:4: ( (lv_markLatest_3_0= 'markedBy' ) )
+                    // InternalDataDSL.g:2084:5: (lv_markLatest_3_0= 'markedBy' )
                     {
-                    // InternalDataDSL.g:1920:5: (lv_markLatest_3_0= 'markedBy' )
-                    // InternalDataDSL.g:1921:6: lv_markLatest_3_0= 'markedBy'
+                    // InternalDataDSL.g:2084:5: (lv_markLatest_3_0= 'markedBy' )
+                    // InternalDataDSL.g:2085:6: lv_markLatest_3_0= 'markedBy'
                     {
-                    lv_markLatest_3_0=(Token)match(input,59,FOLLOW_4); if (state.failed) return current;
+                    lv_markLatest_3_0=(Token)match(input,61,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_markLatest_3_0, grammarAccess.getDataInterchangeMarkerEntityAccess().getMarkLatestMarkedByKeyword_3_0_0());
@@ -5138,11 +5541,11 @@
 
                     }
 
-                    // InternalDataDSL.g:1933:4: ( (otherlv_4= RULE_ID ) )
-                    // InternalDataDSL.g:1934:5: (otherlv_4= RULE_ID )
+                    // InternalDataDSL.g:2097:4: ( (otherlv_4= RULE_ID ) )
+                    // InternalDataDSL.g:2098:5: (otherlv_4= RULE_ID )
                     {
-                    // InternalDataDSL.g:1934:5: (otherlv_4= RULE_ID )
-                    // InternalDataDSL.g:1935:6: otherlv_4= RULE_ID
+                    // InternalDataDSL.g:2098:5: (otherlv_4= RULE_ID )
+                    // InternalDataDSL.g:2099:6: otherlv_4= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -5194,7 +5597,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeFormat"
-    // InternalDataDSL.g:1951:1: entryRuleDataInterchangeFormat returns [EObject current=null] : iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF ;
+    // InternalDataDSL.g:2115:1: entryRuleDataInterchangeFormat returns [EObject current=null] : iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF ;
     public final EObject entryRuleDataInterchangeFormat() throws RecognitionException {
         EObject current = null;
 
@@ -5202,8 +5605,8 @@
 
 
         try {
-            // InternalDataDSL.g:1951:62: (iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF )
-            // InternalDataDSL.g:1952:2: iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF
+            // InternalDataDSL.g:2115:62: (iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF )
+            // InternalDataDSL.g:2116:2: iv_ruleDataInterchangeFormat= ruleDataInterchangeFormat EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeFormatRule()); 
@@ -5234,7 +5637,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeFormat"
-    // InternalDataDSL.g:1958:1: ruleDataInterchangeFormat returns [EObject current=null] : ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) ) ;
+    // InternalDataDSL.g:2122:1: ruleDataInterchangeFormat returns [EObject current=null] : ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) ) ;
     public final EObject ruleDataInterchangeFormat() throws RecognitionException {
         EObject current = null;
 
@@ -5247,14 +5650,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:1964:2: ( ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) ) )
-            // InternalDataDSL.g:1965:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:2128:2: ( ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) ) )
+            // InternalDataDSL.g:2129:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) )
             {
-            // InternalDataDSL.g:1965:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) )
-            // InternalDataDSL.g:1966:3: () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) )
+            // InternalDataDSL.g:2129:2: ( () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:2130:3: () otherlv_1= 'for' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'coding' ( (lv_format_4_0= RULE_STRING ) )
             {
-            // InternalDataDSL.g:1966:3: ()
-            // InternalDataDSL.g:1967:4: 
+            // InternalDataDSL.g:2130:3: ()
+            // InternalDataDSL.g:2131:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5266,17 +5669,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,50,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,52,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFormatAccess().getForKeyword_1());
               		
             }
-            // InternalDataDSL.g:1977:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:1978:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2141:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:2142:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:1978:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:1979:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:2142:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2143:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5285,7 +5688,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_50); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_52); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeFormatAccess().getTargetPropertyLEntityAttributeCrossReference_2_0());
@@ -5297,17 +5700,17 @@
 
             }
 
-            otherlv_3=(Token)match(input,60,FOLLOW_9); if (state.failed) return current;
+            otherlv_3=(Token)match(input,62,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeFormatAccess().getCodingKeyword_3());
               		
             }
-            // InternalDataDSL.g:1994:3: ( (lv_format_4_0= RULE_STRING ) )
-            // InternalDataDSL.g:1995:4: (lv_format_4_0= RULE_STRING )
+            // InternalDataDSL.g:2158:3: ( (lv_format_4_0= RULE_STRING ) )
+            // InternalDataDSL.g:2159:4: (lv_format_4_0= RULE_STRING )
             {
-            // InternalDataDSL.g:1995:4: (lv_format_4_0= RULE_STRING )
-            // InternalDataDSL.g:1996:5: lv_format_4_0= RULE_STRING
+            // InternalDataDSL.g:2159:4: (lv_format_4_0= RULE_STRING )
+            // InternalDataDSL.g:2160:5: lv_format_4_0= RULE_STRING
             {
             lv_format_4_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -5358,7 +5761,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExpression"
-    // InternalDataDSL.g:2016:1: entryRuleDataInterchangeExpression returns [EObject current=null] : iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF ;
+    // InternalDataDSL.g:2180:1: entryRuleDataInterchangeExpression returns [EObject current=null] : iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF ;
     public final EObject entryRuleDataInterchangeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -5366,8 +5769,8 @@
 
 
         try {
-            // InternalDataDSL.g:2016:66: (iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF )
-            // InternalDataDSL.g:2017:2: iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF
+            // InternalDataDSL.g:2180:66: (iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF )
+            // InternalDataDSL.g:2181:2: iv_ruleDataInterchangeExpression= ruleDataInterchangeExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeExpressionRule()); 
@@ -5398,7 +5801,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeExpression"
-    // InternalDataDSL.g:2023:1: ruleDataInterchangeExpression returns [EObject current=null] : (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression ) ;
+    // InternalDataDSL.g:2187:1: ruleDataInterchangeExpression returns [EObject current=null] : (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression ) ;
     public final EObject ruleDataInterchangeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -5411,29 +5814,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2029:2: ( (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression ) )
-            // InternalDataDSL.g:2030:2: (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression )
+            // InternalDataDSL.g:2193:2: ( (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression ) )
+            // InternalDataDSL.g:2194:2: (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression )
             {
-            // InternalDataDSL.g:2030:2: (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression )
-            int alt41=2;
-            int LA41_0 = input.LA(1);
+            // InternalDataDSL.g:2194:2: (this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression | this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression )
+            int alt42=2;
+            int LA42_0 = input.LA(1);
 
-            if ( (LA41_0==61) ) {
-                alt41=1;
+            if ( (LA42_0==63) ) {
+                alt42=1;
             }
-            else if ( (LA41_0==67) ) {
-                alt41=2;
+            else if ( (LA42_0==69) ) {
+                alt42=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 41, 0, input);
+                    new NoViableAltException("", 42, 0, input);
 
                 throw nvae;
             }
-            switch (alt41) {
+            switch (alt42) {
                 case 1 :
-                    // InternalDataDSL.g:2031:3: this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression
+                    // InternalDataDSL.g:2195:3: this_DataInterchangeEntityExpression_0= ruleDataInterchangeEntityExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -5455,7 +5858,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2040:3: this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression
+                    // InternalDataDSL.g:2204:3: this_DataInterchangePredefinedExpression_1= ruleDataInterchangePredefinedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -5501,7 +5904,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeEntityExpression"
-    // InternalDataDSL.g:2052:1: entryRuleDataInterchangeEntityExpression returns [EObject current=null] : iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF ;
+    // InternalDataDSL.g:2216:1: entryRuleDataInterchangeEntityExpression returns [EObject current=null] : iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF ;
     public final EObject entryRuleDataInterchangeEntityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -5509,8 +5912,8 @@
 
 
         try {
-            // InternalDataDSL.g:2052:72: (iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF )
-            // InternalDataDSL.g:2053:2: iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF
+            // InternalDataDSL.g:2216:72: (iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF )
+            // InternalDataDSL.g:2217:2: iv_ruleDataInterchangeEntityExpression= ruleDataInterchangeEntityExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeEntityExpressionRule()); 
@@ -5541,7 +5944,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeEntityExpression"
-    // InternalDataDSL.g:2059:1: ruleDataInterchangeEntityExpression returns [EObject current=null] : ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) ) ;
+    // InternalDataDSL.g:2223:1: ruleDataInterchangeEntityExpression returns [EObject current=null] : ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) ) ;
     public final EObject ruleDataInterchangeEntityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -5555,14 +5958,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2065:2: ( ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) ) )
-            // InternalDataDSL.g:2066:2: ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) )
+            // InternalDataDSL.g:2229:2: ( ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) ) )
+            // InternalDataDSL.g:2230:2: ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) )
             {
-            // InternalDataDSL.g:2066:2: ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) )
-            // InternalDataDSL.g:2067:3: () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) )
+            // InternalDataDSL.g:2230:2: ( () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) ) )
+            // InternalDataDSL.g:2231:3: () otherlv_1= 'copy' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'from' ( ( ruleLFQN ) ) otherlv_5= 'property' ( (otherlv_6= RULE_ID ) )
             {
-            // InternalDataDSL.g:2067:3: ()
-            // InternalDataDSL.g:2068:4: 
+            // InternalDataDSL.g:2231:3: ()
+            // InternalDataDSL.g:2232:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5574,17 +5977,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,61,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,63,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeEntityExpressionAccess().getCopyKeyword_1());
               		
             }
-            // InternalDataDSL.g:2078:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:2079:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2242:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:2243:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:2079:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:2080:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:2243:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2244:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5593,7 +5996,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_51); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_53); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeEntityExpressionAccess().getTargetPropertyLEntityAttributeCrossReference_2_0());
@@ -5605,17 +6008,17 @@
 
             }
 
-            otherlv_3=(Token)match(input,62,FOLLOW_4); if (state.failed) return current;
+            otherlv_3=(Token)match(input,64,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeEntityExpressionAccess().getFromKeyword_3());
               		
             }
-            // InternalDataDSL.g:2095:3: ( ( ruleLFQN ) )
-            // InternalDataDSL.g:2096:4: ( ruleLFQN )
+            // InternalDataDSL.g:2259:3: ( ( ruleLFQN ) )
+            // InternalDataDSL.g:2260:4: ( ruleLFQN )
             {
-            // InternalDataDSL.g:2096:4: ( ruleLFQN )
-            // InternalDataDSL.g:2097:5: ruleLFQN
+            // InternalDataDSL.g:2260:4: ( ruleLFQN )
+            // InternalDataDSL.g:2261:5: ruleLFQN
             {
             if ( state.backtracking==0 ) {
 
@@ -5629,7 +6032,7 @@
               					newCompositeNode(grammarAccess.getDataInterchangeEntityExpressionAccess().getEntityLEntityCrossReference_4_0());
               				
             }
-            pushFollow(FOLLOW_52);
+            pushFollow(FOLLOW_54);
             ruleLFQN();
 
             state._fsp--;
@@ -5645,17 +6048,17 @@
 
             }
 
-            otherlv_5=(Token)match(input,63,FOLLOW_4); if (state.failed) return current;
+            otherlv_5=(Token)match(input,65,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_5, grammarAccess.getDataInterchangeEntityExpressionAccess().getPropertyKeyword_5());
               		
             }
-            // InternalDataDSL.g:2115:3: ( (otherlv_6= RULE_ID ) )
-            // InternalDataDSL.g:2116:4: (otherlv_6= RULE_ID )
+            // InternalDataDSL.g:2279:3: ( (otherlv_6= RULE_ID ) )
+            // InternalDataDSL.g:2280:4: (otherlv_6= RULE_ID )
             {
-            // InternalDataDSL.g:2116:4: (otherlv_6= RULE_ID )
-            // InternalDataDSL.g:2117:5: otherlv_6= RULE_ID
+            // InternalDataDSL.g:2280:4: (otherlv_6= RULE_ID )
+            // InternalDataDSL.g:2281:5: otherlv_6= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5701,7 +6104,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExpose"
-    // InternalDataDSL.g:2132:1: entryRuleDataInterchangeExpose returns [EObject current=null] : iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF ;
+    // InternalDataDSL.g:2296:1: entryRuleDataInterchangeExpose returns [EObject current=null] : iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF ;
     public final EObject entryRuleDataInterchangeExpose() throws RecognitionException {
         EObject current = null;
 
@@ -5709,8 +6112,8 @@
 
 
         try {
-            // InternalDataDSL.g:2132:62: (iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF )
-            // InternalDataDSL.g:2133:2: iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF
+            // InternalDataDSL.g:2296:62: (iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF )
+            // InternalDataDSL.g:2297:2: iv_ruleDataInterchangeExpose= ruleDataInterchangeExpose EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeExposeRule()); 
@@ -5741,7 +6144,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeExpose"
-    // InternalDataDSL.g:2139:1: ruleDataInterchangeExpose returns [EObject current=null] : ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) ) ;
+    // InternalDataDSL.g:2303:1: ruleDataInterchangeExpose returns [EObject current=null] : ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) ) ;
     public final EObject ruleDataInterchangeExpose() throws RecognitionException {
         EObject current = null;
 
@@ -5759,14 +6162,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2145:2: ( ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) ) )
-            // InternalDataDSL.g:2146:2: ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) )
+            // InternalDataDSL.g:2309:2: ( ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) ) )
+            // InternalDataDSL.g:2310:2: ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) )
             {
-            // InternalDataDSL.g:2146:2: ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) )
-            // InternalDataDSL.g:2147:3: () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) )
+            // InternalDataDSL.g:2310:2: ( () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) ) )
+            // InternalDataDSL.g:2311:3: () otherlv_1= 'ref' ( (otherlv_2= RULE_ID ) ) ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) )
             {
-            // InternalDataDSL.g:2147:3: ()
-            // InternalDataDSL.g:2148:4: 
+            // InternalDataDSL.g:2311:3: ()
+            // InternalDataDSL.g:2312:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -5778,17 +6181,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,64,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,66,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeExposeAccess().getRefKeyword_1());
               		
             }
-            // InternalDataDSL.g:2158:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:2159:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2322:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:2323:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:2159:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:2160:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:2323:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2324:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -5797,7 +6200,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_53); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_55); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeExposeAccess().getRefEntityLEntityReferenceCrossReference_2_0());
@@ -5809,41 +6212,41 @@
 
             }
 
-            // InternalDataDSL.g:2171:3: ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) )
-            int alt42=2;
-            int LA42_0 = input.LA(1);
+            // InternalDataDSL.g:2335:3: ( (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) ) | (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' ) )
+            int alt43=2;
+            int LA43_0 = input.LA(1);
 
-            if ( (LA42_0==51) ) {
-                alt42=1;
+            if ( (LA43_0==67) ) {
+                alt43=1;
             }
-            else if ( (LA42_0==45) ) {
-                alt42=2;
+            else if ( (LA43_0==47) ) {
+                alt43=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 42, 0, input);
+                    new NoViableAltException("", 43, 0, input);
 
                 throw nvae;
             }
-            switch (alt42) {
+            switch (alt43) {
                 case 1 :
-                    // InternalDataDSL.g:2172:4: (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) )
+                    // InternalDataDSL.g:2336:4: (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) )
                     {
-                    // InternalDataDSL.g:2172:4: (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) )
-                    // InternalDataDSL.g:2173:5: otherlv_3= 'on' ( (otherlv_4= RULE_ID ) )
+                    // InternalDataDSL.g:2336:4: (otherlv_3= 'on' ( (otherlv_4= RULE_ID ) ) )
+                    // InternalDataDSL.g:2337:5: otherlv_3= 'on' ( (otherlv_4= RULE_ID ) )
                     {
-                    otherlv_3=(Token)match(input,51,FOLLOW_4); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,67,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_3, grammarAccess.getDataInterchangeExposeAccess().getOnKeyword_3_0_0());
                       				
                     }
-                    // InternalDataDSL.g:2177:5: ( (otherlv_4= RULE_ID ) )
-                    // InternalDataDSL.g:2178:6: (otherlv_4= RULE_ID )
+                    // InternalDataDSL.g:2341:5: ( (otherlv_4= RULE_ID ) )
+                    // InternalDataDSL.g:2342:6: (otherlv_4= RULE_ID )
                     {
-                    // InternalDataDSL.g:2178:6: (otherlv_4= RULE_ID )
-                    // InternalDataDSL.g:2179:7: otherlv_4= RULE_ID
+                    // InternalDataDSL.g:2342:6: (otherlv_4= RULE_ID )
+                    // InternalDataDSL.g:2343:7: otherlv_4= RULE_ID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -5871,35 +6274,35 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2192:4: (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' )
+                    // InternalDataDSL.g:2356:4: (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' )
                     {
-                    // InternalDataDSL.g:2192:4: (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' )
-                    // InternalDataDSL.g:2193:5: otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}'
+                    // InternalDataDSL.g:2356:4: (otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}' )
+                    // InternalDataDSL.g:2357:5: otherlv_5= 'expose' otherlv_6= '{' ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) ) otherlv_8= '}'
                     {
-                    otherlv_5=(Token)match(input,45,FOLLOW_18); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,47,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_5, grammarAccess.getDataInterchangeExposeAccess().getExposeKeyword_3_1_0());
                       				
                     }
-                    otherlv_6=(Token)match(input,14,FOLLOW_54); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,14,FOLLOW_56); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_6, grammarAccess.getDataInterchangeExposeAccess().getLeftCurlyBracketKeyword_3_1_1());
                       				
                     }
-                    // InternalDataDSL.g:2201:5: ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) )
-                    // InternalDataDSL.g:2202:6: (lv_subExpose_7_0= ruleDataInterchangeExpose )
+                    // InternalDataDSL.g:2365:5: ( (lv_subExpose_7_0= ruleDataInterchangeExpose ) )
+                    // InternalDataDSL.g:2366:6: (lv_subExpose_7_0= ruleDataInterchangeExpose )
                     {
-                    // InternalDataDSL.g:2202:6: (lv_subExpose_7_0= ruleDataInterchangeExpose )
-                    // InternalDataDSL.g:2203:7: lv_subExpose_7_0= ruleDataInterchangeExpose
+                    // InternalDataDSL.g:2366:6: (lv_subExpose_7_0= ruleDataInterchangeExpose )
+                    // InternalDataDSL.g:2367:7: lv_subExpose_7_0= ruleDataInterchangeExpose
                     {
                     if ( state.backtracking==0 ) {
 
                       							newCompositeNode(grammarAccess.getDataInterchangeExposeAccess().getSubExposeDataInterchangeExposeParserRuleCall_3_1_2_0());
                       						
                     }
-                    pushFollow(FOLLOW_41);
+                    pushFollow(FOLLOW_43);
                     lv_subExpose_7_0=ruleDataInterchangeExpose();
 
                     state._fsp--;
@@ -5963,7 +6366,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeExportFilter"
-    // InternalDataDSL.g:2230:1: entryRuleDataInterchangeExportFilter returns [EObject current=null] : iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF ;
+    // InternalDataDSL.g:2394:1: entryRuleDataInterchangeExportFilter returns [EObject current=null] : iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF ;
     public final EObject entryRuleDataInterchangeExportFilter() throws RecognitionException {
         EObject current = null;
 
@@ -5971,8 +6374,8 @@
 
 
         try {
-            // InternalDataDSL.g:2230:68: (iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF )
-            // InternalDataDSL.g:2231:2: iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF
+            // InternalDataDSL.g:2394:68: (iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF )
+            // InternalDataDSL.g:2395:2: iv_ruleDataInterchangeExportFilter= ruleDataInterchangeExportFilter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeExportFilterRule()); 
@@ -6003,7 +6406,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeExportFilter"
-    // InternalDataDSL.g:2237:1: ruleDataInterchangeExportFilter returns [EObject current=null] : ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? ) ;
+    // InternalDataDSL.g:2401:1: ruleDataInterchangeExportFilter returns [EObject current=null] : ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? ) ;
     public final EObject ruleDataInterchangeExportFilter() throws RecognitionException {
         EObject current = null;
 
@@ -6020,14 +6423,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2243:2: ( ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? ) )
-            // InternalDataDSL.g:2244:2: ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? )
+            // InternalDataDSL.g:2407:2: ( ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? ) )
+            // InternalDataDSL.g:2408:2: ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? )
             {
-            // InternalDataDSL.g:2244:2: ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? )
-            // InternalDataDSL.g:2245:3: () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )?
+            // InternalDataDSL.g:2408:2: ( () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )? )
+            // InternalDataDSL.g:2409:3: () (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )? (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )?
             {
-            // InternalDataDSL.g:2245:3: ()
-            // InternalDataDSL.g:2246:4: 
+            // InternalDataDSL.g:2409:3: ()
+            // InternalDataDSL.g:2410:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -6039,18 +6442,18 @@
 
             }
 
-            // InternalDataDSL.g:2252:3: (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}' )?
-            int alt43=2;
-            int LA43_0 = input.LA(1);
+            // InternalDataDSL.g:2416:3: (otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}' )?
+            int alt44=2;
+            int LA44_0 = input.LA(1);
 
-            if ( (LA43_0==65) ) {
-                alt43=1;
+            if ( (LA44_0==58) ) {
+                alt44=1;
             }
-            switch (alt43) {
+            switch (alt44) {
                 case 1 :
-                    // InternalDataDSL.g:2253:4: otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) ) otherlv_4= '}'
+                    // InternalDataDSL.g:2417:4: otherlv_1= 'where' otherlv_2= '{' ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) ) otherlv_4= '}'
                     {
-                    otherlv_1=(Token)match(input,65,FOLLOW_18); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,58,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_1, grammarAccess.getDataInterchangeExportFilterAccess().getWhereKeyword_1_0());
@@ -6062,19 +6465,19 @@
                       				newLeafNode(otherlv_2, grammarAccess.getDataInterchangeExportFilterAccess().getLeftCurlyBracketKeyword_1_1());
                       			
                     }
-                    // InternalDataDSL.g:2261:4: ( (lv_condition_3_0= ruleDataInterchangeFilterCondition ) )
-                    // InternalDataDSL.g:2262:5: (lv_condition_3_0= ruleDataInterchangeFilterCondition )
+                    // InternalDataDSL.g:2425:4: ( (lv_condition_3_0= ruleDataInterchangeExportFilterCondition ) )
+                    // InternalDataDSL.g:2426:5: (lv_condition_3_0= ruleDataInterchangeExportFilterCondition )
                     {
-                    // InternalDataDSL.g:2262:5: (lv_condition_3_0= ruleDataInterchangeFilterCondition )
-                    // InternalDataDSL.g:2263:6: lv_condition_3_0= ruleDataInterchangeFilterCondition
+                    // InternalDataDSL.g:2426:5: (lv_condition_3_0= ruleDataInterchangeExportFilterCondition )
+                    // InternalDataDSL.g:2427:6: lv_condition_3_0= ruleDataInterchangeExportFilterCondition
                     {
                     if ( state.backtracking==0 ) {
 
-                      						newCompositeNode(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0());
+                      						newCompositeNode(grammarAccess.getDataInterchangeExportFilterAccess().getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0());
                       					
                     }
-                    pushFollow(FOLLOW_41);
-                    lv_condition_3_0=ruleDataInterchangeFilterCondition();
+                    pushFollow(FOLLOW_43);
+                    lv_condition_3_0=ruleDataInterchangeExportFilterCondition();
 
                     state._fsp--;
                     if (state.failed) return current;
@@ -6087,7 +6490,7 @@
                       							current,
                       							"condition",
                       							lv_condition_3_0,
-                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFilterCondition");
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilterCondition");
                       						afterParserOrEnumRuleCall();
                       					
                     }
@@ -6097,7 +6500,7 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,15,FOLLOW_55); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,15,FOLLOW_57); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_4, grammarAccess.getDataInterchangeExportFilterAccess().getRightCurlyBracketKeyword_1_3());
@@ -6109,47 +6512,47 @@
 
             }
 
-            // InternalDataDSL.g:2285:3: (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )?
-            int alt45=2;
-            int LA45_0 = input.LA(1);
+            // InternalDataDSL.g:2449:3: (otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )* )?
+            int alt46=2;
+            int LA46_0 = input.LA(1);
 
-            if ( (LA45_0==66) ) {
-                alt45=1;
+            if ( (LA46_0==68) ) {
+                alt46=1;
             }
-            switch (alt45) {
+            switch (alt46) {
                 case 1 :
-                    // InternalDataDSL.g:2286:4: otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )*
+                    // InternalDataDSL.g:2450:4: otherlv_5= 'hide' ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )*
                     {
-                    otherlv_5=(Token)match(input,66,FOLLOW_56); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,68,FOLLOW_58); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeExportFilterAccess().getHideKeyword_2_0());
                       			
                     }
-                    // InternalDataDSL.g:2290:4: ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )*
-                    loop44:
+                    // InternalDataDSL.g:2454:4: ( (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide ) )*
+                    loop45:
                     do {
-                        int alt44=2;
-                        int LA44_0 = input.LA(1);
+                        int alt45=2;
+                        int LA45_0 = input.LA(1);
 
-                        if ( (LA44_0==RULE_ID) ) {
-                            alt44=1;
+                        if ( (LA45_0==RULE_ID) ) {
+                            alt45=1;
                         }
 
 
-                        switch (alt44) {
+                        switch (alt45) {
                     	case 1 :
-                    	    // InternalDataDSL.g:2291:5: (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide )
+                    	    // InternalDataDSL.g:2455:5: (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide )
                     	    {
-                    	    // InternalDataDSL.g:2291:5: (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide )
-                    	    // InternalDataDSL.g:2292:6: lv_hiddenproperties_6_0= ruleDataInterchangeExportHide
+                    	    // InternalDataDSL.g:2455:5: (lv_hiddenproperties_6_0= ruleDataInterchangeExportHide )
+                    	    // InternalDataDSL.g:2456:6: lv_hiddenproperties_6_0= ruleDataInterchangeExportHide
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      						newCompositeNode(grammarAccess.getDataInterchangeExportFilterAccess().getHiddenpropertiesDataInterchangeExportHideParserRuleCall_2_1_0());
                     	      					
                     	    }
-                    	    pushFollow(FOLLOW_56);
+                    	    pushFollow(FOLLOW_58);
                     	    lv_hiddenproperties_6_0=ruleDataInterchangeExportHide();
 
                     	    state._fsp--;
@@ -6175,7 +6578,7 @@
                     	    break;
 
                     	default :
-                    	    break loop44;
+                    	    break loop45;
                         }
                     } while (true);
 
@@ -6209,28 +6612,28 @@
     // $ANTLR end "ruleDataInterchangeExportFilter"
 
 
-    // $ANTLR start "entryRuleDataInterchangeFilterCondition"
-    // InternalDataDSL.g:2314:1: entryRuleDataInterchangeFilterCondition returns [EObject current=null] : iv_ruleDataInterchangeFilterCondition= ruleDataInterchangeFilterCondition EOF ;
-    public final EObject entryRuleDataInterchangeFilterCondition() throws RecognitionException {
+    // $ANTLR start "entryRuleDataInterchangeExportFilterCondition"
+    // InternalDataDSL.g:2478:1: entryRuleDataInterchangeExportFilterCondition returns [EObject current=null] : iv_ruleDataInterchangeExportFilterCondition= ruleDataInterchangeExportFilterCondition EOF ;
+    public final EObject entryRuleDataInterchangeExportFilterCondition() throws RecognitionException {
         EObject current = null;
 
-        EObject iv_ruleDataInterchangeFilterCondition = null;
+        EObject iv_ruleDataInterchangeExportFilterCondition = null;
 
 
         try {
-            // InternalDataDSL.g:2314:71: (iv_ruleDataInterchangeFilterCondition= ruleDataInterchangeFilterCondition EOF )
-            // InternalDataDSL.g:2315:2: iv_ruleDataInterchangeFilterCondition= ruleDataInterchangeFilterCondition EOF
+            // InternalDataDSL.g:2478:77: (iv_ruleDataInterchangeExportFilterCondition= ruleDataInterchangeExportFilterCondition EOF )
+            // InternalDataDSL.g:2479:2: iv_ruleDataInterchangeExportFilterCondition= ruleDataInterchangeExportFilterCondition EOF
             {
             if ( state.backtracking==0 ) {
-               newCompositeNode(grammarAccess.getDataInterchangeFilterConditionRule()); 
+               newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionRule()); 
             }
             pushFollow(FOLLOW_1);
-            iv_ruleDataInterchangeFilterCondition=ruleDataInterchangeFilterCondition();
+            iv_ruleDataInterchangeExportFilterCondition=ruleDataInterchangeExportFilterCondition();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
-               current =iv_ruleDataInterchangeFilterCondition; 
+               current =iv_ruleDataInterchangeExportFilterCondition; 
             }
             match(input,EOF,FOLLOW_2); if (state.failed) return current;
 
@@ -6246,12 +6649,12 @@
         }
         return current;
     }
-    // $ANTLR end "entryRuleDataInterchangeFilterCondition"
+    // $ANTLR end "entryRuleDataInterchangeExportFilterCondition"
 
 
-    // $ANTLR start "ruleDataInterchangeFilterCondition"
-    // InternalDataDSL.g:2321:1: ruleDataInterchangeFilterCondition returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleConditionAndOperator1 ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )? ) ;
-    public final EObject ruleDataInterchangeFilterCondition() throws RecognitionException {
+    // $ANTLR start "ruleDataInterchangeExportFilterCondition"
+    // InternalDataDSL.g:2485:1: ruleDataInterchangeExportFilterCondition returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )? ) ;
+    public final EObject ruleDataInterchangeExportFilterCondition() throws RecognitionException {
         EObject current = null;
 
         Token otherlv_0=null;
@@ -6267,29 +6670,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2327:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleConditionAndOperator1 ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )? ) )
-            // InternalDataDSL.g:2328:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleConditionAndOperator1 ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )? )
+            // InternalDataDSL.g:2491:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )? ) )
+            // InternalDataDSL.g:2492:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )? )
             {
-            // InternalDataDSL.g:2328:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleConditionAndOperator1 ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )? )
-            // InternalDataDSL.g:2329:3: ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleConditionAndOperator1 ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )?
+            // InternalDataDSL.g:2492:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )? )
+            // InternalDataDSL.g:2493:3: ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_value_2_0= RULE_STRING ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )?
             {
-            // InternalDataDSL.g:2329:3: ( (otherlv_0= RULE_ID ) )
-            // InternalDataDSL.g:2330:4: (otherlv_0= RULE_ID )
+            // InternalDataDSL.g:2493:3: ( (otherlv_0= RULE_ID ) )
+            // InternalDataDSL.g:2494:4: (otherlv_0= RULE_ID )
             {
-            // InternalDataDSL.g:2330:4: (otherlv_0= RULE_ID )
-            // InternalDataDSL.g:2331:5: otherlv_0= RULE_ID
+            // InternalDataDSL.g:2494:4: (otherlv_0= RULE_ID )
+            // InternalDataDSL.g:2495:5: otherlv_0= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
               					if (current==null) {
-              						current = createModelElement(grammarAccess.getDataInterchangeFilterConditionRule());
+              						current = createModelElement(grammarAccess.getDataInterchangeExportFilterConditionRule());
               					}
               				
             }
-            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_57); if (state.failed) return current;
+            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_59); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
-              					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
+              					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeExportFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
               				
             }
 
@@ -6298,32 +6701,32 @@
 
             }
 
-            // InternalDataDSL.g:2342:3: ( (lv_operator_1_0= ruleConditionAndOperator1 ) )
-            // InternalDataDSL.g:2343:4: (lv_operator_1_0= ruleConditionAndOperator1 )
+            // InternalDataDSL.g:2506:3: ( (lv_operator_1_0= ruleOperator ) )
+            // InternalDataDSL.g:2507:4: (lv_operator_1_0= ruleOperator )
             {
-            // InternalDataDSL.g:2343:4: (lv_operator_1_0= ruleConditionAndOperator1 )
-            // InternalDataDSL.g:2344:5: lv_operator_1_0= ruleConditionAndOperator1
+            // InternalDataDSL.g:2507:4: (lv_operator_1_0= ruleOperator )
+            // InternalDataDSL.g:2508:5: lv_operator_1_0= ruleOperator
             {
             if ( state.backtracking==0 ) {
 
-              					newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getOperatorConditionAndOperator1EnumRuleCall_1_0());
+              					newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0());
               				
             }
-            pushFollow(FOLLOW_58);
-            lv_operator_1_0=ruleConditionAndOperator1();
+            pushFollow(FOLLOW_60);
+            lv_operator_1_0=ruleOperator();
 
             state._fsp--;
             if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					if (current==null) {
-              						current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+              						current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
               					}
               					set(
               						current,
               						"operator",
               						lv_operator_1_0,
-              						"org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator1");
+              						"org.eclipse.osbp.xtext.datainterchange.DataDSL.Operator");
               					afterParserOrEnumRuleCall();
               				
             }
@@ -6333,30 +6736,30 @@
 
             }
 
-            // InternalDataDSL.g:2361:3: ( (lv_value_2_0= RULE_STRING ) )?
-            int alt46=2;
-            int LA46_0 = input.LA(1);
+            // InternalDataDSL.g:2525:3: ( (lv_value_2_0= RULE_STRING ) )?
+            int alt47=2;
+            int LA47_0 = input.LA(1);
 
-            if ( (LA46_0==RULE_STRING) ) {
-                alt46=1;
+            if ( (LA47_0==RULE_STRING) ) {
+                alt47=1;
             }
-            switch (alt46) {
+            switch (alt47) {
                 case 1 :
-                    // InternalDataDSL.g:2362:4: (lv_value_2_0= RULE_STRING )
+                    // InternalDataDSL.g:2526:4: (lv_value_2_0= RULE_STRING )
                     {
-                    // InternalDataDSL.g:2362:4: (lv_value_2_0= RULE_STRING )
-                    // InternalDataDSL.g:2363:5: lv_value_2_0= RULE_STRING
+                    // InternalDataDSL.g:2526:4: (lv_value_2_0= RULE_STRING )
+                    // InternalDataDSL.g:2527:5: lv_value_2_0= RULE_STRING
                     {
-                    lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_59); if (state.failed) return current;
+                    lv_value_2_0=(Token)match(input,RULE_STRING,FOLLOW_61); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      					newLeafNode(lv_value_2_0, grammarAccess.getDataInterchangeFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0());
+                      					newLeafNode(lv_value_2_0, grammarAccess.getDataInterchangeExportFilterConditionAccess().getValueSTRINGTerminalRuleCall_2_0());
                       				
                     }
                     if ( state.backtracking==0 ) {
 
                       					if (current==null) {
-                      						current = createModelElement(grammarAccess.getDataInterchangeFilterConditionRule());
+                      						current = createModelElement(grammarAccess.getDataInterchangeExportFilterConditionRule());
                       					}
                       					setWithLastConsumed(
                       						current,
@@ -6374,43 +6777,43 @@
 
             }
 
-            // InternalDataDSL.g:2379:3: ( ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) ) )?
-            int alt47=2;
-            int LA47_0 = input.LA(1);
+            // InternalDataDSL.g:2543:3: ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) ) )?
+            int alt48=2;
+            int LA48_0 = input.LA(1);
 
-            if ( ((LA47_0>=165 && LA47_0<=166)) ) {
-                alt47=1;
+            if ( ((LA48_0>=178 && LA48_0<=179)) ) {
+                alt48=1;
             }
-            switch (alt47) {
+            switch (alt48) {
                 case 1 :
-                    // InternalDataDSL.g:2380:4: ( (lv_operator2_3_0= ruleConditionAndOperator2 ) ) ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) )
+                    // InternalDataDSL.g:2544:4: ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) )
                     {
-                    // InternalDataDSL.g:2380:4: ( (lv_operator2_3_0= ruleConditionAndOperator2 ) )
-                    // InternalDataDSL.g:2381:5: (lv_operator2_3_0= ruleConditionAndOperator2 )
+                    // InternalDataDSL.g:2544:4: ( (lv_operator2_3_0= ruleJunction ) )
+                    // InternalDataDSL.g:2545:5: (lv_operator2_3_0= ruleJunction )
                     {
-                    // InternalDataDSL.g:2381:5: (lv_operator2_3_0= ruleConditionAndOperator2 )
-                    // InternalDataDSL.g:2382:6: lv_operator2_3_0= ruleConditionAndOperator2
+                    // InternalDataDSL.g:2545:5: (lv_operator2_3_0= ruleJunction )
+                    // InternalDataDSL.g:2546:6: lv_operator2_3_0= ruleJunction
                     {
                     if ( state.backtracking==0 ) {
 
-                      						newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getOperator2ConditionAndOperator2EnumRuleCall_3_0_0());
+                      						newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0());
                       					
                     }
                     pushFollow(FOLLOW_4);
-                    lv_operator2_3_0=ruleConditionAndOperator2();
+                    lv_operator2_3_0=ruleJunction();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						if (current==null) {
-                      							current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+                      							current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
                       						}
                       						set(
                       							current,
                       							"operator2",
                       							lv_operator2_3_0,
-                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator2");
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.Junction");
                       						afterParserOrEnumRuleCall();
                       					
                     }
@@ -6420,32 +6823,32 @@
 
                     }
 
-                    // InternalDataDSL.g:2399:4: ( (lv_subcondition_4_0= ruleDataInterchangeFilterCondition ) )
-                    // InternalDataDSL.g:2400:5: (lv_subcondition_4_0= ruleDataInterchangeFilterCondition )
+                    // InternalDataDSL.g:2563:4: ( (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition ) )
+                    // InternalDataDSL.g:2564:5: (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition )
                     {
-                    // InternalDataDSL.g:2400:5: (lv_subcondition_4_0= ruleDataInterchangeFilterCondition )
-                    // InternalDataDSL.g:2401:6: lv_subcondition_4_0= ruleDataInterchangeFilterCondition
+                    // InternalDataDSL.g:2564:5: (lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition )
+                    // InternalDataDSL.g:2565:6: lv_subcondition_4_0= ruleDataInterchangeExportFilterCondition
                     {
                     if ( state.backtracking==0 ) {
 
-                      						newCompositeNode(grammarAccess.getDataInterchangeFilterConditionAccess().getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0());
+                      						newCompositeNode(grammarAccess.getDataInterchangeExportFilterConditionAccess().getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0());
                       					
                     }
                     pushFollow(FOLLOW_2);
-                    lv_subcondition_4_0=ruleDataInterchangeFilterCondition();
+                    lv_subcondition_4_0=ruleDataInterchangeExportFilterCondition();
 
                     state._fsp--;
                     if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						if (current==null) {
-                      							current = createModelElementForParent(grammarAccess.getDataInterchangeFilterConditionRule());
+                      							current = createModelElementForParent(grammarAccess.getDataInterchangeExportFilterConditionRule());
                       						}
                       						set(
                       							current,
                       							"subcondition",
                       							lv_subcondition_4_0,
-                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFilterCondition");
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilterCondition");
                       						afterParserOrEnumRuleCall();
                       					
                     }
@@ -6482,11 +6885,679 @@
         }
         return current;
     }
-    // $ANTLR end "ruleDataInterchangeFilterCondition"
+    // $ANTLR end "ruleDataInterchangeExportFilterCondition"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterCondition"
+    // InternalDataDSL.g:2587:1: entryRuleDataInterchangeLookupFilterCondition returns [EObject current=null] : iv_ruleDataInterchangeLookupFilterCondition= ruleDataInterchangeLookupFilterCondition EOF ;
+    public final EObject entryRuleDataInterchangeLookupFilterCondition() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeLookupFilterCondition = null;
+
+
+        try {
+            // InternalDataDSL.g:2587:77: (iv_ruleDataInterchangeLookupFilterCondition= ruleDataInterchangeLookupFilterCondition EOF )
+            // InternalDataDSL.g:2588:2: iv_ruleDataInterchangeLookupFilterCondition= ruleDataInterchangeLookupFilterCondition EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeLookupFilterCondition=ruleDataInterchangeLookupFilterCondition();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeLookupFilterCondition; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterCondition"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterCondition"
+    // InternalDataDSL.g:2594:1: ruleDataInterchangeLookupFilterCondition returns [EObject current=null] : ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )? ) ;
+    public final EObject ruleDataInterchangeLookupFilterCondition() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_0=null;
+        Enumerator lv_operator_1_0 = null;
+
+        EObject lv_operand_2_0 = null;
+
+        Enumerator lv_operator2_3_0 = null;
+
+        EObject lv_subcondition_4_0 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:2600:2: ( ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )? ) )
+            // InternalDataDSL.g:2601:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )? )
+            {
+            // InternalDataDSL.g:2601:2: ( ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )? )
+            // InternalDataDSL.g:2602:3: ( (otherlv_0= RULE_ID ) ) ( (lv_operator_1_0= ruleOperator ) ) ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )? ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )?
+            {
+            // InternalDataDSL.g:2602:3: ( (otherlv_0= RULE_ID ) )
+            // InternalDataDSL.g:2603:4: (otherlv_0= RULE_ID )
+            {
+            // InternalDataDSL.g:2603:4: (otherlv_0= RULE_ID )
+            // InternalDataDSL.g:2604:5: otherlv_0= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+              					}
+              				
+            }
+            otherlv_0=(Token)match(input,RULE_ID,FOLLOW_59); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_0, grammarAccess.getDataInterchangeLookupFilterConditionAccess().getRefPropertyLEntityFeatureCrossReference_0_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalDataDSL.g:2615:3: ( (lv_operator_1_0= ruleOperator ) )
+            // InternalDataDSL.g:2616:4: (lv_operator_1_0= ruleOperator )
+            {
+            // InternalDataDSL.g:2616:4: (lv_operator_1_0= ruleOperator )
+            // InternalDataDSL.g:2617:5: lv_operator_1_0= ruleOperator
+            {
+            if ( state.backtracking==0 ) {
+
+              					newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperatorOperatorEnumRuleCall_1_0());
+              				
+            }
+            pushFollow(FOLLOW_62);
+            lv_operator_1_0=ruleOperator();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+              					}
+              					set(
+              						current,
+              						"operator",
+              						lv_operator_1_0,
+              						"org.eclipse.osbp.xtext.datainterchange.DataDSL.Operator");
+              					afterParserOrEnumRuleCall();
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalDataDSL.g:2634:3: ( (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand ) )?
+            int alt49=2;
+            int LA49_0 = input.LA(1);
+
+            if ( (LA49_0==RULE_STRING||LA49_0==RULE_ID) ) {
+                alt49=1;
+            }
+            switch (alt49) {
+                case 1 :
+                    // InternalDataDSL.g:2635:4: (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand )
+                    {
+                    // InternalDataDSL.g:2635:4: (lv_operand_2_0= ruleDataInterchangeLookupFilterOperand )
+                    // InternalDataDSL.g:2636:5: lv_operand_2_0= ruleDataInterchangeLookupFilterOperand
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      					newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0());
+                      				
+                    }
+                    pushFollow(FOLLOW_61);
+                    lv_operand_2_0=ruleDataInterchangeLookupFilterOperand();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      					if (current==null) {
+                      						current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+                      					}
+                      					set(
+                      						current,
+                      						"operand",
+                      						lv_operand_2_0,
+                      						"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterOperand");
+                      					afterParserOrEnumRuleCall();
+                      				
+                    }
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+            // InternalDataDSL.g:2653:3: ( ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) ) )?
+            int alt50=2;
+            int LA50_0 = input.LA(1);
+
+            if ( ((LA50_0>=178 && LA50_0<=179)) ) {
+                alt50=1;
+            }
+            switch (alt50) {
+                case 1 :
+                    // InternalDataDSL.g:2654:4: ( (lv_operator2_3_0= ruleJunction ) ) ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) )
+                    {
+                    // InternalDataDSL.g:2654:4: ( (lv_operator2_3_0= ruleJunction ) )
+                    // InternalDataDSL.g:2655:5: (lv_operator2_3_0= ruleJunction )
+                    {
+                    // InternalDataDSL.g:2655:5: (lv_operator2_3_0= ruleJunction )
+                    // InternalDataDSL.g:2656:6: lv_operator2_3_0= ruleJunction
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getOperator2JunctionEnumRuleCall_3_0_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_4);
+                    lv_operator2_3_0=ruleJunction();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"operator2",
+                      							lv_operator2_3_0,
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.Junction");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+                    // InternalDataDSL.g:2673:4: ( (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition ) )
+                    // InternalDataDSL.g:2674:5: (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition )
+                    {
+                    // InternalDataDSL.g:2674:5: (lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition )
+                    // InternalDataDSL.g:2675:6: lv_subcondition_4_0= ruleDataInterchangeLookupFilterCondition
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      						newCompositeNode(grammarAccess.getDataInterchangeLookupFilterConditionAccess().getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0());
+                      					
+                    }
+                    pushFollow(FOLLOW_2);
+                    lv_subcondition_4_0=ruleDataInterchangeLookupFilterCondition();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      						if (current==null) {
+                      							current = createModelElementForParent(grammarAccess.getDataInterchangeLookupFilterConditionRule());
+                      						}
+                      						set(
+                      							current,
+                      							"subcondition",
+                      							lv_subcondition_4_0,
+                      							"org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterCondition");
+                      						afterParserOrEnumRuleCall();
+                      					
+                    }
+
+                    }
+
+
+                    }
+
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterCondition"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperand"
+    // InternalDataDSL.g:2697:1: entryRuleDataInterchangeLookupFilterOperand returns [EObject current=null] : iv_ruleDataInterchangeLookupFilterOperand= ruleDataInterchangeLookupFilterOperand EOF ;
+    public final EObject entryRuleDataInterchangeLookupFilterOperand() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeLookupFilterOperand = null;
+
+
+        try {
+            // InternalDataDSL.g:2697:75: (iv_ruleDataInterchangeLookupFilterOperand= ruleDataInterchangeLookupFilterOperand EOF )
+            // InternalDataDSL.g:2698:2: iv_ruleDataInterchangeLookupFilterOperand= ruleDataInterchangeLookupFilterOperand EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeLookupFilterOperand=ruleDataInterchangeLookupFilterOperand();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeLookupFilterOperand; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperand"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperand"
+    // InternalDataDSL.g:2704:1: ruleDataInterchangeLookupFilterOperand returns [EObject current=null] : (this_DataInterchangeLookupFilterOperandString_0= ruleDataInterchangeLookupFilterOperandString | this_DataInterchangeLookupFilterOperandProperty_1= ruleDataInterchangeLookupFilterOperandProperty ) ;
+    public final EObject ruleDataInterchangeLookupFilterOperand() throws RecognitionException {
+        EObject current = null;
+
+        EObject this_DataInterchangeLookupFilterOperandString_0 = null;
+
+        EObject this_DataInterchangeLookupFilterOperandProperty_1 = null;
+
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:2710:2: ( (this_DataInterchangeLookupFilterOperandString_0= ruleDataInterchangeLookupFilterOperandString | this_DataInterchangeLookupFilterOperandProperty_1= ruleDataInterchangeLookupFilterOperandProperty ) )
+            // InternalDataDSL.g:2711:2: (this_DataInterchangeLookupFilterOperandString_0= ruleDataInterchangeLookupFilterOperandString | this_DataInterchangeLookupFilterOperandProperty_1= ruleDataInterchangeLookupFilterOperandProperty )
+            {
+            // InternalDataDSL.g:2711:2: (this_DataInterchangeLookupFilterOperandString_0= ruleDataInterchangeLookupFilterOperandString | this_DataInterchangeLookupFilterOperandProperty_1= ruleDataInterchangeLookupFilterOperandProperty )
+            int alt51=2;
+            int LA51_0 = input.LA(1);
+
+            if ( (LA51_0==RULE_STRING) ) {
+                alt51=1;
+            }
+            else if ( (LA51_0==RULE_ID) ) {
+                alt51=2;
+            }
+            else {
+                if (state.backtracking>0) {state.failed=true; return current;}
+                NoViableAltException nvae =
+                    new NoViableAltException("", 51, 0, input);
+
+                throw nvae;
+            }
+            switch (alt51) {
+                case 1 :
+                    // InternalDataDSL.g:2712:3: this_DataInterchangeLookupFilterOperandString_0= ruleDataInterchangeLookupFilterOperandString
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandStringParserRuleCall_0());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_DataInterchangeLookupFilterOperandString_0=ruleDataInterchangeLookupFilterOperandString();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DataInterchangeLookupFilterOperandString_0;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+                case 2 :
+                    // InternalDataDSL.g:2721:3: this_DataInterchangeLookupFilterOperandProperty_1= ruleDataInterchangeLookupFilterOperandProperty
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandAccess().getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_DataInterchangeLookupFilterOperandProperty_1=ruleDataInterchangeLookupFilterOperandProperty();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DataInterchangeLookupFilterOperandProperty_1;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperand"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperandProperty"
+    // InternalDataDSL.g:2733:1: entryRuleDataInterchangeLookupFilterOperandProperty returns [EObject current=null] : iv_ruleDataInterchangeLookupFilterOperandProperty= ruleDataInterchangeLookupFilterOperandProperty EOF ;
+    public final EObject entryRuleDataInterchangeLookupFilterOperandProperty() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeLookupFilterOperandProperty = null;
+
+
+        try {
+            // InternalDataDSL.g:2733:83: (iv_ruleDataInterchangeLookupFilterOperandProperty= ruleDataInterchangeLookupFilterOperandProperty EOF )
+            // InternalDataDSL.g:2734:2: iv_ruleDataInterchangeLookupFilterOperandProperty= ruleDataInterchangeLookupFilterOperandProperty EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeLookupFilterOperandProperty=ruleDataInterchangeLookupFilterOperandProperty();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeLookupFilterOperandProperty; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperandProperty"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperandProperty"
+    // InternalDataDSL.g:2740:1: ruleDataInterchangeLookupFilterOperandProperty returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ) ;
+    public final EObject ruleDataInterchangeLookupFilterOperandProperty() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:2746:2: ( ( () ( (otherlv_1= RULE_ID ) ) ) )
+            // InternalDataDSL.g:2747:2: ( () ( (otherlv_1= RULE_ID ) ) )
+            {
+            // InternalDataDSL.g:2747:2: ( () ( (otherlv_1= RULE_ID ) ) )
+            // InternalDataDSL.g:2748:3: () ( (otherlv_1= RULE_ID ) )
+            {
+            // InternalDataDSL.g:2748:3: ()
+            // InternalDataDSL.g:2749:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getDataInterchangeLookupFilterOperandPropertyAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalDataDSL.g:2755:3: ( (otherlv_1= RULE_ID ) )
+            // InternalDataDSL.g:2756:4: (otherlv_1= RULE_ID )
+            {
+            // InternalDataDSL.g:2756:4: (otherlv_1= RULE_ID )
+            // InternalDataDSL.g:2757:5: otherlv_1= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeLookupFilterOperandPropertyRule());
+              					}
+              				
+            }
+            otherlv_1=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_1, grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureCrossReference_1_0());
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperandProperty"
+
+
+    // $ANTLR start "entryRuleDataInterchangeLookupFilterOperandString"
+    // InternalDataDSL.g:2772:1: entryRuleDataInterchangeLookupFilterOperandString returns [EObject current=null] : iv_ruleDataInterchangeLookupFilterOperandString= ruleDataInterchangeLookupFilterOperandString EOF ;
+    public final EObject entryRuleDataInterchangeLookupFilterOperandString() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeLookupFilterOperandString = null;
+
+
+        try {
+            // InternalDataDSL.g:2772:81: (iv_ruleDataInterchangeLookupFilterOperandString= ruleDataInterchangeLookupFilterOperandString EOF )
+            // InternalDataDSL.g:2773:2: iv_ruleDataInterchangeLookupFilterOperandString= ruleDataInterchangeLookupFilterOperandString EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeLookupFilterOperandStringRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeLookupFilterOperandString=ruleDataInterchangeLookupFilterOperandString();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeLookupFilterOperandString; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeLookupFilterOperandString"
+
+
+    // $ANTLR start "ruleDataInterchangeLookupFilterOperandString"
+    // InternalDataDSL.g:2779:1: ruleDataInterchangeLookupFilterOperandString returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
+    public final EObject ruleDataInterchangeLookupFilterOperandString() throws RecognitionException {
+        EObject current = null;
+
+        Token lv_value_1_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:2785:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalDataDSL.g:2786:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            {
+            // InternalDataDSL.g:2786:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:2787:3: () ( (lv_value_1_0= RULE_STRING ) )
+            {
+            // InternalDataDSL.g:2787:3: ()
+            // InternalDataDSL.g:2788:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getDataInterchangeLookupFilterOperandStringAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            // InternalDataDSL.g:2794:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalDataDSL.g:2795:4: (lv_value_1_0= RULE_STRING )
+            {
+            // InternalDataDSL.g:2795:4: (lv_value_1_0= RULE_STRING )
+            // InternalDataDSL.g:2796:5: lv_value_1_0= RULE_STRING
+            {
+            lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_value_1_0, grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeLookupFilterOperandStringRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"value",
+              						lv_value_1_0,
+              						"org.eclipse.xtext.xbase.Xtype.STRING");
+              				
+            }
+
+            }
+
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeLookupFilterOperandString"
 
 
     // $ANTLR start "entryRuleDataInterchangeExportHide"
-    // InternalDataDSL.g:2423:1: entryRuleDataInterchangeExportHide returns [EObject current=null] : iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF ;
+    // InternalDataDSL.g:2816:1: entryRuleDataInterchangeExportHide returns [EObject current=null] : iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF ;
     public final EObject entryRuleDataInterchangeExportHide() throws RecognitionException {
         EObject current = null;
 
@@ -6494,8 +7565,8 @@
 
 
         try {
-            // InternalDataDSL.g:2423:66: (iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF )
-            // InternalDataDSL.g:2424:2: iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF
+            // InternalDataDSL.g:2816:66: (iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF )
+            // InternalDataDSL.g:2817:2: iv_ruleDataInterchangeExportHide= ruleDataInterchangeExportHide EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeExportHideRule()); 
@@ -6526,7 +7597,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeExportHide"
-    // InternalDataDSL.g:2430:1: ruleDataInterchangeExportHide returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ) ;
+    // InternalDataDSL.g:2823:1: ruleDataInterchangeExportHide returns [EObject current=null] : ( () ( (otherlv_1= RULE_ID ) ) ) ;
     public final EObject ruleDataInterchangeExportHide() throws RecognitionException {
         EObject current = null;
 
@@ -6536,14 +7607,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2436:2: ( ( () ( (otherlv_1= RULE_ID ) ) ) )
-            // InternalDataDSL.g:2437:2: ( () ( (otherlv_1= RULE_ID ) ) )
+            // InternalDataDSL.g:2829:2: ( ( () ( (otherlv_1= RULE_ID ) ) ) )
+            // InternalDataDSL.g:2830:2: ( () ( (otherlv_1= RULE_ID ) ) )
             {
-            // InternalDataDSL.g:2437:2: ( () ( (otherlv_1= RULE_ID ) ) )
-            // InternalDataDSL.g:2438:3: () ( (otherlv_1= RULE_ID ) )
+            // InternalDataDSL.g:2830:2: ( () ( (otherlv_1= RULE_ID ) ) )
+            // InternalDataDSL.g:2831:3: () ( (otherlv_1= RULE_ID ) )
             {
-            // InternalDataDSL.g:2438:3: ()
-            // InternalDataDSL.g:2439:4: 
+            // InternalDataDSL.g:2831:3: ()
+            // InternalDataDSL.g:2832:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -6555,11 +7626,11 @@
 
             }
 
-            // InternalDataDSL.g:2445:3: ( (otherlv_1= RULE_ID ) )
-            // InternalDataDSL.g:2446:4: (otherlv_1= RULE_ID )
+            // InternalDataDSL.g:2838:3: ( (otherlv_1= RULE_ID ) )
+            // InternalDataDSL.g:2839:4: (otherlv_1= RULE_ID )
             {
-            // InternalDataDSL.g:2446:4: (otherlv_1= RULE_ID )
-            // InternalDataDSL.g:2447:5: otherlv_1= RULE_ID
+            // InternalDataDSL.g:2839:4: (otherlv_1= RULE_ID )
+            // InternalDataDSL.g:2840:5: otherlv_1= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -6605,7 +7676,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangePredefinedExpression"
-    // InternalDataDSL.g:2462:1: entryRuleDataInterchangePredefinedExpression returns [EObject current=null] : iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF ;
+    // InternalDataDSL.g:2855:1: entryRuleDataInterchangePredefinedExpression returns [EObject current=null] : iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF ;
     public final EObject entryRuleDataInterchangePredefinedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -6613,8 +7684,8 @@
 
 
         try {
-            // InternalDataDSL.g:2462:76: (iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF )
-            // InternalDataDSL.g:2463:2: iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF
+            // InternalDataDSL.g:2855:76: (iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF )
+            // InternalDataDSL.g:2856:2: iv_ruleDataInterchangePredefinedExpression= ruleDataInterchangePredefinedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangePredefinedExpressionRule()); 
@@ -6645,7 +7716,7 @@
 
 
     // $ANTLR start "ruleDataInterchangePredefinedExpression"
-    // InternalDataDSL.g:2469:1: ruleDataInterchangePredefinedExpression returns [EObject current=null] : ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) ) ;
+    // InternalDataDSL.g:2862:1: ruleDataInterchangePredefinedExpression returns [EObject current=null] : ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) ) ;
     public final EObject ruleDataInterchangePredefinedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -6662,14 +7733,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2475:2: ( ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) ) )
-            // InternalDataDSL.g:2476:2: ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) )
+            // InternalDataDSL.g:2868:2: ( ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) ) )
+            // InternalDataDSL.g:2869:2: ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) )
             {
-            // InternalDataDSL.g:2476:2: ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) )
-            // InternalDataDSL.g:2477:3: () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) )
+            // InternalDataDSL.g:2869:2: ( () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) ) )
+            // InternalDataDSL.g:2870:3: () otherlv_1= 'assign' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'with' ( (lv_bean_4_0= rulePredefinedBeanEnum ) ) otherlv_5= 'as' ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) )
             {
-            // InternalDataDSL.g:2477:3: ()
-            // InternalDataDSL.g:2478:4: 
+            // InternalDataDSL.g:2870:3: ()
+            // InternalDataDSL.g:2871:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -6681,17 +7752,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,67,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,69,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangePredefinedExpressionAccess().getAssignKeyword_1());
               		
             }
-            // InternalDataDSL.g:2488:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:2489:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2881:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:2882:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:2489:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:2490:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:2882:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:2883:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -6700,7 +7771,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_44); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_63); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangePredefinedExpressionAccess().getTargetPropertyLEntityAttributeCrossReference_2_0());
@@ -6712,24 +7783,24 @@
 
             }
 
-            otherlv_3=(Token)match(input,52,FOLLOW_60); if (state.failed) return current;
+            otherlv_3=(Token)match(input,70,FOLLOW_64); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getDataInterchangePredefinedExpressionAccess().getWithKeyword_3());
               		
             }
-            // InternalDataDSL.g:2505:3: ( (lv_bean_4_0= rulePredefinedBeanEnum ) )
-            // InternalDataDSL.g:2506:4: (lv_bean_4_0= rulePredefinedBeanEnum )
+            // InternalDataDSL.g:2898:3: ( (lv_bean_4_0= rulePredefinedBeanEnum ) )
+            // InternalDataDSL.g:2899:4: (lv_bean_4_0= rulePredefinedBeanEnum )
             {
-            // InternalDataDSL.g:2506:4: (lv_bean_4_0= rulePredefinedBeanEnum )
-            // InternalDataDSL.g:2507:5: lv_bean_4_0= rulePredefinedBeanEnum
+            // InternalDataDSL.g:2899:4: (lv_bean_4_0= rulePredefinedBeanEnum )
+            // InternalDataDSL.g:2900:5: lv_bean_4_0= rulePredefinedBeanEnum
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getDataInterchangePredefinedExpressionAccess().getBeanPredefinedBeanEnumEnumRuleCall_4_0());
               				
             }
-            pushFollow(FOLLOW_61);
+            pushFollow(FOLLOW_65);
             lv_bean_4_0=rulePredefinedBeanEnum();
 
             state._fsp--;
@@ -6753,17 +7824,17 @@
 
             }
 
-            otherlv_5=(Token)match(input,68,FOLLOW_62); if (state.failed) return current;
+            otherlv_5=(Token)match(input,71,FOLLOW_66); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_5, grammarAccess.getDataInterchangePredefinedExpressionAccess().getAsKeyword_5());
               		
             }
-            // InternalDataDSL.g:2528:3: ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) )
-            // InternalDataDSL.g:2529:4: (lv_beanType_6_0= rulePredefinedBeanTypeEnum )
+            // InternalDataDSL.g:2921:3: ( (lv_beanType_6_0= rulePredefinedBeanTypeEnum ) )
+            // InternalDataDSL.g:2922:4: (lv_beanType_6_0= rulePredefinedBeanTypeEnum )
             {
-            // InternalDataDSL.g:2529:4: (lv_beanType_6_0= rulePredefinedBeanTypeEnum )
-            // InternalDataDSL.g:2530:5: lv_beanType_6_0= rulePredefinedBeanTypeEnum
+            // InternalDataDSL.g:2922:4: (lv_beanType_6_0= rulePredefinedBeanTypeEnum )
+            // InternalDataDSL.g:2923:5: lv_beanType_6_0= rulePredefinedBeanTypeEnum
             {
             if ( state.backtracking==0 ) {
 
@@ -6819,7 +7890,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeMapping"
-    // InternalDataDSL.g:2551:1: entryRuleDataInterchangeMapping returns [EObject current=null] : iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF ;
+    // InternalDataDSL.g:2944:1: entryRuleDataInterchangeMapping returns [EObject current=null] : iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF ;
     public final EObject entryRuleDataInterchangeMapping() throws RecognitionException {
         EObject current = null;
 
@@ -6827,8 +7898,8 @@
 
 
         try {
-            // InternalDataDSL.g:2551:63: (iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF )
-            // InternalDataDSL.g:2552:2: iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF
+            // InternalDataDSL.g:2944:63: (iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF )
+            // InternalDataDSL.g:2945:2: iv_ruleDataInterchangeMapping= ruleDataInterchangeMapping EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeMappingRule()); 
@@ -6859,7 +7930,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeMapping"
-    // InternalDataDSL.g:2558:1: ruleDataInterchangeMapping returns [EObject current=null] : (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping ) ;
+    // InternalDataDSL.g:2951:1: ruleDataInterchangeMapping returns [EObject current=null] : (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping | this_DataInterchangeFixedColumnMapping_2= ruleDataInterchangeFixedColumnMapping ) ;
     public final EObject ruleDataInterchangeMapping() throws RecognitionException {
         EObject current = null;
 
@@ -6867,34 +7938,45 @@
 
         EObject this_DataInterchangeBlobMapping_1 = null;
 
+        EObject this_DataInterchangeFixedColumnMapping_2 = null;
+
 
 
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2564:2: ( (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping ) )
-            // InternalDataDSL.g:2565:2: (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping )
+            // InternalDataDSL.g:2957:2: ( (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping | this_DataInterchangeFixedColumnMapping_2= ruleDataInterchangeFixedColumnMapping ) )
+            // InternalDataDSL.g:2958:2: (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping | this_DataInterchangeFixedColumnMapping_2= ruleDataInterchangeFixedColumnMapping )
             {
-            // InternalDataDSL.g:2565:2: (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping )
-            int alt48=2;
-            int LA48_0 = input.LA(1);
-
-            if ( (LA48_0==69) ) {
-                alt48=1;
-            }
-            else if ( (LA48_0==71) ) {
-                alt48=2;
-            }
-            else {
+            // InternalDataDSL.g:2958:2: (this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping | this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping | this_DataInterchangeFixedColumnMapping_2= ruleDataInterchangeFixedColumnMapping )
+            int alt52=3;
+            switch ( input.LA(1) ) {
+            case 72:
+                {
+                alt52=1;
+                }
+                break;
+            case 74:
+                {
+                alt52=2;
+                }
+                break;
+            case 77:
+                {
+                alt52=3;
+                }
+                break;
+            default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 48, 0, input);
+                    new NoViableAltException("", 52, 0, input);
 
                 throw nvae;
             }
-            switch (alt48) {
+
+            switch (alt52) {
                 case 1 :
-                    // InternalDataDSL.g:2566:3: this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping
+                    // InternalDataDSL.g:2959:3: this_DataInterchangeValueMapping_0= ruleDataInterchangeValueMapping
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6916,7 +7998,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2575:3: this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping
+                    // InternalDataDSL.g:2968:3: this_DataInterchangeBlobMapping_1= ruleDataInterchangeBlobMapping
                     {
                     if ( state.backtracking==0 ) {
 
@@ -6937,6 +8019,28 @@
 
                     }
                     break;
+                case 3 :
+                    // InternalDataDSL.g:2977:3: this_DataInterchangeFixedColumnMapping_2= ruleDataInterchangeFixedColumnMapping
+                    {
+                    if ( state.backtracking==0 ) {
+
+                      			newCompositeNode(grammarAccess.getDataInterchangeMappingAccess().getDataInterchangeFixedColumnMappingParserRuleCall_2());
+                      		
+                    }
+                    pushFollow(FOLLOW_2);
+                    this_DataInterchangeFixedColumnMapping_2=ruleDataInterchangeFixedColumnMapping();
+
+                    state._fsp--;
+                    if (state.failed) return current;
+                    if ( state.backtracking==0 ) {
+
+                      			current = this_DataInterchangeFixedColumnMapping_2;
+                      			afterParserOrEnumRuleCall();
+                      		
+                    }
+
+                    }
+                    break;
 
             }
 
@@ -6962,7 +8066,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeValueMapping"
-    // InternalDataDSL.g:2587:1: entryRuleDataInterchangeValueMapping returns [EObject current=null] : iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF ;
+    // InternalDataDSL.g:2989:1: entryRuleDataInterchangeValueMapping returns [EObject current=null] : iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF ;
     public final EObject entryRuleDataInterchangeValueMapping() throws RecognitionException {
         EObject current = null;
 
@@ -6970,8 +8074,8 @@
 
 
         try {
-            // InternalDataDSL.g:2587:68: (iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF )
-            // InternalDataDSL.g:2588:2: iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF
+            // InternalDataDSL.g:2989:68: (iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF )
+            // InternalDataDSL.g:2990:2: iv_ruleDataInterchangeValueMapping= ruleDataInterchangeValueMapping EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeValueMappingRule()); 
@@ -7002,7 +8106,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeValueMapping"
-    // InternalDataDSL.g:2594:1: ruleDataInterchangeValueMapping returns [EObject current=null] : ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) ) ;
+    // InternalDataDSL.g:2996:1: ruleDataInterchangeValueMapping returns [EObject current=null] : ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) ) ;
     public final EObject ruleDataInterchangeValueMapping() throws RecognitionException {
         EObject current = null;
 
@@ -7015,14 +8119,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2600:2: ( ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) ) )
-            // InternalDataDSL.g:2601:2: ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:3002:2: ( ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) ) )
+            // InternalDataDSL.g:3003:2: ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) )
             {
-            // InternalDataDSL.g:2601:2: ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) )
-            // InternalDataDSL.g:2602:3: () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) )
+            // InternalDataDSL.g:3003:2: ( () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:3004:3: () otherlv_1= 'map' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) )
             {
-            // InternalDataDSL.g:2602:3: ()
-            // InternalDataDSL.g:2603:4: 
+            // InternalDataDSL.g:3004:3: ()
+            // InternalDataDSL.g:3005:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -7034,17 +8138,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,69,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,72,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeValueMappingAccess().getMapKeyword_1());
               		
             }
-            // InternalDataDSL.g:2613:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:2614:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:3015:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:3016:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:2614:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:2615:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:3016:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:3017:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -7053,7 +8157,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_63); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_67); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeValueMappingAccess().getPropertyLEntityAttributeCrossReference_2_0());
@@ -7065,17 +8169,17 @@
 
             }
 
-            otherlv_3=(Token)match(input,70,FOLLOW_9); if (state.failed) return current;
+            otherlv_3=(Token)match(input,73,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeValueMappingAccess().getToKeyword_3());
               		
             }
-            // InternalDataDSL.g:2630:3: ( (lv_data_4_0= RULE_STRING ) )
-            // InternalDataDSL.g:2631:4: (lv_data_4_0= RULE_STRING )
+            // InternalDataDSL.g:3032:3: ( (lv_data_4_0= RULE_STRING ) )
+            // InternalDataDSL.g:3033:4: (lv_data_4_0= RULE_STRING )
             {
-            // InternalDataDSL.g:2631:4: (lv_data_4_0= RULE_STRING )
-            // InternalDataDSL.g:2632:5: lv_data_4_0= RULE_STRING
+            // InternalDataDSL.g:3033:4: (lv_data_4_0= RULE_STRING )
+            // InternalDataDSL.g:3034:5: lv_data_4_0= RULE_STRING
             {
             lv_data_4_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -7126,7 +8230,7 @@
 
 
     // $ANTLR start "entryRuleDataInterchangeBlobMapping"
-    // InternalDataDSL.g:2652:1: entryRuleDataInterchangeBlobMapping returns [EObject current=null] : iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF ;
+    // InternalDataDSL.g:3054:1: entryRuleDataInterchangeBlobMapping returns [EObject current=null] : iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF ;
     public final EObject entryRuleDataInterchangeBlobMapping() throws RecognitionException {
         EObject current = null;
 
@@ -7134,8 +8238,8 @@
 
 
         try {
-            // InternalDataDSL.g:2652:67: (iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF )
-            // InternalDataDSL.g:2653:2: iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF
+            // InternalDataDSL.g:3054:67: (iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF )
+            // InternalDataDSL.g:3055:2: iv_ruleDataInterchangeBlobMapping= ruleDataInterchangeBlobMapping EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getDataInterchangeBlobMappingRule()); 
@@ -7166,7 +8270,7 @@
 
 
     // $ANTLR start "ruleDataInterchangeBlobMapping"
-    // InternalDataDSL.g:2659:1: ruleDataInterchangeBlobMapping returns [EObject current=null] : ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) ) ;
+    // InternalDataDSL.g:3061:1: ruleDataInterchangeBlobMapping returns [EObject current=null] : ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) ) ;
     public final EObject ruleDataInterchangeBlobMapping() throws RecognitionException {
         EObject current = null;
 
@@ -7186,14 +8290,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2665:2: ( ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) ) )
-            // InternalDataDSL.g:2666:2: ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) )
+            // InternalDataDSL.g:3067:2: ( ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) ) )
+            // InternalDataDSL.g:3068:2: ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) )
             {
-            // InternalDataDSL.g:2666:2: ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) )
-            // InternalDataDSL.g:2667:3: () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) )
+            // InternalDataDSL.g:3068:2: ( () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) ) )
+            // InternalDataDSL.g:3069:3: () otherlv_1= 'mapBlob' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'to' ( (lv_data_4_0= RULE_STRING ) ) (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )? (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )? otherlv_9= 'mimeType' ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) )
             {
-            // InternalDataDSL.g:2667:3: ()
-            // InternalDataDSL.g:2668:4: 
+            // InternalDataDSL.g:3069:3: ()
+            // InternalDataDSL.g:3070:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -7205,17 +8309,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,71,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeBlobMappingAccess().getMapBlobKeyword_1());
               		
             }
-            // InternalDataDSL.g:2678:3: ( (otherlv_2= RULE_ID ) )
-            // InternalDataDSL.g:2679:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:3080:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:3081:4: (otherlv_2= RULE_ID )
             {
-            // InternalDataDSL.g:2679:4: (otherlv_2= RULE_ID )
-            // InternalDataDSL.g:2680:5: otherlv_2= RULE_ID
+            // InternalDataDSL.g:3081:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:3082:5: otherlv_2= RULE_ID
             {
             if ( state.backtracking==0 ) {
 
@@ -7224,7 +8328,7 @@
               					}
               				
             }
-            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_63); if (state.failed) return current;
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_67); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeBlobMappingAccess().getPropertyLEntityAttributeCrossReference_2_0());
@@ -7236,19 +8340,19 @@
 
             }
 
-            otherlv_3=(Token)match(input,70,FOLLOW_9); if (state.failed) return current;
+            otherlv_3=(Token)match(input,73,FOLLOW_9); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeBlobMappingAccess().getToKeyword_3());
               		
             }
-            // InternalDataDSL.g:2695:3: ( (lv_data_4_0= RULE_STRING ) )
-            // InternalDataDSL.g:2696:4: (lv_data_4_0= RULE_STRING )
+            // InternalDataDSL.g:3097:3: ( (lv_data_4_0= RULE_STRING ) )
+            // InternalDataDSL.g:3098:4: (lv_data_4_0= RULE_STRING )
             {
-            // InternalDataDSL.g:2696:4: (lv_data_4_0= RULE_STRING )
-            // InternalDataDSL.g:2697:5: lv_data_4_0= RULE_STRING
+            // InternalDataDSL.g:3098:4: (lv_data_4_0= RULE_STRING )
+            // InternalDataDSL.g:3099:5: lv_data_4_0= RULE_STRING
             {
-            lv_data_4_0=(Token)match(input,RULE_STRING,FOLLOW_64); if (state.failed) return current;
+            lv_data_4_0=(Token)match(input,RULE_STRING,FOLLOW_68); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(lv_data_4_0, grammarAccess.getDataInterchangeBlobMappingAccess().getDataSTRINGTerminalRuleCall_4_0());
@@ -7272,30 +8376,30 @@
 
             }
 
-            // InternalDataDSL.g:2713:3: (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )?
-            int alt49=2;
-            int LA49_0 = input.LA(1);
+            // InternalDataDSL.g:3115:3: (otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) ) )?
+            int alt53=2;
+            int LA53_0 = input.LA(1);
 
-            if ( (LA49_0==72) ) {
-                alt49=1;
+            if ( (LA53_0==75) ) {
+                alt53=1;
             }
-            switch (alt49) {
+            switch (alt53) {
                 case 1 :
-                    // InternalDataDSL.g:2714:4: otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) )
+                    // InternalDataDSL.g:3116:4: otherlv_5= 'extension' ( (lv_blobFileExtension_6_0= RULE_STRING ) )
                     {
-                    otherlv_5=(Token)match(input,72,FOLLOW_9); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,75,FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_5, grammarAccess.getDataInterchangeBlobMappingAccess().getExtensionKeyword_5_0());
                       			
                     }
-                    // InternalDataDSL.g:2718:4: ( (lv_blobFileExtension_6_0= RULE_STRING ) )
-                    // InternalDataDSL.g:2719:5: (lv_blobFileExtension_6_0= RULE_STRING )
+                    // InternalDataDSL.g:3120:4: ( (lv_blobFileExtension_6_0= RULE_STRING ) )
+                    // InternalDataDSL.g:3121:5: (lv_blobFileExtension_6_0= RULE_STRING )
                     {
-                    // InternalDataDSL.g:2719:5: (lv_blobFileExtension_6_0= RULE_STRING )
-                    // InternalDataDSL.g:2720:6: lv_blobFileExtension_6_0= RULE_STRING
+                    // InternalDataDSL.g:3121:5: (lv_blobFileExtension_6_0= RULE_STRING )
+                    // InternalDataDSL.g:3122:6: lv_blobFileExtension_6_0= RULE_STRING
                     {
-                    lv_blobFileExtension_6_0=(Token)match(input,RULE_STRING,FOLLOW_65); if (state.failed) return current;
+                    lv_blobFileExtension_6_0=(Token)match(input,RULE_STRING,FOLLOW_69); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_blobFileExtension_6_0, grammarAccess.getDataInterchangeBlobMappingAccess().getBlobFileExtensionSTRINGTerminalRuleCall_5_1_0());
@@ -7325,16 +8429,16 @@
 
             }
 
-            // InternalDataDSL.g:2737:3: (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )?
-            int alt50=2;
-            int LA50_0 = input.LA(1);
+            // InternalDataDSL.g:3139:3: (otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) ) )?
+            int alt54=2;
+            int LA54_0 = input.LA(1);
 
-            if ( (LA50_0==24) ) {
-                alt50=1;
+            if ( (LA54_0==24) ) {
+                alt54=1;
             }
-            switch (alt50) {
+            switch (alt54) {
                 case 1 :
-                    // InternalDataDSL.g:2738:4: otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) )
+                    // InternalDataDSL.g:3140:4: otherlv_7= 'path' ( (lv_blobPath_8_0= RULE_STRING ) )
                     {
                     otherlv_7=(Token)match(input,24,FOLLOW_9); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -7342,13 +8446,13 @@
                       				newLeafNode(otherlv_7, grammarAccess.getDataInterchangeBlobMappingAccess().getPathKeyword_6_0());
                       			
                     }
-                    // InternalDataDSL.g:2742:4: ( (lv_blobPath_8_0= RULE_STRING ) )
-                    // InternalDataDSL.g:2743:5: (lv_blobPath_8_0= RULE_STRING )
+                    // InternalDataDSL.g:3144:4: ( (lv_blobPath_8_0= RULE_STRING ) )
+                    // InternalDataDSL.g:3145:5: (lv_blobPath_8_0= RULE_STRING )
                     {
-                    // InternalDataDSL.g:2743:5: (lv_blobPath_8_0= RULE_STRING )
-                    // InternalDataDSL.g:2744:6: lv_blobPath_8_0= RULE_STRING
+                    // InternalDataDSL.g:3145:5: (lv_blobPath_8_0= RULE_STRING )
+                    // InternalDataDSL.g:3146:6: lv_blobPath_8_0= RULE_STRING
                     {
-                    lv_blobPath_8_0=(Token)match(input,RULE_STRING,FOLLOW_66); if (state.failed) return current;
+                    lv_blobPath_8_0=(Token)match(input,RULE_STRING,FOLLOW_70); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_blobPath_8_0, grammarAccess.getDataInterchangeBlobMappingAccess().getBlobPathSTRINGTerminalRuleCall_6_1_0());
@@ -7378,17 +8482,17 @@
 
             }
 
-            otherlv_9=(Token)match(input,73,FOLLOW_67); if (state.failed) return current;
+            otherlv_9=(Token)match(input,76,FOLLOW_71); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_9, grammarAccess.getDataInterchangeBlobMappingAccess().getMimeTypeKeyword_7());
               		
             }
-            // InternalDataDSL.g:2765:3: ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) )
-            // InternalDataDSL.g:2766:4: (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum )
+            // InternalDataDSL.g:3167:3: ( (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum ) )
+            // InternalDataDSL.g:3168:4: (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum )
             {
-            // InternalDataDSL.g:2766:4: (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum )
-            // InternalDataDSL.g:2767:5: lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum
+            // InternalDataDSL.g:3168:4: (lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum )
+            // InternalDataDSL.g:3169:5: lv_mimeType_10_0= rulePredefinedBlobMimeTypeEnum
             {
             if ( state.backtracking==0 ) {
 
@@ -7443,8 +8547,615 @@
     // $ANTLR end "ruleDataInterchangeBlobMapping"
 
 
+    // $ANTLR start "entryRuleDataInterchangeFixedColumnMapping"
+    // InternalDataDSL.g:3190:1: entryRuleDataInterchangeFixedColumnMapping returns [EObject current=null] : iv_ruleDataInterchangeFixedColumnMapping= ruleDataInterchangeFixedColumnMapping EOF ;
+    public final EObject entryRuleDataInterchangeFixedColumnMapping() throws RecognitionException {
+        EObject current = null;
+
+        EObject iv_ruleDataInterchangeFixedColumnMapping = null;
+
+
+        try {
+            // InternalDataDSL.g:3190:74: (iv_ruleDataInterchangeFixedColumnMapping= ruleDataInterchangeFixedColumnMapping EOF )
+            // InternalDataDSL.g:3191:2: iv_ruleDataInterchangeFixedColumnMapping= ruleDataInterchangeFixedColumnMapping EOF
+            {
+            if ( state.backtracking==0 ) {
+               newCompositeNode(grammarAccess.getDataInterchangeFixedColumnMappingRule()); 
+            }
+            pushFollow(FOLLOW_1);
+            iv_ruleDataInterchangeFixedColumnMapping=ruleDataInterchangeFixedColumnMapping();
+
+            state._fsp--;
+            if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+               current =iv_ruleDataInterchangeFixedColumnMapping; 
+            }
+            match(input,EOF,FOLLOW_2); if (state.failed) return current;
+
+            }
+
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "entryRuleDataInterchangeFixedColumnMapping"
+
+
+    // $ANTLR start "ruleDataInterchangeFixedColumnMapping"
+    // InternalDataDSL.g:3197:1: ruleDataInterchangeFixedColumnMapping returns [EObject current=null] : ( () otherlv_1= 'mapFixedLength' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'length' ( (lv_length_4_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) ) ) ;
+    public final EObject ruleDataInterchangeFixedColumnMapping() throws RecognitionException {
+        EObject current = null;
+
+        Token otherlv_1=null;
+        Token otherlv_2=null;
+        Token otherlv_3=null;
+        Token lv_length_4_0=null;
+        Token lv_trim_6_0=null;
+        Token lv_leftTrim_7_0=null;
+        Token lv_rightTrim_8_0=null;
+        Token lv_lowerCase_9_0=null;
+        Token lv_upperCase_10_0=null;
+        Token lv_capFirst_11_0=null;
+        Token lv_uncapFirst_12_0=null;
+        Token lv_capitalize_13_0=null;
+
+
+        	enterRule();
+
+        try {
+            // InternalDataDSL.g:3203:2: ( ( () otherlv_1= 'mapFixedLength' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'length' ( (lv_length_4_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) ) ) )
+            // InternalDataDSL.g:3204:2: ( () otherlv_1= 'mapFixedLength' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'length' ( (lv_length_4_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) ) )
+            {
+            // InternalDataDSL.g:3204:2: ( () otherlv_1= 'mapFixedLength' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'length' ( (lv_length_4_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) ) )
+            // InternalDataDSL.g:3205:3: () otherlv_1= 'mapFixedLength' ( (otherlv_2= RULE_ID ) ) otherlv_3= 'length' ( (lv_length_4_0= RULE_INT ) ) ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) )
+            {
+            // InternalDataDSL.g:3205:3: ()
+            // InternalDataDSL.g:3206:4: 
+            {
+            if ( state.backtracking==0 ) {
+
+              				current = forceCreateModelElement(
+              					grammarAccess.getDataInterchangeFixedColumnMappingAccess().getDataInterchangeFixedColumnMappingAction_0(),
+              					current);
+              			
+            }
+
+            }
+
+            otherlv_1=(Token)match(input,77,FOLLOW_4); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_1, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getMapFixedLengthKeyword_1());
+              		
+            }
+            // InternalDataDSL.g:3216:3: ( (otherlv_2= RULE_ID ) )
+            // InternalDataDSL.g:3217:4: (otherlv_2= RULE_ID )
+            {
+            // InternalDataDSL.g:3217:4: (otherlv_2= RULE_ID )
+            // InternalDataDSL.g:3218:5: otherlv_2= RULE_ID
+            {
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+              					}
+              				
+            }
+            otherlv_2=(Token)match(input,RULE_ID,FOLLOW_72); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(otherlv_2, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getPropertyLEntityAttributeCrossReference_2_0());
+              				
+            }
+
+            }
+
+
+            }
+
+            otherlv_3=(Token)match(input,78,FOLLOW_13); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              			newLeafNode(otherlv_3, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthKeyword_3());
+              		
+            }
+            // InternalDataDSL.g:3233:3: ( (lv_length_4_0= RULE_INT ) )
+            // InternalDataDSL.g:3234:4: (lv_length_4_0= RULE_INT )
+            {
+            // InternalDataDSL.g:3234:4: (lv_length_4_0= RULE_INT )
+            // InternalDataDSL.g:3235:5: lv_length_4_0= RULE_INT
+            {
+            lv_length_4_0=(Token)match(input,RULE_INT,FOLLOW_73); if (state.failed) return current;
+            if ( state.backtracking==0 ) {
+
+              					newLeafNode(lv_length_4_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLengthINTTerminalRuleCall_4_0());
+              				
+            }
+            if ( state.backtracking==0 ) {
+
+              					if (current==null) {
+              						current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+              					}
+              					setWithLastConsumed(
+              						current,
+              						"length",
+              						lv_length_4_0,
+              						"org.eclipse.xtext.xbase.Xbase.INT");
+              				
+            }
+
+            }
+
+
+            }
+
+            // InternalDataDSL.g:3251:3: ( ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) ) )
+            // InternalDataDSL.g:3252:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) )
+            {
+            // InternalDataDSL.g:3252:4: ( ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* ) )
+            // InternalDataDSL.g:3253:5: ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* )
+            {
+            getUnorderedGroupHelper().enter(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+            // InternalDataDSL.g:3256:5: ( ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )* )
+            // InternalDataDSL.g:3257:6: ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )*
+            {
+            // InternalDataDSL.g:3257:6: ( ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) ) | ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) ) )*
+            loop57:
+            do {
+                int alt57=3;
+                int LA57_0 = input.LA(1);
+
+                if ( LA57_0 >= 79 && LA57_0 <= 81 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+                    alt57=1;
+                }
+                else if ( LA57_0 >= 82 && LA57_0 <= 86 && getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {
+                    alt57=2;
+                }
+
+
+                switch (alt57) {
+            	case 1 :
+            	    // InternalDataDSL.g:3258:4: ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) )
+            	    {
+            	    // InternalDataDSL.g:3258:4: ({...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) ) )
+            	    // InternalDataDSL.g:3259:5: {...}? => ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFixedColumnMapping", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0)");
+            	    }
+            	    // InternalDataDSL.g:3259:130: ( ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) ) )
+            	    // InternalDataDSL.g:3260:6: ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 0);
+            	    // InternalDataDSL.g:3263:9: ({...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) ) )
+            	    // InternalDataDSL.g:3263:10: {...}? => ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFixedColumnMapping", "true");
+            	    }
+            	    // InternalDataDSL.g:3263:19: ( ( (lv_trim_6_0= 'trim' ) ) | ( (lv_leftTrim_7_0= 'leftTrim' ) ) | ( (lv_rightTrim_8_0= 'rightTrim' ) ) )
+            	    int alt55=3;
+            	    switch ( input.LA(1) ) {
+            	    case 79:
+            	        {
+            	        alt55=1;
+            	        }
+            	        break;
+            	    case 80:
+            	        {
+            	        alt55=2;
+            	        }
+            	        break;
+            	    case 81:
+            	        {
+            	        alt55=3;
+            	        }
+            	        break;
+            	    default:
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 55, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt55) {
+            	        case 1 :
+            	            // InternalDataDSL.g:3263:20: ( (lv_trim_6_0= 'trim' ) )
+            	            {
+            	            // InternalDataDSL.g:3263:20: ( (lv_trim_6_0= 'trim' ) )
+            	            // InternalDataDSL.g:3264:10: (lv_trim_6_0= 'trim' )
+            	            {
+            	            // InternalDataDSL.g:3264:10: (lv_trim_6_0= 'trim' )
+            	            // InternalDataDSL.g:3265:11: lv_trim_6_0= 'trim'
+            	            {
+            	            lv_trim_6_0=(Token)match(input,79,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_trim_6_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getTrimTrimKeyword_5_0_0_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "trim", true, "trim");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalDataDSL.g:3278:9: ( (lv_leftTrim_7_0= 'leftTrim' ) )
+            	            {
+            	            // InternalDataDSL.g:3278:9: ( (lv_leftTrim_7_0= 'leftTrim' ) )
+            	            // InternalDataDSL.g:3279:10: (lv_leftTrim_7_0= 'leftTrim' )
+            	            {
+            	            // InternalDataDSL.g:3279:10: (lv_leftTrim_7_0= 'leftTrim' )
+            	            // InternalDataDSL.g:3280:11: lv_leftTrim_7_0= 'leftTrim'
+            	            {
+            	            lv_leftTrim_7_0=(Token)match(input,80,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_leftTrim_7_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLeftTrimLeftTrimKeyword_5_0_1_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "leftTrim", true, "leftTrim");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 3 :
+            	            // InternalDataDSL.g:3293:9: ( (lv_rightTrim_8_0= 'rightTrim' ) )
+            	            {
+            	            // InternalDataDSL.g:3293:9: ( (lv_rightTrim_8_0= 'rightTrim' ) )
+            	            // InternalDataDSL.g:3294:10: (lv_rightTrim_8_0= 'rightTrim' )
+            	            {
+            	            // InternalDataDSL.g:3294:10: (lv_rightTrim_8_0= 'rightTrim' )
+            	            // InternalDataDSL.g:3295:11: lv_rightTrim_8_0= 'rightTrim'
+            	            {
+            	            lv_rightTrim_8_0=(Token)match(input,81,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_rightTrim_8_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getRightTrimRightTrimKeyword_5_0_2_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "rightTrim", true, "rightTrim");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+            	case 2 :
+            	    // InternalDataDSL.g:3313:4: ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) )
+            	    {
+            	    // InternalDataDSL.g:3313:4: ({...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) ) )
+            	    // InternalDataDSL.g:3314:5: {...}? => ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) )
+            	    {
+            	    if ( ! getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFixedColumnMapping", "getUnorderedGroupHelper().canSelect(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1)");
+            	    }
+            	    // InternalDataDSL.g:3314:130: ( ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) ) )
+            	    // InternalDataDSL.g:3315:6: ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) )
+            	    {
+            	    getUnorderedGroupHelper().select(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5(), 1);
+            	    // InternalDataDSL.g:3318:9: ({...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) ) )
+            	    // InternalDataDSL.g:3318:10: {...}? => ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) )
+            	    {
+            	    if ( !((true)) ) {
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        throw new FailedPredicateException(input, "ruleDataInterchangeFixedColumnMapping", "true");
+            	    }
+            	    // InternalDataDSL.g:3318:19: ( ( (lv_lowerCase_9_0= 'lowerCase' ) ) | ( (lv_upperCase_10_0= 'upperCase' ) ) | ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) ) | ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) ) | ( (lv_capitalize_13_0= 'capitalize' ) ) )
+            	    int alt56=5;
+            	    switch ( input.LA(1) ) {
+            	    case 82:
+            	        {
+            	        alt56=1;
+            	        }
+            	        break;
+            	    case 83:
+            	        {
+            	        alt56=2;
+            	        }
+            	        break;
+            	    case 84:
+            	        {
+            	        alt56=3;
+            	        }
+            	        break;
+            	    case 85:
+            	        {
+            	        alt56=4;
+            	        }
+            	        break;
+            	    case 86:
+            	        {
+            	        alt56=5;
+            	        }
+            	        break;
+            	    default:
+            	        if (state.backtracking>0) {state.failed=true; return current;}
+            	        NoViableAltException nvae =
+            	            new NoViableAltException("", 56, 0, input);
+
+            	        throw nvae;
+            	    }
+
+            	    switch (alt56) {
+            	        case 1 :
+            	            // InternalDataDSL.g:3318:20: ( (lv_lowerCase_9_0= 'lowerCase' ) )
+            	            {
+            	            // InternalDataDSL.g:3318:20: ( (lv_lowerCase_9_0= 'lowerCase' ) )
+            	            // InternalDataDSL.g:3319:10: (lv_lowerCase_9_0= 'lowerCase' )
+            	            {
+            	            // InternalDataDSL.g:3319:10: (lv_lowerCase_9_0= 'lowerCase' )
+            	            // InternalDataDSL.g:3320:11: lv_lowerCase_9_0= 'lowerCase'
+            	            {
+            	            lv_lowerCase_9_0=(Token)match(input,82,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_lowerCase_9_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getLowerCaseLowerCaseKeyword_5_1_0_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "lowerCase", true, "lowerCase");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 2 :
+            	            // InternalDataDSL.g:3333:9: ( (lv_upperCase_10_0= 'upperCase' ) )
+            	            {
+            	            // InternalDataDSL.g:3333:9: ( (lv_upperCase_10_0= 'upperCase' ) )
+            	            // InternalDataDSL.g:3334:10: (lv_upperCase_10_0= 'upperCase' )
+            	            {
+            	            // InternalDataDSL.g:3334:10: (lv_upperCase_10_0= 'upperCase' )
+            	            // InternalDataDSL.g:3335:11: lv_upperCase_10_0= 'upperCase'
+            	            {
+            	            lv_upperCase_10_0=(Token)match(input,83,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_upperCase_10_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUpperCaseUpperCaseKeyword_5_1_1_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "upperCase", true, "upperCase");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 3 :
+            	            // InternalDataDSL.g:3348:9: ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) )
+            	            {
+            	            // InternalDataDSL.g:3348:9: ( (lv_capFirst_11_0= 'capitalizeFirstWord' ) )
+            	            // InternalDataDSL.g:3349:10: (lv_capFirst_11_0= 'capitalizeFirstWord' )
+            	            {
+            	            // InternalDataDSL.g:3349:10: (lv_capFirst_11_0= 'capitalizeFirstWord' )
+            	            // InternalDataDSL.g:3350:11: lv_capFirst_11_0= 'capitalizeFirstWord'
+            	            {
+            	            lv_capFirst_11_0=(Token)match(input,84,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_capFirst_11_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapFirstCapitalizeFirstWordKeyword_5_1_2_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "capFirst", true, "capitalizeFirstWord");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 4 :
+            	            // InternalDataDSL.g:3363:9: ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) )
+            	            {
+            	            // InternalDataDSL.g:3363:9: ( (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' ) )
+            	            // InternalDataDSL.g:3364:10: (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' )
+            	            {
+            	            // InternalDataDSL.g:3364:10: (lv_uncapFirst_12_0= 'uncapitalizeFirstWord' )
+            	            // InternalDataDSL.g:3365:11: lv_uncapFirst_12_0= 'uncapitalizeFirstWord'
+            	            {
+            	            lv_uncapFirst_12_0=(Token)match(input,85,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_uncapFirst_12_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "uncapFirst", true, "uncapitalizeFirstWord");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+            	        case 5 :
+            	            // InternalDataDSL.g:3378:9: ( (lv_capitalize_13_0= 'capitalize' ) )
+            	            {
+            	            // InternalDataDSL.g:3378:9: ( (lv_capitalize_13_0= 'capitalize' ) )
+            	            // InternalDataDSL.g:3379:10: (lv_capitalize_13_0= 'capitalize' )
+            	            {
+            	            // InternalDataDSL.g:3379:10: (lv_capitalize_13_0= 'capitalize' )
+            	            // InternalDataDSL.g:3380:11: lv_capitalize_13_0= 'capitalize'
+            	            {
+            	            lv_capitalize_13_0=(Token)match(input,86,FOLLOW_73); if (state.failed) return current;
+            	            if ( state.backtracking==0 ) {
+
+            	              											newLeafNode(lv_capitalize_13_0, grammarAccess.getDataInterchangeFixedColumnMappingAccess().getCapitalizeCapitalizeKeyword_5_1_4_0());
+            	              										
+            	            }
+            	            if ( state.backtracking==0 ) {
+
+            	              											if (current==null) {
+            	              												current = createModelElement(grammarAccess.getDataInterchangeFixedColumnMappingRule());
+            	              											}
+            	              											setWithLastConsumed(current, "capitalize", true, "capitalize");
+            	              										
+            	            }
+
+            	            }
+
+
+            	            }
+
+
+            	            }
+            	            break;
+
+            	    }
+
+
+            	    }
+
+            	    getUnorderedGroupHelper().returnFromSelection(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+
+            	    }
+
+
+            	    }
+
+
+            	    }
+            	    break;
+
+            	default :
+            	    break loop57;
+                }
+            } while (true);
+
+
+            }
+
+
+            }
+
+            getUnorderedGroupHelper().leave(grammarAccess.getDataInterchangeFixedColumnMappingAccess().getUnorderedGroup_5());
+
+            }
+
+
+            }
+
+
+            }
+
+            if ( state.backtracking==0 ) {
+
+              	leaveRule();
+
+            }
+        }
+
+            catch (RecognitionException re) {
+                recover(input,re);
+                appendSkippedTokens();
+            }
+        finally {
+        }
+        return current;
+    }
+    // $ANTLR end "ruleDataInterchangeFixedColumnMapping"
+
+
     // $ANTLR start "entryRuleLFQN"
-    // InternalDataDSL.g:2788:1: entryRuleLFQN returns [String current=null] : iv_ruleLFQN= ruleLFQN EOF ;
+    // InternalDataDSL.g:3409:1: entryRuleLFQN returns [String current=null] : iv_ruleLFQN= ruleLFQN EOF ;
     public final String entryRuleLFQN() throws RecognitionException {
         String current = null;
 
@@ -7452,8 +9163,8 @@
 
 
         try {
-            // InternalDataDSL.g:2788:44: (iv_ruleLFQN= ruleLFQN EOF )
-            // InternalDataDSL.g:2789:2: iv_ruleLFQN= ruleLFQN EOF
+            // InternalDataDSL.g:3409:44: (iv_ruleLFQN= ruleLFQN EOF )
+            // InternalDataDSL.g:3410:2: iv_ruleLFQN= ruleLFQN EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getLFQNRule()); 
@@ -7484,7 +9195,7 @@
 
 
     // $ANTLR start "ruleLFQN"
-    // InternalDataDSL.g:2795:1: ruleLFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
+    // InternalDataDSL.g:3416:1: ruleLFQN returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) ;
     public final AntlrDatatypeRuleToken ruleLFQN() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -7496,13 +9207,13 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2801:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
-            // InternalDataDSL.g:2802:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
+            // InternalDataDSL.g:3422:2: ( (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* ) )
+            // InternalDataDSL.g:3423:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
             {
-            // InternalDataDSL.g:2802:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
-            // InternalDataDSL.g:2803:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
+            // InternalDataDSL.g:3423:2: (this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )* )
+            // InternalDataDSL.g:3424:3: this_ID_0= RULE_ID (kw= '.' this_ID_2= RULE_ID )*
             {
-            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_68); if (state.failed) return current;
+            this_ID_0=(Token)match(input,RULE_ID,FOLLOW_74); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			current.merge(this_ID_0);
@@ -7513,29 +9224,29 @@
               			newLeafNode(this_ID_0, grammarAccess.getLFQNAccess().getIDTerminalRuleCall_0());
               		
             }
-            // InternalDataDSL.g:2810:3: (kw= '.' this_ID_2= RULE_ID )*
-            loop51:
+            // InternalDataDSL.g:3431:3: (kw= '.' this_ID_2= RULE_ID )*
+            loop58:
             do {
-                int alt51=2;
-                int LA51_0 = input.LA(1);
+                int alt58=2;
+                int LA58_0 = input.LA(1);
 
-                if ( (LA51_0==74) ) {
-                    alt51=1;
+                if ( (LA58_0==87) ) {
+                    alt58=1;
                 }
 
 
-                switch (alt51) {
+                switch (alt58) {
             	case 1 :
-            	    // InternalDataDSL.g:2811:4: kw= '.' this_ID_2= RULE_ID
+            	    // InternalDataDSL.g:3432:4: kw= '.' this_ID_2= RULE_ID
             	    {
-            	    kw=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
+            	    kw=(Token)match(input,87,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      				current.merge(kw);
             	      				newLeafNode(kw, grammarAccess.getLFQNAccess().getFullStopKeyword_1_0());
             	      			
             	    }
-            	    this_ID_2=(Token)match(input,RULE_ID,FOLLOW_68); if (state.failed) return current;
+            	    this_ID_2=(Token)match(input,RULE_ID,FOLLOW_74); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      				current.merge(this_ID_2);
@@ -7551,7 +9262,7 @@
             	    break;
 
             	default :
-            	    break loop51;
+            	    break loop58;
                 }
             } while (true);
 
@@ -7580,7 +9291,7 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLESTRING"
-    // InternalDataDSL.g:2828:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
+    // InternalDataDSL.g:3449:1: entryRuleTRANSLATABLESTRING returns [String current=null] : iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF ;
     public final String entryRuleTRANSLATABLESTRING() throws RecognitionException {
         String current = null;
 
@@ -7588,8 +9299,8 @@
 
 
         try {
-            // InternalDataDSL.g:2828:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
-            // InternalDataDSL.g:2829:2: iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF
+            // InternalDataDSL.g:3449:58: (iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF )
+            // InternalDataDSL.g:3450:2: iv_ruleTRANSLATABLESTRING= ruleTRANSLATABLESTRING EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTRANSLATABLESTRINGRule()); 
@@ -7620,7 +9331,7 @@
 
 
     // $ANTLR start "ruleTRANSLATABLESTRING"
-    // InternalDataDSL.g:2835:1: ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
+    // InternalDataDSL.g:3456:1: ruleTRANSLATABLESTRING returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_STRING_0= RULE_STRING ;
     public final AntlrDatatypeRuleToken ruleTRANSLATABLESTRING() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -7630,8 +9341,8 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2841:2: (this_STRING_0= RULE_STRING )
-            // InternalDataDSL.g:2842:2: this_STRING_0= RULE_STRING
+            // InternalDataDSL.g:3462:2: (this_STRING_0= RULE_STRING )
+            // InternalDataDSL.g:3463:2: this_STRING_0= RULE_STRING
             {
             this_STRING_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -7666,7 +9377,7 @@
 
 
     // $ANTLR start "entryRuleTRANSLATABLEID"
-    // InternalDataDSL.g:2852:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
+    // InternalDataDSL.g:3473:1: entryRuleTRANSLATABLEID returns [String current=null] : iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF ;
     public final String entryRuleTRANSLATABLEID() throws RecognitionException {
         String current = null;
 
@@ -7674,8 +9385,8 @@
 
 
         try {
-            // InternalDataDSL.g:2852:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
-            // InternalDataDSL.g:2853:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
+            // InternalDataDSL.g:3473:54: (iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF )
+            // InternalDataDSL.g:3474:2: iv_ruleTRANSLATABLEID= ruleTRANSLATABLEID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getTRANSLATABLEIDRule()); 
@@ -7706,7 +9417,7 @@
 
 
     // $ANTLR start "ruleTRANSLATABLEID"
-    // InternalDataDSL.g:2859:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    // InternalDataDSL.g:3480:1: ruleTRANSLATABLEID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
     public final AntlrDatatypeRuleToken ruleTRANSLATABLEID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -7716,8 +9427,8 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2865:2: (this_ID_0= RULE_ID )
-            // InternalDataDSL.g:2866:2: this_ID_0= RULE_ID
+            // InternalDataDSL.g:3486:2: (this_ID_0= RULE_ID )
+            // InternalDataDSL.g:3487:2: this_ID_0= RULE_ID
             {
             this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -7752,7 +9463,7 @@
 
 
     // $ANTLR start "entryRuleXImportDeclaration"
-    // InternalDataDSL.g:2876:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
+    // InternalDataDSL.g:3497:1: entryRuleXImportDeclaration returns [EObject current=null] : iv_ruleXImportDeclaration= ruleXImportDeclaration EOF ;
     public final EObject entryRuleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -7760,8 +9471,8 @@
 
 
         try {
-            // InternalDataDSL.g:2876:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
-            // InternalDataDSL.g:2877:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
+            // InternalDataDSL.g:3497:59: (iv_ruleXImportDeclaration= ruleXImportDeclaration EOF )
+            // InternalDataDSL.g:3498:2: iv_ruleXImportDeclaration= ruleXImportDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportDeclarationRule()); 
@@ -7792,7 +9503,7 @@
 
 
     // $ANTLR start "ruleXImportDeclaration"
-    // InternalDataDSL.g:2883:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
+    // InternalDataDSL.g:3504:1: ruleXImportDeclaration returns [EObject current=null] : ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) ;
     public final EObject ruleXImportDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -7813,14 +9524,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:2889:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
-            // InternalDataDSL.g:2890:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            // InternalDataDSL.g:3510:2: ( ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? ) )
+            // InternalDataDSL.g:3511:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
             {
-            // InternalDataDSL.g:2890:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
-            // InternalDataDSL.g:2891:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
+            // InternalDataDSL.g:3511:2: ( () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )? )
+            // InternalDataDSL.g:3512:3: () otherlv_1= 'import' ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) ) (otherlv_11= ';' )?
             {
-            // InternalDataDSL.g:2891:3: ()
-            // InternalDataDSL.g:2892:4: 
+            // InternalDataDSL.g:3512:3: ()
+            // InternalDataDSL.g:3513:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -7832,29 +9543,29 @@
 
             }
 
-            otherlv_1=(Token)match(input,75,FOLLOW_69); if (state.failed) return current;
+            otherlv_1=(Token)match(input,88,FOLLOW_75); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXImportDeclarationAccess().getImportKeyword_1());
               		
             }
-            // InternalDataDSL.g:2902:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
-            int alt54=4;
-            alt54 = dfa54.predict(input);
-            switch (alt54) {
+            // InternalDataDSL.g:3523:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )
+            int alt61=4;
+            alt61 = dfa61.predict(input);
+            switch (alt61) {
                 case 1 :
-                    // InternalDataDSL.g:2903:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalDataDSL.g:3524:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
                     {
-                    // InternalDataDSL.g:2903:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
-                    // InternalDataDSL.g:2904:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    // InternalDataDSL.g:3524:4: ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) )
+                    // InternalDataDSL.g:3525:5: ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
                     {
-                    // InternalDataDSL.g:2904:5: ( (lv_static_2_0= 'static' ) )
-                    // InternalDataDSL.g:2905:6: (lv_static_2_0= 'static' )
+                    // InternalDataDSL.g:3525:5: ( (lv_static_2_0= 'static' ) )
+                    // InternalDataDSL.g:3526:6: (lv_static_2_0= 'static' )
                     {
-                    // InternalDataDSL.g:2905:6: (lv_static_2_0= 'static' )
-                    // InternalDataDSL.g:2906:7: lv_static_2_0= 'static'
+                    // InternalDataDSL.g:3526:6: (lv_static_2_0= 'static' )
+                    // InternalDataDSL.g:3527:7: lv_static_2_0= 'static'
                     {
-                    lv_static_2_0=(Token)match(input,76,FOLLOW_70); if (state.failed) return current;
+                    lv_static_2_0=(Token)match(input,89,FOLLOW_76); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       							newLeafNode(lv_static_2_0, grammarAccess.getXImportDeclarationAccess().getStaticStaticKeyword_2_0_0_0());
@@ -7874,21 +9585,21 @@
 
                     }
 
-                    // InternalDataDSL.g:2918:5: ( (lv_extension_3_0= 'extension' ) )?
-                    int alt52=2;
-                    int LA52_0 = input.LA(1);
+                    // InternalDataDSL.g:3539:5: ( (lv_extension_3_0= 'extension' ) )?
+                    int alt59=2;
+                    int LA59_0 = input.LA(1);
 
-                    if ( (LA52_0==72) ) {
-                        alt52=1;
+                    if ( (LA59_0==75) ) {
+                        alt59=1;
                     }
-                    switch (alt52) {
+                    switch (alt59) {
                         case 1 :
-                            // InternalDataDSL.g:2919:6: (lv_extension_3_0= 'extension' )
+                            // InternalDataDSL.g:3540:6: (lv_extension_3_0= 'extension' )
                             {
-                            // InternalDataDSL.g:2919:6: (lv_extension_3_0= 'extension' )
-                            // InternalDataDSL.g:2920:7: lv_extension_3_0= 'extension'
+                            // InternalDataDSL.g:3540:6: (lv_extension_3_0= 'extension' )
+                            // InternalDataDSL.g:3541:7: lv_extension_3_0= 'extension'
                             {
-                            lv_extension_3_0=(Token)match(input,72,FOLLOW_70); if (state.failed) return current;
+                            lv_extension_3_0=(Token)match(input,75,FOLLOW_76); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							newLeafNode(lv_extension_3_0, grammarAccess.getXImportDeclarationAccess().getExtensionExtensionKeyword_2_0_1_0());
@@ -7911,11 +9622,11 @@
 
                     }
 
-                    // InternalDataDSL.g:2932:5: ( ( ruleQualifiedNameInStaticImport ) )
-                    // InternalDataDSL.g:2933:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalDataDSL.g:3553:5: ( ( ruleQualifiedNameInStaticImport ) )
+                    // InternalDataDSL.g:3554:6: ( ruleQualifiedNameInStaticImport )
                     {
-                    // InternalDataDSL.g:2933:6: ( ruleQualifiedNameInStaticImport )
-                    // InternalDataDSL.g:2934:7: ruleQualifiedNameInStaticImport
+                    // InternalDataDSL.g:3554:6: ( ruleQualifiedNameInStaticImport )
+                    // InternalDataDSL.g:3555:7: ruleQualifiedNameInStaticImport
                     {
                     if ( state.backtracking==0 ) {
 
@@ -7929,7 +9640,7 @@
                       							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_0_2_0());
                       						
                     }
-                    pushFollow(FOLLOW_71);
+                    pushFollow(FOLLOW_77);
                     ruleQualifiedNameInStaticImport();
 
                     state._fsp--;
@@ -7945,34 +9656,34 @@
 
                     }
 
-                    // InternalDataDSL.g:2948:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
-                    int alt53=2;
-                    int LA53_0 = input.LA(1);
+                    // InternalDataDSL.g:3569:5: ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) )
+                    int alt60=2;
+                    int LA60_0 = input.LA(1);
 
-                    if ( (LA53_0==77) ) {
-                        alt53=1;
+                    if ( (LA60_0==90) ) {
+                        alt60=1;
                     }
-                    else if ( (LA53_0==RULE_ID) ) {
-                        alt53=2;
+                    else if ( (LA60_0==RULE_ID) ) {
+                        alt60=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 53, 0, input);
+                            new NoViableAltException("", 60, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt53) {
+                    switch (alt60) {
                         case 1 :
-                            // InternalDataDSL.g:2949:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalDataDSL.g:3570:6: ( (lv_wildcard_5_0= '*' ) )
                             {
-                            // InternalDataDSL.g:2949:6: ( (lv_wildcard_5_0= '*' ) )
-                            // InternalDataDSL.g:2950:7: (lv_wildcard_5_0= '*' )
+                            // InternalDataDSL.g:3570:6: ( (lv_wildcard_5_0= '*' ) )
+                            // InternalDataDSL.g:3571:7: (lv_wildcard_5_0= '*' )
                             {
-                            // InternalDataDSL.g:2950:7: (lv_wildcard_5_0= '*' )
-                            // InternalDataDSL.g:2951:8: lv_wildcard_5_0= '*'
+                            // InternalDataDSL.g:3571:7: (lv_wildcard_5_0= '*' )
+                            // InternalDataDSL.g:3572:8: lv_wildcard_5_0= '*'
                             {
-                            lv_wildcard_5_0=(Token)match(input,77,FOLLOW_72); if (state.failed) return current;
+                            lv_wildcard_5_0=(Token)match(input,90,FOLLOW_78); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               								newLeafNode(lv_wildcard_5_0, grammarAccess.getXImportDeclarationAccess().getWildcardAsteriskKeyword_2_0_3_0_0());
@@ -7996,20 +9707,20 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:2964:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalDataDSL.g:3585:6: ( (lv_memberName_6_0= ruleValidID ) )
                             {
-                            // InternalDataDSL.g:2964:6: ( (lv_memberName_6_0= ruleValidID ) )
-                            // InternalDataDSL.g:2965:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalDataDSL.g:3585:6: ( (lv_memberName_6_0= ruleValidID ) )
+                            // InternalDataDSL.g:3586:7: (lv_memberName_6_0= ruleValidID )
                             {
-                            // InternalDataDSL.g:2965:7: (lv_memberName_6_0= ruleValidID )
-                            // InternalDataDSL.g:2966:8: lv_memberName_6_0= ruleValidID
+                            // InternalDataDSL.g:3586:7: (lv_memberName_6_0= ruleValidID )
+                            // InternalDataDSL.g:3587:8: lv_memberName_6_0= ruleValidID
                             {
                             if ( state.backtracking==0 ) {
 
                               								newCompositeNode(grammarAccess.getXImportDeclarationAccess().getMemberNameValidIDParserRuleCall_2_0_3_1_0());
                               							
                             }
-                            pushFollow(FOLLOW_72);
+                            pushFollow(FOLLOW_78);
                             lv_memberName_6_0=ruleValidID();
 
                             state._fsp--;
@@ -8046,13 +9757,13 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:2986:4: ( ( ruleQualifiedName ) )
+                    // InternalDataDSL.g:3607:4: ( ( ruleQualifiedName ) )
                     {
-                    // InternalDataDSL.g:2986:4: ( ( ruleQualifiedName ) )
-                    // InternalDataDSL.g:2987:5: ( ruleQualifiedName )
+                    // InternalDataDSL.g:3607:4: ( ( ruleQualifiedName ) )
+                    // InternalDataDSL.g:3608:5: ( ruleQualifiedName )
                     {
-                    // InternalDataDSL.g:2987:5: ( ruleQualifiedName )
-                    // InternalDataDSL.g:2988:6: ruleQualifiedName
+                    // InternalDataDSL.g:3608:5: ( ruleQualifiedName )
+                    // InternalDataDSL.g:3609:6: ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
@@ -8066,7 +9777,7 @@
                       						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedTypeJvmDeclaredTypeCrossReference_2_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_72);
+                    pushFollow(FOLLOW_78);
                     ruleQualifiedName();
 
                     state._fsp--;
@@ -8086,20 +9797,20 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3003:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalDataDSL.g:3624:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
                     {
-                    // InternalDataDSL.g:3003:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
-                    // InternalDataDSL.g:3004:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalDataDSL.g:3624:4: ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) )
+                    // InternalDataDSL.g:3625:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
                     {
-                    // InternalDataDSL.g:3004:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
-                    // InternalDataDSL.g:3005:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
+                    // InternalDataDSL.g:3625:5: (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard )
+                    // InternalDataDSL.g:3626:6: lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedNamespaceQualifiedNameWithWildcardParserRuleCall_2_2_0());
                       					
                     }
-                    pushFollow(FOLLOW_72);
+                    pushFollow(FOLLOW_78);
                     lv_importedNamespace_8_0=ruleQualifiedNameWithWildcard();
 
                     state._fsp--;
@@ -8127,18 +9838,18 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3023:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalDataDSL.g:3644:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
                     {
-                    // InternalDataDSL.g:3023:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
-                    // InternalDataDSL.g:3024:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalDataDSL.g:3644:4: ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) )
+                    // InternalDataDSL.g:3645:5: ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
                     {
-                    // InternalDataDSL.g:3024:5: ( (lv_fqnImport_9_0= 'ns' ) )
-                    // InternalDataDSL.g:3025:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalDataDSL.g:3645:5: ( (lv_fqnImport_9_0= 'ns' ) )
+                    // InternalDataDSL.g:3646:6: (lv_fqnImport_9_0= 'ns' )
                     {
-                    // InternalDataDSL.g:3025:6: (lv_fqnImport_9_0= 'ns' )
-                    // InternalDataDSL.g:3026:7: lv_fqnImport_9_0= 'ns'
+                    // InternalDataDSL.g:3646:6: (lv_fqnImport_9_0= 'ns' )
+                    // InternalDataDSL.g:3647:7: lv_fqnImport_9_0= 'ns'
                     {
-                    lv_fqnImport_9_0=(Token)match(input,78,FOLLOW_4); if (state.failed) return current;
+                    lv_fqnImport_9_0=(Token)match(input,91,FOLLOW_4); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       							newLeafNode(lv_fqnImport_9_0, grammarAccess.getXImportDeclarationAccess().getFqnImportNsKeyword_2_3_0_0());
@@ -8158,18 +9869,18 @@
 
                     }
 
-                    // InternalDataDSL.g:3038:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
-                    // InternalDataDSL.g:3039:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalDataDSL.g:3659:5: ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) )
+                    // InternalDataDSL.g:3660:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
                     {
-                    // InternalDataDSL.g:3039:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
-                    // InternalDataDSL.g:3040:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
+                    // InternalDataDSL.g:3660:6: (lv_importedFullyQualifiedName_10_0= ruleQualifiedName )
+                    // InternalDataDSL.g:3661:7: lv_importedFullyQualifiedName_10_0= ruleQualifiedName
                     {
                     if ( state.backtracking==0 ) {
 
                       							newCompositeNode(grammarAccess.getXImportDeclarationAccess().getImportedFullyQualifiedNameQualifiedNameParserRuleCall_2_3_1_0());
                       						
                     }
-                    pushFollow(FOLLOW_72);
+                    pushFollow(FOLLOW_78);
                     lv_importedFullyQualifiedName_10_0=ruleQualifiedName();
 
                     state._fsp--;
@@ -8202,18 +9913,18 @@
 
             }
 
-            // InternalDataDSL.g:3059:3: (otherlv_11= ';' )?
-            int alt55=2;
-            int LA55_0 = input.LA(1);
+            // InternalDataDSL.g:3680:3: (otherlv_11= ';' )?
+            int alt62=2;
+            int LA62_0 = input.LA(1);
 
-            if ( (LA55_0==79) ) {
-                alt55=1;
+            if ( (LA62_0==92) ) {
+                alt62=1;
             }
-            switch (alt55) {
+            switch (alt62) {
                 case 1 :
-                    // InternalDataDSL.g:3060:4: otherlv_11= ';'
+                    // InternalDataDSL.g:3681:4: otherlv_11= ';'
                     {
-                    otherlv_11=(Token)match(input,79,FOLLOW_2); if (state.failed) return current;
+                    otherlv_11=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_11, grammarAccess.getXImportDeclarationAccess().getSemicolonKeyword_3());
@@ -8250,7 +9961,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotation"
-    // InternalDataDSL.g:3069:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
+    // InternalDataDSL.g:3690:1: entryRuleXAnnotation returns [EObject current=null] : iv_ruleXAnnotation= ruleXAnnotation EOF ;
     public final EObject entryRuleXAnnotation() throws RecognitionException {
         EObject current = null;
 
@@ -8258,8 +9969,8 @@
 
 
         try {
-            // InternalDataDSL.g:3069:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
-            // InternalDataDSL.g:3070:2: iv_ruleXAnnotation= ruleXAnnotation EOF
+            // InternalDataDSL.g:3690:52: (iv_ruleXAnnotation= ruleXAnnotation EOF )
+            // InternalDataDSL.g:3691:2: iv_ruleXAnnotation= ruleXAnnotation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationRule()); 
@@ -8290,7 +10001,7 @@
 
 
     // $ANTLR start "ruleXAnnotation"
-    // InternalDataDSL.g:3076:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
+    // InternalDataDSL.g:3697:1: ruleXAnnotation returns [EObject current=null] : ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) ;
     public final EObject ruleXAnnotation() throws RecognitionException {
         EObject current = null;
 
@@ -8309,14 +10020,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3082:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
-            // InternalDataDSL.g:3083:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            // InternalDataDSL.g:3703:2: ( ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? ) )
+            // InternalDataDSL.g:3704:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
             {
-            // InternalDataDSL.g:3083:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
-            // InternalDataDSL.g:3084:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            // InternalDataDSL.g:3704:2: ( () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )? )
+            // InternalDataDSL.g:3705:3: () otherlv_1= '@' ( ( ruleQualifiedName ) ) ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
             {
-            // InternalDataDSL.g:3084:3: ()
-            // InternalDataDSL.g:3085:4: 
+            // InternalDataDSL.g:3705:3: ()
+            // InternalDataDSL.g:3706:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -8328,17 +10039,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,80,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,93,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXAnnotationAccess().getCommercialAtKeyword_1());
               		
             }
-            // InternalDataDSL.g:3095:3: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:3096:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:3716:3: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:3717:4: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:3096:4: ( ruleQualifiedName )
-            // InternalDataDSL.g:3097:5: ruleQualifiedName
+            // InternalDataDSL.g:3717:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:3718:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -8352,7 +10063,7 @@
               					newCompositeNode(grammarAccess.getXAnnotationAccess().getAnnotationTypeJvmAnnotationTypeCrossReference_2_0());
               				
             }
-            pushFollow(FOLLOW_73);
+            pushFollow(FOLLOW_79);
             ruleQualifiedName();
 
             state._fsp--;
@@ -8368,21 +10079,21 @@
 
             }
 
-            // InternalDataDSL.g:3111:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
-            int alt58=2;
-            int LA58_0 = input.LA(1);
+            // InternalDataDSL.g:3732:3: ( ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')' )?
+            int alt65=2;
+            int LA65_0 = input.LA(1);
 
-            if ( (LA58_0==81) && (synpred1_InternalDataDSL())) {
-                alt58=1;
+            if ( (LA65_0==94) && (synpred1_InternalDataDSL())) {
+                alt65=1;
             }
-            switch (alt58) {
+            switch (alt65) {
                 case 1 :
-                    // InternalDataDSL.g:3112:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
+                    // InternalDataDSL.g:3733:4: ( ( '(' )=>otherlv_3= '(' ) ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )? otherlv_8= ')'
                     {
-                    // InternalDataDSL.g:3112:4: ( ( '(' )=>otherlv_3= '(' )
-                    // InternalDataDSL.g:3113:5: ( '(' )=>otherlv_3= '('
+                    // InternalDataDSL.g:3733:4: ( ( '(' )=>otherlv_3= '(' )
+                    // InternalDataDSL.g:3734:5: ( '(' )=>otherlv_3= '('
                     {
-                    otherlv_3=(Token)match(input,81,FOLLOW_74); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,94,FOLLOW_80); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_3, grammarAccess.getXAnnotationAccess().getLeftParenthesisKeyword_3_0());
@@ -8391,28 +10102,28 @@
 
                     }
 
-                    // InternalDataDSL.g:3119:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
-                    int alt57=3;
-                    alt57 = dfa57.predict(input);
-                    switch (alt57) {
+                    // InternalDataDSL.g:3740:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?
+                    int alt64=3;
+                    alt64 = dfa64.predict(input);
+                    switch (alt64) {
                         case 1 :
-                            // InternalDataDSL.g:3120:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalDataDSL.g:3741:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
                             {
-                            // InternalDataDSL.g:3120:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
-                            // InternalDataDSL.g:3121:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            // InternalDataDSL.g:3741:5: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* )
+                            // InternalDataDSL.g:3742:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
                             {
-                            // InternalDataDSL.g:3121:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
-                            // InternalDataDSL.g:3122:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalDataDSL.g:3742:6: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) )
+                            // InternalDataDSL.g:3743:7: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
                             {
-                            // InternalDataDSL.g:3131:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
-                            // InternalDataDSL.g:3132:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
+                            // InternalDataDSL.g:3752:7: (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair )
+                            // InternalDataDSL.g:3753:8: lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair
                             {
                             if ( state.backtracking==0 ) {
 
                               								newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_0_0());
                               							
                             }
-                            pushFollow(FOLLOW_75);
+                            pushFollow(FOLLOW_81);
                             lv_elementValuePairs_4_0=ruleXAnnotationElementValuePair();
 
                             state._fsp--;
@@ -8436,39 +10147,39 @@
 
                             }
 
-                            // InternalDataDSL.g:3149:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
-                            loop56:
+                            // InternalDataDSL.g:3770:6: (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )*
+                            loop63:
                             do {
-                                int alt56=2;
-                                int LA56_0 = input.LA(1);
+                                int alt63=2;
+                                int LA63_0 = input.LA(1);
 
-                                if ( (LA56_0==82) ) {
-                                    alt56=1;
+                                if ( (LA63_0==95) ) {
+                                    alt63=1;
                                 }
 
 
-                                switch (alt56) {
+                                switch (alt63) {
                             	case 1 :
-                            	    // InternalDataDSL.g:3150:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalDataDSL.g:3771:7: otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
                             	    {
-                            	    otherlv_5=(Token)match(input,82,FOLLOW_4); if (state.failed) return current;
+                            	    otherlv_5=(Token)match(input,95,FOLLOW_4); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      							newLeafNode(otherlv_5, grammarAccess.getXAnnotationAccess().getCommaKeyword_3_1_0_1_0());
                             	      						
                             	    }
-                            	    // InternalDataDSL.g:3154:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
-                            	    // InternalDataDSL.g:3155:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalDataDSL.g:3775:7: ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) )
+                            	    // InternalDataDSL.g:3776:8: ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
                             	    {
-                            	    // InternalDataDSL.g:3164:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
-                            	    // InternalDataDSL.g:3165:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
+                            	    // InternalDataDSL.g:3785:8: (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair )
+                            	    // InternalDataDSL.g:3786:9: lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      									newCompositeNode(grammarAccess.getXAnnotationAccess().getElementValuePairsXAnnotationElementValuePairParserRuleCall_3_1_0_1_1_0());
                             	      								
                             	    }
-                            	    pushFollow(FOLLOW_75);
+                            	    pushFollow(FOLLOW_81);
                             	    lv_elementValuePairs_6_0=ruleXAnnotationElementValuePair();
 
                             	    state._fsp--;
@@ -8497,7 +10208,7 @@
                             	    break;
 
                             	default :
-                            	    break loop56;
+                            	    break loop63;
                                 }
                             } while (true);
 
@@ -8508,20 +10219,20 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:3185:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalDataDSL.g:3806:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
                             {
-                            // InternalDataDSL.g:3185:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
-                            // InternalDataDSL.g:3186:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalDataDSL.g:3806:5: ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) )
+                            // InternalDataDSL.g:3807:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
                             {
-                            // InternalDataDSL.g:3186:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
-                            // InternalDataDSL.g:3187:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
+                            // InternalDataDSL.g:3807:6: (lv_value_7_0= ruleXAnnotationElementValueOrCommaList )
+                            // InternalDataDSL.g:3808:7: lv_value_7_0= ruleXAnnotationElementValueOrCommaList
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXAnnotationAccess().getValueXAnnotationElementValueOrCommaListParserRuleCall_3_1_1_0());
                               						
                             }
-                            pushFollow(FOLLOW_76);
+                            pushFollow(FOLLOW_82);
                             lv_value_7_0=ruleXAnnotationElementValueOrCommaList();
 
                             state._fsp--;
@@ -8551,7 +10262,7 @@
 
                     }
 
-                    otherlv_8=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
+                    otherlv_8=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_8, grammarAccess.getXAnnotationAccess().getRightParenthesisKeyword_3_2());
@@ -8588,7 +10299,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValuePair"
-    // InternalDataDSL.g:3214:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
+    // InternalDataDSL.g:3835:1: entryRuleXAnnotationElementValuePair returns [EObject current=null] : iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF ;
     public final EObject entryRuleXAnnotationElementValuePair() throws RecognitionException {
         EObject current = null;
 
@@ -8596,8 +10307,8 @@
 
 
         try {
-            // InternalDataDSL.g:3214:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
-            // InternalDataDSL.g:3215:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
+            // InternalDataDSL.g:3835:68: (iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF )
+            // InternalDataDSL.g:3836:2: iv_ruleXAnnotationElementValuePair= ruleXAnnotationElementValuePair EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValuePairRule()); 
@@ -8628,7 +10339,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValuePair"
-    // InternalDataDSL.g:3221:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
+    // InternalDataDSL.g:3842:1: ruleXAnnotationElementValuePair returns [EObject current=null] : ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) ;
     public final EObject ruleXAnnotationElementValuePair() throws RecognitionException {
         EObject current = null;
 
@@ -8640,23 +10351,23 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3227:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
-            // InternalDataDSL.g:3228:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalDataDSL.g:3848:2: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) ) )
+            // InternalDataDSL.g:3849:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
             {
-            // InternalDataDSL.g:3228:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
-            // InternalDataDSL.g:3229:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalDataDSL.g:3849:2: ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) ) )
+            // InternalDataDSL.g:3850:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) ) ( (lv_value_2_0= ruleXAnnotationElementValue ) )
             {
-            // InternalDataDSL.g:3229:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
-            // InternalDataDSL.g:3230:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalDataDSL.g:3850:3: ( ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' ) )
+            // InternalDataDSL.g:3851:4: ( ( ( ( ruleValidID ) ) '=' ) )=> ( ( ( ruleValidID ) ) otherlv_1= '=' )
             {
-            // InternalDataDSL.g:3239:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
-            // InternalDataDSL.g:3240:5: ( ( ruleValidID ) ) otherlv_1= '='
+            // InternalDataDSL.g:3860:4: ( ( ( ruleValidID ) ) otherlv_1= '=' )
+            // InternalDataDSL.g:3861:5: ( ( ruleValidID ) ) otherlv_1= '='
             {
-            // InternalDataDSL.g:3240:5: ( ( ruleValidID ) )
-            // InternalDataDSL.g:3241:6: ( ruleValidID )
+            // InternalDataDSL.g:3861:5: ( ( ruleValidID ) )
+            // InternalDataDSL.g:3862:6: ( ruleValidID )
             {
-            // InternalDataDSL.g:3241:6: ( ruleValidID )
-            // InternalDataDSL.g:3242:7: ruleValidID
+            // InternalDataDSL.g:3862:6: ( ruleValidID )
+            // InternalDataDSL.g:3863:7: ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -8670,7 +10381,7 @@
               							newCompositeNode(grammarAccess.getXAnnotationElementValuePairAccess().getElementJvmOperationCrossReference_0_0_0_0());
               						
             }
-            pushFollow(FOLLOW_77);
+            pushFollow(FOLLOW_83);
             ruleValidID();
 
             state._fsp--;
@@ -8686,7 +10397,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,84,FOLLOW_78); if (state.failed) return current;
+            otherlv_1=(Token)match(input,97,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValuePairAccess().getEqualsSignKeyword_0_0_1());
@@ -8698,11 +10409,11 @@
 
             }
 
-            // InternalDataDSL.g:3262:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
-            // InternalDataDSL.g:3263:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalDataDSL.g:3883:3: ( (lv_value_2_0= ruleXAnnotationElementValue ) )
+            // InternalDataDSL.g:3884:4: (lv_value_2_0= ruleXAnnotationElementValue )
             {
-            // InternalDataDSL.g:3263:4: (lv_value_2_0= ruleXAnnotationElementValue )
-            // InternalDataDSL.g:3264:5: lv_value_2_0= ruleXAnnotationElementValue
+            // InternalDataDSL.g:3884:4: (lv_value_2_0= ruleXAnnotationElementValue )
+            // InternalDataDSL.g:3885:5: lv_value_2_0= ruleXAnnotationElementValue
             {
             if ( state.backtracking==0 ) {
 
@@ -8758,7 +10469,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValueOrCommaList"
-    // InternalDataDSL.g:3285:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
+    // InternalDataDSL.g:3906:1: entryRuleXAnnotationElementValueOrCommaList returns [EObject current=null] : iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF ;
     public final EObject entryRuleXAnnotationElementValueOrCommaList() throws RecognitionException {
         EObject current = null;
 
@@ -8766,8 +10477,8 @@
 
 
         try {
-            // InternalDataDSL.g:3285:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
-            // InternalDataDSL.g:3286:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
+            // InternalDataDSL.g:3906:75: (iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF )
+            // InternalDataDSL.g:3907:2: iv_ruleXAnnotationElementValueOrCommaList= ruleXAnnotationElementValueOrCommaList EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListRule()); 
@@ -8798,7 +10509,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValueOrCommaList"
-    // InternalDataDSL.g:3292:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
+    // InternalDataDSL.g:3913:1: ruleXAnnotationElementValueOrCommaList returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) ;
     public final EObject ruleXAnnotationElementValueOrCommaList() throws RecognitionException {
         EObject current = null;
 
@@ -8820,27 +10531,27 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3298:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
-            // InternalDataDSL.g:3299:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            // InternalDataDSL.g:3919:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) ) )
+            // InternalDataDSL.g:3920:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
             {
-            // InternalDataDSL.g:3299:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
-            int alt63=2;
-            alt63 = dfa63.predict(input);
-            switch (alt63) {
+            // InternalDataDSL.g:3920:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )
+            int alt70=2;
+            alt70 = dfa70.predict(input);
+            switch (alt70) {
                 case 1 :
-                    // InternalDataDSL.g:3300:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalDataDSL.g:3921:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                     {
-                    // InternalDataDSL.g:3300:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
-                    // InternalDataDSL.g:3301:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    // InternalDataDSL.g:3921:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalDataDSL.g:3922:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                     {
-                    // InternalDataDSL.g:3301:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
-                    // InternalDataDSL.g:3302:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalDataDSL.g:3922:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalDataDSL.g:3923:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                     {
-                    // InternalDataDSL.g:3309:5: ( () otherlv_1= '#' otherlv_2= '[' )
-                    // InternalDataDSL.g:3310:6: () otherlv_1= '#' otherlv_2= '['
+                    // InternalDataDSL.g:3930:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalDataDSL.g:3931:6: () otherlv_1= '#' otherlv_2= '['
                     {
-                    // InternalDataDSL.g:3310:6: ()
-                    // InternalDataDSL.g:3311:7: 
+                    // InternalDataDSL.g:3931:6: ()
+                    // InternalDataDSL.g:3932:7: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -8852,13 +10563,13 @@
 
                     }
 
-                    otherlv_1=(Token)match(input,85,FOLLOW_79); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,98,FOLLOW_85); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getNumberSignKeyword_0_0_0_1());
                       					
                     }
-                    otherlv_2=(Token)match(input,86,FOLLOW_80); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,99,FOLLOW_86); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getLeftSquareBracketKeyword_0_0_0_2());
@@ -8870,29 +10581,29 @@
 
                     }
 
-                    // InternalDataDSL.g:3327:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
-                    int alt60=2;
-                    int LA60_0 = input.LA(1);
+                    // InternalDataDSL.g:3948:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt67=2;
+                    int LA67_0 = input.LA(1);
 
-                    if ( ((LA60_0>=RULE_STRING && LA60_0<=RULE_DECIMAL)||LA60_0==14||LA60_0==50||LA60_0==72||(LA60_0>=75 && LA60_0<=76)||(LA60_0>=80 && LA60_0<=81)||(LA60_0>=85 && LA60_0<=86)||LA60_0==93||(LA60_0>=109 && LA60_0<=110)||LA60_0==114||LA60_0==120||LA60_0==122||(LA60_0>=126 && LA60_0<=127)||(LA60_0>=130 && LA60_0<=139)||LA60_0==141) ) {
-                        alt60=1;
+                    if ( ((LA67_0>=RULE_STRING && LA67_0<=RULE_DECIMAL)||LA67_0==14||LA67_0==52||LA67_0==75||(LA67_0>=88 && LA67_0<=89)||(LA67_0>=93 && LA67_0<=94)||(LA67_0>=98 && LA67_0<=99)||LA67_0==106||(LA67_0>=122 && LA67_0<=123)||LA67_0==127||LA67_0==133||LA67_0==135||(LA67_0>=139 && LA67_0<=140)||(LA67_0>=143 && LA67_0<=152)||LA67_0==154) ) {
+                        alt67=1;
                     }
-                    switch (alt60) {
+                    switch (alt67) {
                         case 1 :
-                            // InternalDataDSL.g:3328:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalDataDSL.g:3949:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             {
-                            // InternalDataDSL.g:3328:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
-                            // InternalDataDSL.g:3329:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalDataDSL.g:3949:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalDataDSL.g:3950:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                             {
-                            // InternalDataDSL.g:3329:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
-                            // InternalDataDSL.g:3330:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            // InternalDataDSL.g:3950:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalDataDSL.g:3951:7: lv_elements_3_0= ruleXAnnotationOrExpression
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                               						
                             }
-                            pushFollow(FOLLOW_81);
+                            pushFollow(FOLLOW_87);
                             lv_elements_3_0=ruleXAnnotationOrExpression();
 
                             state._fsp--;
@@ -8916,39 +10627,39 @@
 
                             }
 
-                            // InternalDataDSL.g:3347:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
-                            loop59:
+                            // InternalDataDSL.g:3968:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop66:
                             do {
-                                int alt59=2;
-                                int LA59_0 = input.LA(1);
+                                int alt66=2;
+                                int LA66_0 = input.LA(1);
 
-                                if ( (LA59_0==82) ) {
-                                    alt59=1;
+                                if ( (LA66_0==95) ) {
+                                    alt66=1;
                                 }
 
 
-                                switch (alt59) {
+                                switch (alt66) {
                             	case 1 :
-                            	    // InternalDataDSL.g:3348:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:3969:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                             	    {
-                            	    otherlv_4=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                            	    otherlv_4=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalDataDSL.g:3352:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalDataDSL.g:3353:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:3973:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:3974:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalDataDSL.g:3353:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
-                            	    // InternalDataDSL.g:3354:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    // InternalDataDSL.g:3974:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:3975:8: lv_elements_5_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                             	      							
                             	    }
-                            	    pushFollow(FOLLOW_81);
+                            	    pushFollow(FOLLOW_87);
                             	    lv_elements_5_0=ruleXAnnotationOrExpression();
 
                             	    state._fsp--;
@@ -8977,7 +10688,7 @@
                             	    break;
 
                             	default :
-                            	    break loop59;
+                            	    break loop66;
                                 }
                             } while (true);
 
@@ -8987,7 +10698,7 @@
 
                     }
 
-                    otherlv_6=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getRightSquareBracketKeyword_0_2());
@@ -9000,17 +10711,17 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3379:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalDataDSL.g:4000:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
                     {
-                    // InternalDataDSL.g:3379:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
-                    // InternalDataDSL.g:3380:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    // InternalDataDSL.g:4000:3: (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? )
+                    // InternalDataDSL.g:4001:4: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
                     {
                     if ( state.backtracking==0 ) {
 
                       				newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getXAnnotationOrExpressionParserRuleCall_1_0());
                       			
                     }
-                    pushFollow(FOLLOW_82);
+                    pushFollow(FOLLOW_88);
                     this_XAnnotationOrExpression_7=ruleXAnnotationOrExpression();
 
                     state._fsp--;
@@ -9021,19 +10732,19 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalDataDSL.g:3388:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
-                    int alt62=2;
-                    int LA62_0 = input.LA(1);
+                    // InternalDataDSL.g:4009:4: ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )?
+                    int alt69=2;
+                    int LA69_0 = input.LA(1);
 
-                    if ( (LA62_0==82) ) {
-                        alt62=1;
+                    if ( (LA69_0==95) ) {
+                        alt69=1;
                     }
-                    switch (alt62) {
+                    switch (alt69) {
                         case 1 :
-                            // InternalDataDSL.g:3389:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            // InternalDataDSL.g:4010:5: () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
                             {
-                            // InternalDataDSL.g:3389:5: ()
-                            // InternalDataDSL.g:3390:6: 
+                            // InternalDataDSL.g:4010:5: ()
+                            // InternalDataDSL.g:4011:6: 
                             {
                             if ( state.backtracking==0 ) {
 
@@ -9045,40 +10756,40 @@
 
                             }
 
-                            // InternalDataDSL.g:3396:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
-                            int cnt61=0;
-                            loop61:
+                            // InternalDataDSL.g:4017:5: (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+
+                            int cnt68=0;
+                            loop68:
                             do {
-                                int alt61=2;
-                                int LA61_0 = input.LA(1);
+                                int alt68=2;
+                                int LA68_0 = input.LA(1);
 
-                                if ( (LA61_0==82) ) {
-                                    alt61=1;
+                                if ( (LA68_0==95) ) {
+                                    alt68=1;
                                 }
 
 
-                                switch (alt61) {
+                                switch (alt68) {
                             	case 1 :
-                            	    // InternalDataDSL.g:3397:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:4018:6: otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
                             	    {
-                            	    otherlv_9=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                            	    otherlv_9=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      						newLeafNode(otherlv_9, grammarAccess.getXAnnotationElementValueOrCommaListAccess().getCommaKeyword_1_1_1_0());
                             	      					
                             	    }
-                            	    // InternalDataDSL.g:3401:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalDataDSL.g:3402:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:4022:6: ( (lv_elements_10_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:4023:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalDataDSL.g:3402:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
-                            	    // InternalDataDSL.g:3403:8: lv_elements_10_0= ruleXAnnotationOrExpression
+                            	    // InternalDataDSL.g:4023:7: (lv_elements_10_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:4024:8: lv_elements_10_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      								newCompositeNode(grammarAccess.getXAnnotationElementValueOrCommaListAccess().getElementsXAnnotationOrExpressionParserRuleCall_1_1_1_1_0());
                             	      							
                             	    }
-                            	    pushFollow(FOLLOW_82);
+                            	    pushFollow(FOLLOW_88);
                             	    lv_elements_10_0=ruleXAnnotationOrExpression();
 
                             	    state._fsp--;
@@ -9107,13 +10818,13 @@
                             	    break;
 
                             	default :
-                            	    if ( cnt61 >= 1 ) break loop61;
+                            	    if ( cnt68 >= 1 ) break loop68;
                             	    if (state.backtracking>0) {state.failed=true; return current;}
                                         EarlyExitException eee =
-                                            new EarlyExitException(61, input);
+                                            new EarlyExitException(68, input);
                                         throw eee;
                                 }
-                                cnt61++;
+                                cnt68++;
                             } while (true);
 
 
@@ -9153,7 +10864,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationElementValue"
-    // InternalDataDSL.g:3427:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
+    // InternalDataDSL.g:4048:1: entryRuleXAnnotationElementValue returns [EObject current=null] : iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF ;
     public final EObject entryRuleXAnnotationElementValue() throws RecognitionException {
         EObject current = null;
 
@@ -9161,8 +10872,8 @@
 
 
         try {
-            // InternalDataDSL.g:3427:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
-            // InternalDataDSL.g:3428:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
+            // InternalDataDSL.g:4048:64: (iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF )
+            // InternalDataDSL.g:4049:2: iv_ruleXAnnotationElementValue= ruleXAnnotationElementValue EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationElementValueRule()); 
@@ -9193,7 +10904,7 @@
 
 
     // $ANTLR start "ruleXAnnotationElementValue"
-    // InternalDataDSL.g:3434:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
+    // InternalDataDSL.g:4055:1: ruleXAnnotationElementValue returns [EObject current=null] : ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) ;
     public final EObject ruleXAnnotationElementValue() throws RecognitionException {
         EObject current = null;
 
@@ -9212,27 +10923,27 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3440:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
-            // InternalDataDSL.g:3441:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            // InternalDataDSL.g:4061:2: ( ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ) )
+            // InternalDataDSL.g:4062:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
             {
-            // InternalDataDSL.g:3441:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
-            int alt66=2;
-            alt66 = dfa66.predict(input);
-            switch (alt66) {
+            // InternalDataDSL.g:4062:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )
+            int alt73=2;
+            alt73 = dfa73.predict(input);
+            switch (alt73) {
                 case 1 :
-                    // InternalDataDSL.g:3442:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalDataDSL.g:4063:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
                     {
-                    // InternalDataDSL.g:3442:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
-                    // InternalDataDSL.g:3443:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
+                    // InternalDataDSL.g:4063:3: ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' )
+                    // InternalDataDSL.g:4064:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']'
                     {
-                    // InternalDataDSL.g:3443:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
-                    // InternalDataDSL.g:3444:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalDataDSL.g:4064:4: ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) )
+                    // InternalDataDSL.g:4065:5: ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' )
                     {
-                    // InternalDataDSL.g:3451:5: ( () otherlv_1= '#' otherlv_2= '[' )
-                    // InternalDataDSL.g:3452:6: () otherlv_1= '#' otherlv_2= '['
+                    // InternalDataDSL.g:4072:5: ( () otherlv_1= '#' otherlv_2= '[' )
+                    // InternalDataDSL.g:4073:6: () otherlv_1= '#' otherlv_2= '['
                     {
-                    // InternalDataDSL.g:3452:6: ()
-                    // InternalDataDSL.g:3453:7: 
+                    // InternalDataDSL.g:4073:6: ()
+                    // InternalDataDSL.g:4074:7: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9244,13 +10955,13 @@
 
                     }
 
-                    otherlv_1=(Token)match(input,85,FOLLOW_79); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,98,FOLLOW_85); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(otherlv_1, grammarAccess.getXAnnotationElementValueAccess().getNumberSignKeyword_0_0_0_1());
                       					
                     }
-                    otherlv_2=(Token)match(input,86,FOLLOW_80); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,99,FOLLOW_86); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(otherlv_2, grammarAccess.getXAnnotationElementValueAccess().getLeftSquareBracketKeyword_0_0_0_2());
@@ -9262,29 +10973,29 @@
 
                     }
 
-                    // InternalDataDSL.g:3469:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
-                    int alt65=2;
-                    int LA65_0 = input.LA(1);
+                    // InternalDataDSL.g:4090:4: ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )?
+                    int alt72=2;
+                    int LA72_0 = input.LA(1);
 
-                    if ( ((LA65_0>=RULE_STRING && LA65_0<=RULE_DECIMAL)||LA65_0==14||LA65_0==50||LA65_0==72||(LA65_0>=75 && LA65_0<=76)||(LA65_0>=80 && LA65_0<=81)||(LA65_0>=85 && LA65_0<=86)||LA65_0==93||(LA65_0>=109 && LA65_0<=110)||LA65_0==114||LA65_0==120||LA65_0==122||(LA65_0>=126 && LA65_0<=127)||(LA65_0>=130 && LA65_0<=139)||LA65_0==141) ) {
-                        alt65=1;
+                    if ( ((LA72_0>=RULE_STRING && LA72_0<=RULE_DECIMAL)||LA72_0==14||LA72_0==52||LA72_0==75||(LA72_0>=88 && LA72_0<=89)||(LA72_0>=93 && LA72_0<=94)||(LA72_0>=98 && LA72_0<=99)||LA72_0==106||(LA72_0>=122 && LA72_0<=123)||LA72_0==127||LA72_0==133||LA72_0==135||(LA72_0>=139 && LA72_0<=140)||(LA72_0>=143 && LA72_0<=152)||LA72_0==154) ) {
+                        alt72=1;
                     }
-                    switch (alt65) {
+                    switch (alt72) {
                         case 1 :
-                            // InternalDataDSL.g:3470:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            // InternalDataDSL.g:4091:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
                             {
-                            // InternalDataDSL.g:3470:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
-                            // InternalDataDSL.g:3471:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalDataDSL.g:4091:5: ( (lv_elements_3_0= ruleXAnnotationOrExpression ) )
+                            // InternalDataDSL.g:4092:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
                             {
-                            // InternalDataDSL.g:3471:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
-                            // InternalDataDSL.g:3472:7: lv_elements_3_0= ruleXAnnotationOrExpression
+                            // InternalDataDSL.g:4092:6: (lv_elements_3_0= ruleXAnnotationOrExpression )
+                            // InternalDataDSL.g:4093:7: lv_elements_3_0= ruleXAnnotationOrExpression
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_0_0());
                               						
                             }
-                            pushFollow(FOLLOW_81);
+                            pushFollow(FOLLOW_87);
                             lv_elements_3_0=ruleXAnnotationOrExpression();
 
                             state._fsp--;
@@ -9308,39 +11019,39 @@
 
                             }
 
-                            // InternalDataDSL.g:3489:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
-                            loop64:
+                            // InternalDataDSL.g:4110:5: (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )*
+                            loop71:
                             do {
-                                int alt64=2;
-                                int LA64_0 = input.LA(1);
+                                int alt71=2;
+                                int LA71_0 = input.LA(1);
 
-                                if ( (LA64_0==82) ) {
-                                    alt64=1;
+                                if ( (LA71_0==95) ) {
+                                    alt71=1;
                                 }
 
 
-                                switch (alt64) {
+                                switch (alt71) {
                             	case 1 :
-                            	    // InternalDataDSL.g:3490:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:4111:6: otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
                             	    {
-                            	    otherlv_4=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                            	    otherlv_4=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      						newLeafNode(otherlv_4, grammarAccess.getXAnnotationElementValueAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalDataDSL.g:3494:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
-                            	    // InternalDataDSL.g:3495:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:4115:6: ( (lv_elements_5_0= ruleXAnnotationOrExpression ) )
+                            	    // InternalDataDSL.g:4116:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
                             	    {
-                            	    // InternalDataDSL.g:3495:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
-                            	    // InternalDataDSL.g:3496:8: lv_elements_5_0= ruleXAnnotationOrExpression
+                            	    // InternalDataDSL.g:4116:7: (lv_elements_5_0= ruleXAnnotationOrExpression )
+                            	    // InternalDataDSL.g:4117:8: lv_elements_5_0= ruleXAnnotationOrExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      								newCompositeNode(grammarAccess.getXAnnotationElementValueAccess().getElementsXAnnotationOrExpressionParserRuleCall_0_1_1_1_0());
                             	      							
                             	    }
-                            	    pushFollow(FOLLOW_81);
+                            	    pushFollow(FOLLOW_87);
                             	    lv_elements_5_0=ruleXAnnotationOrExpression();
 
                             	    state._fsp--;
@@ -9369,7 +11080,7 @@
                             	    break;
 
                             	default :
-                            	    break loop64;
+                            	    break loop71;
                                 }
                             } while (true);
 
@@ -9379,7 +11090,7 @@
 
                     }
 
-                    otherlv_6=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_6, grammarAccess.getXAnnotationElementValueAccess().getRightSquareBracketKeyword_0_2());
@@ -9392,7 +11103,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3521:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
+                    // InternalDataDSL.g:4142:3: this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9438,7 +11149,7 @@
 
 
     // $ANTLR start "entryRuleXAnnotationOrExpression"
-    // InternalDataDSL.g:3533:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
+    // InternalDataDSL.g:4154:1: entryRuleXAnnotationOrExpression returns [EObject current=null] : iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF ;
     public final EObject entryRuleXAnnotationOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9446,8 +11157,8 @@
 
 
         try {
-            // InternalDataDSL.g:3533:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
-            // InternalDataDSL.g:3534:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
+            // InternalDataDSL.g:4154:64: (iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF )
+            // InternalDataDSL.g:4155:2: iv_ruleXAnnotationOrExpression= ruleXAnnotationOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAnnotationOrExpressionRule()); 
@@ -9478,7 +11189,7 @@
 
 
     // $ANTLR start "ruleXAnnotationOrExpression"
-    // InternalDataDSL.g:3540:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
+    // InternalDataDSL.g:4161:1: ruleXAnnotationOrExpression returns [EObject current=null] : (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) ;
     public final EObject ruleXAnnotationOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9491,29 +11202,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3546:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
-            // InternalDataDSL.g:3547:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            // InternalDataDSL.g:4167:2: ( (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression ) )
+            // InternalDataDSL.g:4168:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
             {
-            // InternalDataDSL.g:3547:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
-            int alt67=2;
-            int LA67_0 = input.LA(1);
+            // InternalDataDSL.g:4168:2: (this_XAnnotation_0= ruleXAnnotation | this_XExpression_1= ruleXExpression )
+            int alt74=2;
+            int LA74_0 = input.LA(1);
 
-            if ( (LA67_0==80) ) {
-                alt67=1;
+            if ( (LA74_0==93) ) {
+                alt74=1;
             }
-            else if ( ((LA67_0>=RULE_STRING && LA67_0<=RULE_DECIMAL)||LA67_0==14||LA67_0==50||LA67_0==72||(LA67_0>=75 && LA67_0<=76)||LA67_0==81||(LA67_0>=85 && LA67_0<=86)||LA67_0==93||(LA67_0>=109 && LA67_0<=110)||LA67_0==114||LA67_0==120||LA67_0==122||(LA67_0>=126 && LA67_0<=127)||(LA67_0>=130 && LA67_0<=139)||LA67_0==141) ) {
-                alt67=2;
+            else if ( ((LA74_0>=RULE_STRING && LA74_0<=RULE_DECIMAL)||LA74_0==14||LA74_0==52||LA74_0==75||(LA74_0>=88 && LA74_0<=89)||LA74_0==94||(LA74_0>=98 && LA74_0<=99)||LA74_0==106||(LA74_0>=122 && LA74_0<=123)||LA74_0==127||LA74_0==133||LA74_0==135||(LA74_0>=139 && LA74_0<=140)||(LA74_0>=143 && LA74_0<=152)||LA74_0==154) ) {
+                alt74=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 67, 0, input);
+                    new NoViableAltException("", 74, 0, input);
 
                 throw nvae;
             }
-            switch (alt67) {
+            switch (alt74) {
                 case 1 :
-                    // InternalDataDSL.g:3548:3: this_XAnnotation_0= ruleXAnnotation
+                    // InternalDataDSL.g:4169:3: this_XAnnotation_0= ruleXAnnotation
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9535,7 +11246,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3557:3: this_XExpression_1= ruleXExpression
+                    // InternalDataDSL.g:4178:3: this_XExpression_1= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9581,7 +11292,7 @@
 
 
     // $ANTLR start "entryRuleXExpression"
-    // InternalDataDSL.g:3569:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
+    // InternalDataDSL.g:4190:1: entryRuleXExpression returns [EObject current=null] : iv_ruleXExpression= ruleXExpression EOF ;
     public final EObject entryRuleXExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9589,8 +11300,8 @@
 
 
         try {
-            // InternalDataDSL.g:3569:52: (iv_ruleXExpression= ruleXExpression EOF )
-            // InternalDataDSL.g:3570:2: iv_ruleXExpression= ruleXExpression EOF
+            // InternalDataDSL.g:4190:52: (iv_ruleXExpression= ruleXExpression EOF )
+            // InternalDataDSL.g:4191:2: iv_ruleXExpression= ruleXExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionRule()); 
@@ -9621,7 +11332,7 @@
 
 
     // $ANTLR start "ruleXExpression"
-    // InternalDataDSL.g:3576:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
+    // InternalDataDSL.g:4197:1: ruleXExpression returns [EObject current=null] : this_XAssignment_0= ruleXAssignment ;
     public final EObject ruleXExpression() throws RecognitionException {
         EObject current = null;
 
@@ -9632,8 +11343,8 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3582:2: (this_XAssignment_0= ruleXAssignment )
-            // InternalDataDSL.g:3583:2: this_XAssignment_0= ruleXAssignment
+            // InternalDataDSL.g:4203:2: (this_XAssignment_0= ruleXAssignment )
+            // InternalDataDSL.g:4204:2: this_XAssignment_0= ruleXAssignment
             {
             if ( state.backtracking==0 ) {
 
@@ -9673,7 +11384,7 @@
 
 
     // $ANTLR start "entryRuleXAssignment"
-    // InternalDataDSL.g:3594:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
+    // InternalDataDSL.g:4215:1: entryRuleXAssignment returns [EObject current=null] : iv_ruleXAssignment= ruleXAssignment EOF ;
     public final EObject entryRuleXAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -9681,8 +11392,8 @@
 
 
         try {
-            // InternalDataDSL.g:3594:52: (iv_ruleXAssignment= ruleXAssignment EOF )
-            // InternalDataDSL.g:3595:2: iv_ruleXAssignment= ruleXAssignment EOF
+            // InternalDataDSL.g:4215:52: (iv_ruleXAssignment= ruleXAssignment EOF )
+            // InternalDataDSL.g:4216:2: iv_ruleXAssignment= ruleXAssignment EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAssignmentRule()); 
@@ -9713,7 +11424,7 @@
 
 
     // $ANTLR start "ruleXAssignment"
-    // InternalDataDSL.g:3601:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
+    // InternalDataDSL.g:4222:1: ruleXAssignment returns [EObject current=null] : ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) ;
     public final EObject ruleXAssignment() throws RecognitionException {
         EObject current = null;
 
@@ -9728,64 +11439,83 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3607:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
-            // InternalDataDSL.g:3608:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            // InternalDataDSL.g:4228:2: ( ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) ) )
+            // InternalDataDSL.g:4229:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
             {
-            // InternalDataDSL.g:3608:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
-            int alt69=2;
+            // InternalDataDSL.g:4229:2: ( ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) ) | (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? ) )
+            int alt76=2;
             switch ( input.LA(1) ) {
             case RULE_ID:
                 {
-                int LA69_1 = input.LA(2);
+                int LA76_1 = input.LA(2);
 
-                if ( (LA69_1==EOF||(LA69_1>=RULE_STRING && LA69_1<=RULE_DECIMAL)||(LA69_1>=14 && LA69_1<=15)||LA69_1==50||LA69_1==68||LA69_1==72||(LA69_1>=74 && LA69_1<=77)||LA69_1==79||(LA69_1>=81 && LA69_1<=83)||(LA69_1>=85 && LA69_1<=118)||(LA69_1>=120 && LA69_1<=142)) ) {
-                    alt69=2;
+                if ( (LA76_1==EOF||(LA76_1>=RULE_STRING && LA76_1<=RULE_DECIMAL)||(LA76_1>=14 && LA76_1<=15)||LA76_1==52||LA76_1==71||LA76_1==75||(LA76_1>=87 && LA76_1<=90)||LA76_1==92||(LA76_1>=94 && LA76_1<=96)||(LA76_1>=98 && LA76_1<=131)||(LA76_1>=133 && LA76_1<=155)) ) {
+                    alt76=2;
                 }
-                else if ( (LA69_1==84) ) {
-                    alt69=1;
+                else if ( (LA76_1==97) ) {
+                    alt76=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 69, 1, input);
+                        new NoViableAltException("", 76, 1, input);
 
                     throw nvae;
                 }
                 }
                 break;
-            case 130:
+            case 143:
                 {
-                int LA69_2 = input.LA(2);
+                int LA76_2 = input.LA(2);
 
-                if ( (LA69_2==84) ) {
-                    alt69=1;
+                if ( (LA76_2==EOF||(LA76_2>=RULE_STRING && LA76_2<=RULE_DECIMAL)||(LA76_2>=14 && LA76_2<=15)||LA76_2==52||LA76_2==71||LA76_2==75||(LA76_2>=87 && LA76_2<=90)||LA76_2==92||(LA76_2>=94 && LA76_2<=96)||(LA76_2>=98 && LA76_2<=131)||(LA76_2>=133 && LA76_2<=155)) ) {
+                    alt76=2;
                 }
-                else if ( (LA69_2==EOF||(LA69_2>=RULE_STRING && LA69_2<=RULE_DECIMAL)||(LA69_2>=14 && LA69_2<=15)||LA69_2==50||LA69_2==68||LA69_2==72||(LA69_2>=74 && LA69_2<=77)||LA69_2==79||(LA69_2>=81 && LA69_2<=83)||(LA69_2>=85 && LA69_2<=118)||(LA69_2>=120 && LA69_2<=142)) ) {
-                    alt69=2;
+                else if ( (LA76_2==97) ) {
+                    alt76=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 69, 2, input);
+                        new NoViableAltException("", 76, 2, input);
 
                     throw nvae;
                 }
                 }
                 break;
-            case 76:
+            case 89:
                 {
-                int LA69_3 = input.LA(2);
+                int LA76_3 = input.LA(2);
 
-                if ( (LA69_3==84) ) {
-                    alt69=1;
+                if ( (LA76_3==EOF||(LA76_3>=RULE_STRING && LA76_3<=RULE_DECIMAL)||(LA76_3>=14 && LA76_3<=15)||LA76_3==52||LA76_3==71||LA76_3==75||(LA76_3>=87 && LA76_3<=90)||LA76_3==92||(LA76_3>=94 && LA76_3<=96)||(LA76_3>=98 && LA76_3<=131)||(LA76_3>=133 && LA76_3<=155)) ) {
+                    alt76=2;
                 }
-                else if ( (LA69_3==EOF||(LA69_3>=RULE_STRING && LA69_3<=RULE_DECIMAL)||(LA69_3>=14 && LA69_3<=15)||LA69_3==50||LA69_3==68||LA69_3==72||(LA69_3>=74 && LA69_3<=77)||LA69_3==79||(LA69_3>=81 && LA69_3<=83)||(LA69_3>=85 && LA69_3<=118)||(LA69_3>=120 && LA69_3<=142)) ) {
-                    alt69=2;
+                else if ( (LA76_3==97) ) {
+                    alt76=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 69, 3, input);
+                        new NoViableAltException("", 76, 3, input);
+
+                    throw nvae;
+                }
+                }
+                break;
+            case 88:
+                {
+                int LA76_4 = input.LA(2);
+
+                if ( (LA76_4==EOF||(LA76_4>=RULE_STRING && LA76_4<=RULE_DECIMAL)||(LA76_4>=14 && LA76_4<=15)||LA76_4==52||LA76_4==71||LA76_4==75||(LA76_4>=87 && LA76_4<=90)||LA76_4==92||(LA76_4>=94 && LA76_4<=96)||(LA76_4>=98 && LA76_4<=131)||(LA76_4>=133 && LA76_4<=155)) ) {
+                    alt76=2;
+                }
+                else if ( (LA76_4==97) ) {
+                    alt76=1;
+                }
+                else {
+                    if (state.backtracking>0) {state.failed=true; return current;}
+                    NoViableAltException nvae =
+                        new NoViableAltException("", 76, 4, input);
 
                     throw nvae;
                 }
@@ -9793,37 +11523,18 @@
                 break;
             case 75:
                 {
-                int LA69_4 = input.LA(2);
+                int LA76_5 = input.LA(2);
 
-                if ( (LA69_4==84) ) {
-                    alt69=1;
+                if ( (LA76_5==EOF||(LA76_5>=RULE_STRING && LA76_5<=RULE_DECIMAL)||(LA76_5>=14 && LA76_5<=15)||LA76_5==52||LA76_5==71||LA76_5==75||(LA76_5>=87 && LA76_5<=90)||LA76_5==92||(LA76_5>=94 && LA76_5<=96)||(LA76_5>=98 && LA76_5<=131)||(LA76_5>=133 && LA76_5<=155)) ) {
+                    alt76=2;
                 }
-                else if ( (LA69_4==EOF||(LA69_4>=RULE_STRING && LA69_4<=RULE_DECIMAL)||(LA69_4>=14 && LA69_4<=15)||LA69_4==50||LA69_4==68||LA69_4==72||(LA69_4>=74 && LA69_4<=77)||LA69_4==79||(LA69_4>=81 && LA69_4<=83)||(LA69_4>=85 && LA69_4<=118)||(LA69_4>=120 && LA69_4<=142)) ) {
-                    alt69=2;
+                else if ( (LA76_5==97) ) {
+                    alt76=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 69, 4, input);
-
-                    throw nvae;
-                }
-                }
-                break;
-            case 72:
-                {
-                int LA69_5 = input.LA(2);
-
-                if ( (LA69_5==EOF||(LA69_5>=RULE_STRING && LA69_5<=RULE_DECIMAL)||(LA69_5>=14 && LA69_5<=15)||LA69_5==50||LA69_5==68||LA69_5==72||(LA69_5>=74 && LA69_5<=77)||LA69_5==79||(LA69_5>=81 && LA69_5<=83)||(LA69_5>=85 && LA69_5<=118)||(LA69_5>=120 && LA69_5<=142)) ) {
-                    alt69=2;
-                }
-                else if ( (LA69_5==84) ) {
-                    alt69=1;
-                }
-                else {
-                    if (state.backtracking>0) {state.failed=true; return current;}
-                    NoViableAltException nvae =
-                        new NoViableAltException("", 69, 5, input);
+                        new NoViableAltException("", 76, 5, input);
 
                     throw nvae;
                 }
@@ -9834,49 +11545,49 @@
             case RULE_HEX:
             case RULE_DECIMAL:
             case 14:
-            case 50:
-            case 81:
-            case 85:
-            case 86:
-            case 93:
-            case 109:
-            case 110:
-            case 114:
-            case 120:
+            case 52:
+            case 94:
+            case 98:
+            case 99:
+            case 106:
             case 122:
-            case 126:
+            case 123:
             case 127:
-            case 131:
-            case 132:
             case 133:
-            case 134:
             case 135:
-            case 136:
-            case 137:
-            case 138:
             case 139:
-            case 141:
+            case 140:
+            case 144:
+            case 145:
+            case 146:
+            case 147:
+            case 148:
+            case 149:
+            case 150:
+            case 151:
+            case 152:
+            case 154:
                 {
-                alt69=2;
+                alt76=2;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 69, 0, input);
+                    new NoViableAltException("", 76, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt69) {
+            switch (alt76) {
                 case 1 :
-                    // InternalDataDSL.g:3609:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalDataDSL.g:4230:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
                     {
-                    // InternalDataDSL.g:3609:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
-                    // InternalDataDSL.g:3610:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalDataDSL.g:4230:3: ( () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) ) )
+                    // InternalDataDSL.g:4231:4: () ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ( (lv_value_3_0= ruleXAssignment ) )
                     {
-                    // InternalDataDSL.g:3610:4: ()
-                    // InternalDataDSL.g:3611:5: 
+                    // InternalDataDSL.g:4231:4: ()
+                    // InternalDataDSL.g:4232:5: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9888,11 +11599,11 @@
 
                     }
 
-                    // InternalDataDSL.g:3617:4: ( ( ruleFeatureCallID ) )
-                    // InternalDataDSL.g:3618:5: ( ruleFeatureCallID )
+                    // InternalDataDSL.g:4238:4: ( ( ruleFeatureCallID ) )
+                    // InternalDataDSL.g:4239:5: ( ruleFeatureCallID )
                     {
-                    // InternalDataDSL.g:3618:5: ( ruleFeatureCallID )
-                    // InternalDataDSL.g:3619:6: ruleFeatureCallID
+                    // InternalDataDSL.g:4239:5: ( ruleFeatureCallID )
+                    // InternalDataDSL.g:4240:6: ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9906,7 +11617,7 @@
                       						newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_77);
+                    pushFollow(FOLLOW_83);
                     ruleFeatureCallID();
 
                     state._fsp--;
@@ -9927,7 +11638,7 @@
                       				newCompositeNode(grammarAccess.getXAssignmentAccess().getOpSingleAssignParserRuleCall_0_2());
                       			
                     }
-                    pushFollow(FOLLOW_78);
+                    pushFollow(FOLLOW_84);
                     ruleOpSingleAssign();
 
                     state._fsp--;
@@ -9937,11 +11648,11 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalDataDSL.g:3640:4: ( (lv_value_3_0= ruleXAssignment ) )
-                    // InternalDataDSL.g:3641:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalDataDSL.g:4261:4: ( (lv_value_3_0= ruleXAssignment ) )
+                    // InternalDataDSL.g:4262:5: (lv_value_3_0= ruleXAssignment )
                     {
-                    // InternalDataDSL.g:3641:5: (lv_value_3_0= ruleXAssignment )
-                    // InternalDataDSL.g:3642:6: lv_value_3_0= ruleXAssignment
+                    // InternalDataDSL.g:4262:5: (lv_value_3_0= ruleXAssignment )
+                    // InternalDataDSL.g:4263:6: lv_value_3_0= ruleXAssignment
                     {
                     if ( state.backtracking==0 ) {
 
@@ -9979,17 +11690,17 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3661:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalDataDSL.g:4282:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
                     {
-                    // InternalDataDSL.g:3661:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
-                    // InternalDataDSL.g:3662:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    // InternalDataDSL.g:4282:3: (this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )? )
+                    // InternalDataDSL.g:4283:4: this_XOrExpression_4= ruleXOrExpression ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
                     {
                     if ( state.backtracking==0 ) {
 
                       				newCompositeNode(grammarAccess.getXAssignmentAccess().getXOrExpressionParserRuleCall_1_0());
                       			
                     }
-                    pushFollow(FOLLOW_83);
+                    pushFollow(FOLLOW_89);
                     this_XOrExpression_4=ruleXOrExpression();
 
                     state._fsp--;
@@ -10000,21 +11711,21 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalDataDSL.g:3670:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
-                    int alt68=2;
-                    alt68 = dfa68.predict(input);
-                    switch (alt68) {
+                    // InternalDataDSL.g:4291:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?
+                    int alt75=2;
+                    alt75 = dfa75.predict(input);
+                    switch (alt75) {
                         case 1 :
-                            // InternalDataDSL.g:3671:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalDataDSL.g:4292:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) )
                             {
-                            // InternalDataDSL.g:3671:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
-                            // InternalDataDSL.g:3672:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalDataDSL.g:4292:5: ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) )
+                            // InternalDataDSL.g:4293:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) )
                             {
-                            // InternalDataDSL.g:3682:6: ( () ( ( ruleOpMultiAssign ) ) )
-                            // InternalDataDSL.g:3683:7: () ( ( ruleOpMultiAssign ) )
+                            // InternalDataDSL.g:4303:6: ( () ( ( ruleOpMultiAssign ) ) )
+                            // InternalDataDSL.g:4304:7: () ( ( ruleOpMultiAssign ) )
                             {
-                            // InternalDataDSL.g:3683:7: ()
-                            // InternalDataDSL.g:3684:8: 
+                            // InternalDataDSL.g:4304:7: ()
+                            // InternalDataDSL.g:4305:8: 
                             {
                             if ( state.backtracking==0 ) {
 
@@ -10026,11 +11737,11 @@
 
                             }
 
-                            // InternalDataDSL.g:3690:7: ( ( ruleOpMultiAssign ) )
-                            // InternalDataDSL.g:3691:8: ( ruleOpMultiAssign )
+                            // InternalDataDSL.g:4311:7: ( ( ruleOpMultiAssign ) )
+                            // InternalDataDSL.g:4312:8: ( ruleOpMultiAssign )
                             {
-                            // InternalDataDSL.g:3691:8: ( ruleOpMultiAssign )
-                            // InternalDataDSL.g:3692:9: ruleOpMultiAssign
+                            // InternalDataDSL.g:4312:8: ( ruleOpMultiAssign )
+                            // InternalDataDSL.g:4313:9: ruleOpMultiAssign
                             {
                             if ( state.backtracking==0 ) {
 
@@ -10044,7 +11755,7 @@
                               									newCompositeNode(grammarAccess.getXAssignmentAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
                               								
                             }
-                            pushFollow(FOLLOW_78);
+                            pushFollow(FOLLOW_84);
                             ruleOpMultiAssign();
 
                             state._fsp--;
@@ -10066,11 +11777,11 @@
 
                             }
 
-                            // InternalDataDSL.g:3708:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
-                            // InternalDataDSL.g:3709:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalDataDSL.g:4329:5: ( (lv_rightOperand_7_0= ruleXAssignment ) )
+                            // InternalDataDSL.g:4330:6: (lv_rightOperand_7_0= ruleXAssignment )
                             {
-                            // InternalDataDSL.g:3709:6: (lv_rightOperand_7_0= ruleXAssignment )
-                            // InternalDataDSL.g:3710:7: lv_rightOperand_7_0= ruleXAssignment
+                            // InternalDataDSL.g:4330:6: (lv_rightOperand_7_0= ruleXAssignment )
+                            // InternalDataDSL.g:4331:7: lv_rightOperand_7_0= ruleXAssignment
                             {
                             if ( state.backtracking==0 ) {
 
@@ -10138,7 +11849,7 @@
 
 
     // $ANTLR start "entryRuleOpSingleAssign"
-    // InternalDataDSL.g:3733:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
+    // InternalDataDSL.g:4354:1: entryRuleOpSingleAssign returns [String current=null] : iv_ruleOpSingleAssign= ruleOpSingleAssign EOF ;
     public final String entryRuleOpSingleAssign() throws RecognitionException {
         String current = null;
 
@@ -10146,8 +11857,8 @@
 
 
         try {
-            // InternalDataDSL.g:3733:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
-            // InternalDataDSL.g:3734:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
+            // InternalDataDSL.g:4354:54: (iv_ruleOpSingleAssign= ruleOpSingleAssign EOF )
+            // InternalDataDSL.g:4355:2: iv_ruleOpSingleAssign= ruleOpSingleAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpSingleAssignRule()); 
@@ -10178,7 +11889,7 @@
 
 
     // $ANTLR start "ruleOpSingleAssign"
-    // InternalDataDSL.g:3740:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
+    // InternalDataDSL.g:4361:1: ruleOpSingleAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '=' ;
     public final AntlrDatatypeRuleToken ruleOpSingleAssign() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -10188,10 +11899,10 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3746:2: (kw= '=' )
-            // InternalDataDSL.g:3747:2: kw= '='
+            // InternalDataDSL.g:4367:2: (kw= '=' )
+            // InternalDataDSL.g:4368:2: kw= '='
             {
-            kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
+            kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               		current.merge(kw);
@@ -10220,7 +11931,7 @@
 
 
     // $ANTLR start "entryRuleOpMultiAssign"
-    // InternalDataDSL.g:3755:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
+    // InternalDataDSL.g:4376:1: entryRuleOpMultiAssign returns [String current=null] : iv_ruleOpMultiAssign= ruleOpMultiAssign EOF ;
     public final String entryRuleOpMultiAssign() throws RecognitionException {
         String current = null;
 
@@ -10228,8 +11939,8 @@
 
 
         try {
-            // InternalDataDSL.g:3755:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
-            // InternalDataDSL.g:3756:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
+            // InternalDataDSL.g:4376:53: (iv_ruleOpMultiAssign= ruleOpMultiAssign EOF )
+            // InternalDataDSL.g:4377:2: iv_ruleOpMultiAssign= ruleOpMultiAssign EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiAssignRule()); 
@@ -10260,7 +11971,7 @@
 
 
     // $ANTLR start "ruleOpMultiAssign"
-    // InternalDataDSL.g:3762:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
+    // InternalDataDSL.g:4383:1: ruleOpMultiAssign returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) ;
     public final AntlrDatatypeRuleToken ruleOpMultiAssign() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -10270,60 +11981,60 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3768:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
-            // InternalDataDSL.g:3769:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            // InternalDataDSL.g:4389:2: ( (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) ) )
+            // InternalDataDSL.g:4390:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
             {
-            // InternalDataDSL.g:3769:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
-            int alt71=7;
+            // InternalDataDSL.g:4390:2: (kw= '+=' | kw= '-=' | kw= '*=' | kw= '/=' | kw= '%=' | (kw= '<' kw= '<' kw= '=' ) | (kw= '>' (kw= '>' )? kw= '>=' ) )
+            int alt78=7;
             switch ( input.LA(1) ) {
-            case 88:
+            case 101:
                 {
-                alt71=1;
+                alt78=1;
                 }
                 break;
-            case 89:
+            case 102:
                 {
-                alt71=2;
+                alt78=2;
                 }
                 break;
-            case 90:
+            case 103:
                 {
-                alt71=3;
+                alt78=3;
                 }
                 break;
-            case 91:
+            case 104:
                 {
-                alt71=4;
+                alt78=4;
                 }
                 break;
-            case 92:
+            case 105:
                 {
-                alt71=5;
+                alt78=5;
                 }
                 break;
-            case 93:
+            case 106:
                 {
-                alt71=6;
+                alt78=6;
                 }
                 break;
-            case 94:
+            case 107:
                 {
-                alt71=7;
+                alt78=7;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 71, 0, input);
+                    new NoViableAltException("", 78, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt71) {
+            switch (alt78) {
                 case 1 :
-                    // InternalDataDSL.g:3770:3: kw= '+='
+                    // InternalDataDSL.g:4391:3: kw= '+='
                     {
-                    kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -10334,9 +12045,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:3776:3: kw= '-='
+                    // InternalDataDSL.g:4397:3: kw= '-='
                     {
-                    kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,102,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -10347,9 +12058,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:3782:3: kw= '*='
+                    // InternalDataDSL.g:4403:3: kw= '*='
                     {
-                    kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -10360,9 +12071,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:3788:3: kw= '/='
+                    // InternalDataDSL.g:4409:3: kw= '/='
                     {
-                    kw=(Token)match(input,91,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -10373,9 +12084,9 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:3794:3: kw= '%='
+                    // InternalDataDSL.g:4415:3: kw= '%='
                     {
-                    kw=(Token)match(input,92,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -10386,26 +12097,26 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:3800:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalDataDSL.g:4421:3: (kw= '<' kw= '<' kw= '=' )
                     {
-                    // InternalDataDSL.g:3800:3: (kw= '<' kw= '<' kw= '=' )
-                    // InternalDataDSL.g:3801:4: kw= '<' kw= '<' kw= '='
+                    // InternalDataDSL.g:4421:3: (kw= '<' kw= '<' kw= '=' )
+                    // InternalDataDSL.g:4422:4: kw= '<' kw= '<' kw= '='
                     {
-                    kw=(Token)match(input,93,FOLLOW_84); if (state.failed) return current;
+                    kw=(Token)match(input,106,FOLLOW_90); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_0());
                       			
                     }
-                    kw=(Token)match(input,93,FOLLOW_77); if (state.failed) return current;
+                    kw=(Token)match(input,106,FOLLOW_83); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getLessThanSignKeyword_5_1());
                       			
                     }
-                    kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
@@ -10419,30 +12130,30 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:3818:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalDataDSL.g:4439:3: (kw= '>' (kw= '>' )? kw= '>=' )
                     {
-                    // InternalDataDSL.g:3818:3: (kw= '>' (kw= '>' )? kw= '>=' )
-                    // InternalDataDSL.g:3819:4: kw= '>' (kw= '>' )? kw= '>='
+                    // InternalDataDSL.g:4439:3: (kw= '>' (kw= '>' )? kw= '>=' )
+                    // InternalDataDSL.g:4440:4: kw= '>' (kw= '>' )? kw= '>='
                     {
-                    kw=(Token)match(input,94,FOLLOW_85); if (state.failed) return current;
+                    kw=(Token)match(input,107,FOLLOW_91); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpMultiAssignAccess().getGreaterThanSignKeyword_6_0());
                       			
                     }
-                    // InternalDataDSL.g:3824:4: (kw= '>' )?
-                    int alt70=2;
-                    int LA70_0 = input.LA(1);
+                    // InternalDataDSL.g:4445:4: (kw= '>' )?
+                    int alt77=2;
+                    int LA77_0 = input.LA(1);
 
-                    if ( (LA70_0==94) ) {
-                        alt70=1;
+                    if ( (LA77_0==107) ) {
+                        alt77=1;
                     }
-                    switch (alt70) {
+                    switch (alt77) {
                         case 1 :
-                            // InternalDataDSL.g:3825:5: kw= '>'
+                            // InternalDataDSL.g:4446:5: kw= '>'
                             {
-                            kw=(Token)match(input,94,FOLLOW_86); if (state.failed) return current;
+                            kw=(Token)match(input,107,FOLLOW_92); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(kw);
@@ -10455,7 +12166,7 @@
 
                     }
 
-                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
@@ -10493,7 +12204,7 @@
 
 
     // $ANTLR start "entryRuleXOrExpression"
-    // InternalDataDSL.g:3841:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
+    // InternalDataDSL.g:4462:1: entryRuleXOrExpression returns [EObject current=null] : iv_ruleXOrExpression= ruleXOrExpression EOF ;
     public final EObject entryRuleXOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10501,8 +12212,8 @@
 
 
         try {
-            // InternalDataDSL.g:3841:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
-            // InternalDataDSL.g:3842:2: iv_ruleXOrExpression= ruleXOrExpression EOF
+            // InternalDataDSL.g:4462:54: (iv_ruleXOrExpression= ruleXOrExpression EOF )
+            // InternalDataDSL.g:4463:2: iv_ruleXOrExpression= ruleXOrExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOrExpressionRule()); 
@@ -10533,7 +12244,7 @@
 
 
     // $ANTLR start "ruleXOrExpression"
-    // InternalDataDSL.g:3848:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
+    // InternalDataDSL.g:4469:1: ruleXOrExpression returns [EObject current=null] : (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) ;
     public final EObject ruleXOrExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10546,18 +12257,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3854:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
-            // InternalDataDSL.g:3855:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalDataDSL.g:4475:2: ( (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* ) )
+            // InternalDataDSL.g:4476:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
             {
-            // InternalDataDSL.g:3855:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
-            // InternalDataDSL.g:3856:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            // InternalDataDSL.g:4476:2: (this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )* )
+            // InternalDataDSL.g:4477:3: this_XAndExpression_0= ruleXAndExpression ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXOrExpressionAccess().getXAndExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_87);
+            pushFollow(FOLLOW_93);
             this_XAndExpression_0=ruleXAndExpression();
 
             state._fsp--;
@@ -10568,35 +12279,35 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:3864:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
-            loop72:
+            // InternalDataDSL.g:4485:3: ( ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) ) )*
+            loop79:
             do {
-                int alt72=2;
-                int LA72_0 = input.LA(1);
+                int alt79=2;
+                int LA79_0 = input.LA(1);
 
-                if ( (LA72_0==96) ) {
-                    int LA72_2 = input.LA(2);
+                if ( (LA79_0==109) ) {
+                    int LA79_2 = input.LA(2);
 
                     if ( (synpred8_InternalDataDSL()) ) {
-                        alt72=1;
+                        alt79=1;
                     }
 
 
                 }
 
 
-                switch (alt72) {
+                switch (alt79) {
             	case 1 :
-            	    // InternalDataDSL.g:3865:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalDataDSL.g:4486:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) ) ( (lv_rightOperand_3_0= ruleXAndExpression ) )
             	    {
-            	    // InternalDataDSL.g:3865:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
-            	    // InternalDataDSL.g:3866:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
+            	    // InternalDataDSL.g:4486:4: ( ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) ) )
+            	    // InternalDataDSL.g:4487:5: ( ( () ( ( ruleOpOr ) ) ) )=> ( () ( ( ruleOpOr ) ) )
             	    {
-            	    // InternalDataDSL.g:3876:5: ( () ( ( ruleOpOr ) ) )
-            	    // InternalDataDSL.g:3877:6: () ( ( ruleOpOr ) )
+            	    // InternalDataDSL.g:4497:5: ( () ( ( ruleOpOr ) ) )
+            	    // InternalDataDSL.g:4498:6: () ( ( ruleOpOr ) )
             	    {
-            	    // InternalDataDSL.g:3877:6: ()
-            	    // InternalDataDSL.g:3878:7: 
+            	    // InternalDataDSL.g:4498:6: ()
+            	    // InternalDataDSL.g:4499:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10608,11 +12319,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:3884:6: ( ( ruleOpOr ) )
-            	    // InternalDataDSL.g:3885:7: ( ruleOpOr )
+            	    // InternalDataDSL.g:4505:6: ( ( ruleOpOr ) )
+            	    // InternalDataDSL.g:4506:7: ( ruleOpOr )
             	    {
-            	    // InternalDataDSL.g:3885:7: ( ruleOpOr )
-            	    // InternalDataDSL.g:3886:8: ruleOpOr
+            	    // InternalDataDSL.g:4506:7: ( ruleOpOr )
+            	    // InternalDataDSL.g:4507:8: ruleOpOr
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10626,7 +12337,7 @@
             	      								newCompositeNode(grammarAccess.getXOrExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpOr();
 
             	    state._fsp--;
@@ -10648,18 +12359,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:3902:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
-            	    // InternalDataDSL.g:3903:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalDataDSL.g:4523:4: ( (lv_rightOperand_3_0= ruleXAndExpression ) )
+            	    // InternalDataDSL.g:4524:5: (lv_rightOperand_3_0= ruleXAndExpression )
             	    {
-            	    // InternalDataDSL.g:3903:5: (lv_rightOperand_3_0= ruleXAndExpression )
-            	    // InternalDataDSL.g:3904:6: lv_rightOperand_3_0= ruleXAndExpression
+            	    // InternalDataDSL.g:4524:5: (lv_rightOperand_3_0= ruleXAndExpression )
+            	    // InternalDataDSL.g:4525:6: lv_rightOperand_3_0= ruleXAndExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXOrExpressionAccess().getRightOperandXAndExpressionParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_87);
+            	    pushFollow(FOLLOW_93);
             	    lv_rightOperand_3_0=ruleXAndExpression();
 
             	    state._fsp--;
@@ -10688,7 +12399,7 @@
             	    break;
 
             	default :
-            	    break loop72;
+            	    break loop79;
                 }
             } while (true);
 
@@ -10717,7 +12428,7 @@
 
 
     // $ANTLR start "entryRuleOpOr"
-    // InternalDataDSL.g:3926:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
+    // InternalDataDSL.g:4547:1: entryRuleOpOr returns [String current=null] : iv_ruleOpOr= ruleOpOr EOF ;
     public final String entryRuleOpOr() throws RecognitionException {
         String current = null;
 
@@ -10725,8 +12436,8 @@
 
 
         try {
-            // InternalDataDSL.g:3926:44: (iv_ruleOpOr= ruleOpOr EOF )
-            // InternalDataDSL.g:3927:2: iv_ruleOpOr= ruleOpOr EOF
+            // InternalDataDSL.g:4547:44: (iv_ruleOpOr= ruleOpOr EOF )
+            // InternalDataDSL.g:4548:2: iv_ruleOpOr= ruleOpOr EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpOrRule()); 
@@ -10757,7 +12468,7 @@
 
 
     // $ANTLR start "ruleOpOr"
-    // InternalDataDSL.g:3933:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
+    // InternalDataDSL.g:4554:1: ruleOpOr returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '||' ;
     public final AntlrDatatypeRuleToken ruleOpOr() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -10767,10 +12478,10 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3939:2: (kw= '||' )
-            // InternalDataDSL.g:3940:2: kw= '||'
+            // InternalDataDSL.g:4560:2: (kw= '||' )
+            // InternalDataDSL.g:4561:2: kw= '||'
             {
-            kw=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
+            kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               		current.merge(kw);
@@ -10799,7 +12510,7 @@
 
 
     // $ANTLR start "entryRuleXAndExpression"
-    // InternalDataDSL.g:3948:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
+    // InternalDataDSL.g:4569:1: entryRuleXAndExpression returns [EObject current=null] : iv_ruleXAndExpression= ruleXAndExpression EOF ;
     public final EObject entryRuleXAndExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10807,8 +12518,8 @@
 
 
         try {
-            // InternalDataDSL.g:3948:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
-            // InternalDataDSL.g:3949:2: iv_ruleXAndExpression= ruleXAndExpression EOF
+            // InternalDataDSL.g:4569:55: (iv_ruleXAndExpression= ruleXAndExpression EOF )
+            // InternalDataDSL.g:4570:2: iv_ruleXAndExpression= ruleXAndExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAndExpressionRule()); 
@@ -10839,7 +12550,7 @@
 
 
     // $ANTLR start "ruleXAndExpression"
-    // InternalDataDSL.g:3955:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
+    // InternalDataDSL.g:4576:1: ruleXAndExpression returns [EObject current=null] : (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) ;
     public final EObject ruleXAndExpression() throws RecognitionException {
         EObject current = null;
 
@@ -10852,18 +12563,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:3961:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
-            // InternalDataDSL.g:3962:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalDataDSL.g:4582:2: ( (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* ) )
+            // InternalDataDSL.g:4583:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
             {
-            // InternalDataDSL.g:3962:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
-            // InternalDataDSL.g:3963:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            // InternalDataDSL.g:4583:2: (this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )* )
+            // InternalDataDSL.g:4584:3: this_XEqualityExpression_0= ruleXEqualityExpression ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXAndExpressionAccess().getXEqualityExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_88);
+            pushFollow(FOLLOW_94);
             this_XEqualityExpression_0=ruleXEqualityExpression();
 
             state._fsp--;
@@ -10874,35 +12585,35 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:3971:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
-            loop73:
+            // InternalDataDSL.g:4592:3: ( ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) ) )*
+            loop80:
             do {
-                int alt73=2;
-                int LA73_0 = input.LA(1);
+                int alt80=2;
+                int LA80_0 = input.LA(1);
 
-                if ( (LA73_0==97) ) {
-                    int LA73_2 = input.LA(2);
+                if ( (LA80_0==110) ) {
+                    int LA80_2 = input.LA(2);
 
                     if ( (synpred9_InternalDataDSL()) ) {
-                        alt73=1;
+                        alt80=1;
                     }
 
 
                 }
 
 
-                switch (alt73) {
+                switch (alt80) {
             	case 1 :
-            	    // InternalDataDSL.g:3972:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalDataDSL.g:4593:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) ) ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
             	    {
-            	    // InternalDataDSL.g:3972:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
-            	    // InternalDataDSL.g:3973:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
+            	    // InternalDataDSL.g:4593:4: ( ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) ) )
+            	    // InternalDataDSL.g:4594:5: ( ( () ( ( ruleOpAnd ) ) ) )=> ( () ( ( ruleOpAnd ) ) )
             	    {
-            	    // InternalDataDSL.g:3983:5: ( () ( ( ruleOpAnd ) ) )
-            	    // InternalDataDSL.g:3984:6: () ( ( ruleOpAnd ) )
+            	    // InternalDataDSL.g:4604:5: ( () ( ( ruleOpAnd ) ) )
+            	    // InternalDataDSL.g:4605:6: () ( ( ruleOpAnd ) )
             	    {
-            	    // InternalDataDSL.g:3984:6: ()
-            	    // InternalDataDSL.g:3985:7: 
+            	    // InternalDataDSL.g:4605:6: ()
+            	    // InternalDataDSL.g:4606:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10914,11 +12625,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:3991:6: ( ( ruleOpAnd ) )
-            	    // InternalDataDSL.g:3992:7: ( ruleOpAnd )
+            	    // InternalDataDSL.g:4612:6: ( ( ruleOpAnd ) )
+            	    // InternalDataDSL.g:4613:7: ( ruleOpAnd )
             	    {
-            	    // InternalDataDSL.g:3992:7: ( ruleOpAnd )
-            	    // InternalDataDSL.g:3993:8: ruleOpAnd
+            	    // InternalDataDSL.g:4613:7: ( ruleOpAnd )
+            	    // InternalDataDSL.g:4614:8: ruleOpAnd
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -10932,7 +12643,7 @@
             	      								newCompositeNode(grammarAccess.getXAndExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpAnd();
 
             	    state._fsp--;
@@ -10954,18 +12665,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4009:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
-            	    // InternalDataDSL.g:4010:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalDataDSL.g:4630:4: ( (lv_rightOperand_3_0= ruleXEqualityExpression ) )
+            	    // InternalDataDSL.g:4631:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
             	    {
-            	    // InternalDataDSL.g:4010:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
-            	    // InternalDataDSL.g:4011:6: lv_rightOperand_3_0= ruleXEqualityExpression
+            	    // InternalDataDSL.g:4631:5: (lv_rightOperand_3_0= ruleXEqualityExpression )
+            	    // InternalDataDSL.g:4632:6: lv_rightOperand_3_0= ruleXEqualityExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXAndExpressionAccess().getRightOperandXEqualityExpressionParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_88);
+            	    pushFollow(FOLLOW_94);
             	    lv_rightOperand_3_0=ruleXEqualityExpression();
 
             	    state._fsp--;
@@ -10994,7 +12705,7 @@
             	    break;
 
             	default :
-            	    break loop73;
+            	    break loop80;
                 }
             } while (true);
 
@@ -11023,7 +12734,7 @@
 
 
     // $ANTLR start "entryRuleOpAnd"
-    // InternalDataDSL.g:4033:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
+    // InternalDataDSL.g:4654:1: entryRuleOpAnd returns [String current=null] : iv_ruleOpAnd= ruleOpAnd EOF ;
     public final String entryRuleOpAnd() throws RecognitionException {
         String current = null;
 
@@ -11031,8 +12742,8 @@
 
 
         try {
-            // InternalDataDSL.g:4033:45: (iv_ruleOpAnd= ruleOpAnd EOF )
-            // InternalDataDSL.g:4034:2: iv_ruleOpAnd= ruleOpAnd EOF
+            // InternalDataDSL.g:4654:45: (iv_ruleOpAnd= ruleOpAnd EOF )
+            // InternalDataDSL.g:4655:2: iv_ruleOpAnd= ruleOpAnd EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpAndRule()); 
@@ -11063,7 +12774,7 @@
 
 
     // $ANTLR start "ruleOpAnd"
-    // InternalDataDSL.g:4040:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
+    // InternalDataDSL.g:4661:1: ruleOpAnd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : kw= '&&' ;
     public final AntlrDatatypeRuleToken ruleOpAnd() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11073,10 +12784,10 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4046:2: (kw= '&&' )
-            // InternalDataDSL.g:4047:2: kw= '&&'
+            // InternalDataDSL.g:4667:2: (kw= '&&' )
+            // InternalDataDSL.g:4668:2: kw= '&&'
             {
-            kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
+            kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               		current.merge(kw);
@@ -11105,7 +12816,7 @@
 
 
     // $ANTLR start "entryRuleXEqualityExpression"
-    // InternalDataDSL.g:4055:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
+    // InternalDataDSL.g:4676:1: entryRuleXEqualityExpression returns [EObject current=null] : iv_ruleXEqualityExpression= ruleXEqualityExpression EOF ;
     public final EObject entryRuleXEqualityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11113,8 +12824,8 @@
 
 
         try {
-            // InternalDataDSL.g:4055:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
-            // InternalDataDSL.g:4056:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
+            // InternalDataDSL.g:4676:60: (iv_ruleXEqualityExpression= ruleXEqualityExpression EOF )
+            // InternalDataDSL.g:4677:2: iv_ruleXEqualityExpression= ruleXEqualityExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXEqualityExpressionRule()); 
@@ -11145,7 +12856,7 @@
 
 
     // $ANTLR start "ruleXEqualityExpression"
-    // InternalDataDSL.g:4062:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
+    // InternalDataDSL.g:4683:1: ruleXEqualityExpression returns [EObject current=null] : (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) ;
     public final EObject ruleXEqualityExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11158,18 +12869,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4068:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
-            // InternalDataDSL.g:4069:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalDataDSL.g:4689:2: ( (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* ) )
+            // InternalDataDSL.g:4690:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
             {
-            // InternalDataDSL.g:4069:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
-            // InternalDataDSL.g:4070:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            // InternalDataDSL.g:4690:2: (this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )* )
+            // InternalDataDSL.g:4691:3: this_XRelationalExpression_0= ruleXRelationalExpression ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getXRelationalExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_89);
+            pushFollow(FOLLOW_95);
             this_XRelationalExpression_0=ruleXRelationalExpression();
 
             state._fsp--;
@@ -11180,50 +12891,50 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4078:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
-            loop74:
+            // InternalDataDSL.g:4699:3: ( ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) ) )*
+            loop81:
             do {
-                int alt74=2;
+                int alt81=2;
                 switch ( input.LA(1) ) {
-                case 98:
+                case 111:
                     {
-                    int LA74_2 = input.LA(2);
+                    int LA81_2 = input.LA(2);
 
                     if ( (synpred10_InternalDataDSL()) ) {
-                        alt74=1;
+                        alt81=1;
                     }
 
 
                     }
                     break;
-                case 99:
+                case 112:
                     {
-                    int LA74_3 = input.LA(2);
+                    int LA81_3 = input.LA(2);
 
                     if ( (synpred10_InternalDataDSL()) ) {
-                        alt74=1;
+                        alt81=1;
                     }
 
 
                     }
                     break;
-                case 100:
+                case 113:
                     {
-                    int LA74_4 = input.LA(2);
+                    int LA81_4 = input.LA(2);
 
                     if ( (synpred10_InternalDataDSL()) ) {
-                        alt74=1;
+                        alt81=1;
                     }
 
 
                     }
                     break;
-                case 101:
+                case 114:
                     {
-                    int LA74_5 = input.LA(2);
+                    int LA81_5 = input.LA(2);
 
                     if ( (synpred10_InternalDataDSL()) ) {
-                        alt74=1;
+                        alt81=1;
                     }
 
 
@@ -11232,18 +12943,18 @@
 
                 }
 
-                switch (alt74) {
+                switch (alt81) {
             	case 1 :
-            	    // InternalDataDSL.g:4079:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalDataDSL.g:4700:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) ) ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
             	    {
-            	    // InternalDataDSL.g:4079:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
-            	    // InternalDataDSL.g:4080:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
+            	    // InternalDataDSL.g:4700:4: ( ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) ) )
+            	    // InternalDataDSL.g:4701:5: ( ( () ( ( ruleOpEquality ) ) ) )=> ( () ( ( ruleOpEquality ) ) )
             	    {
-            	    // InternalDataDSL.g:4090:5: ( () ( ( ruleOpEquality ) ) )
-            	    // InternalDataDSL.g:4091:6: () ( ( ruleOpEquality ) )
+            	    // InternalDataDSL.g:4711:5: ( () ( ( ruleOpEquality ) ) )
+            	    // InternalDataDSL.g:4712:6: () ( ( ruleOpEquality ) )
             	    {
-            	    // InternalDataDSL.g:4091:6: ()
-            	    // InternalDataDSL.g:4092:7: 
+            	    // InternalDataDSL.g:4712:6: ()
+            	    // InternalDataDSL.g:4713:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11255,11 +12966,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4098:6: ( ( ruleOpEquality ) )
-            	    // InternalDataDSL.g:4099:7: ( ruleOpEquality )
+            	    // InternalDataDSL.g:4719:6: ( ( ruleOpEquality ) )
+            	    // InternalDataDSL.g:4720:7: ( ruleOpEquality )
             	    {
-            	    // InternalDataDSL.g:4099:7: ( ruleOpEquality )
-            	    // InternalDataDSL.g:4100:8: ruleOpEquality
+            	    // InternalDataDSL.g:4720:7: ( ruleOpEquality )
+            	    // InternalDataDSL.g:4721:8: ruleOpEquality
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11273,7 +12984,7 @@
             	      								newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpEquality();
 
             	    state._fsp--;
@@ -11295,18 +13006,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4116:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
-            	    // InternalDataDSL.g:4117:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalDataDSL.g:4737:4: ( (lv_rightOperand_3_0= ruleXRelationalExpression ) )
+            	    // InternalDataDSL.g:4738:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
             	    {
-            	    // InternalDataDSL.g:4117:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
-            	    // InternalDataDSL.g:4118:6: lv_rightOperand_3_0= ruleXRelationalExpression
+            	    // InternalDataDSL.g:4738:5: (lv_rightOperand_3_0= ruleXRelationalExpression )
+            	    // InternalDataDSL.g:4739:6: lv_rightOperand_3_0= ruleXRelationalExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXEqualityExpressionAccess().getRightOperandXRelationalExpressionParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_89);
+            	    pushFollow(FOLLOW_95);
             	    lv_rightOperand_3_0=ruleXRelationalExpression();
 
             	    state._fsp--;
@@ -11335,7 +13046,7 @@
             	    break;
 
             	default :
-            	    break loop74;
+            	    break loop81;
                 }
             } while (true);
 
@@ -11364,7 +13075,7 @@
 
 
     // $ANTLR start "entryRuleOpEquality"
-    // InternalDataDSL.g:4140:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
+    // InternalDataDSL.g:4761:1: entryRuleOpEquality returns [String current=null] : iv_ruleOpEquality= ruleOpEquality EOF ;
     public final String entryRuleOpEquality() throws RecognitionException {
         String current = null;
 
@@ -11372,8 +13083,8 @@
 
 
         try {
-            // InternalDataDSL.g:4140:50: (iv_ruleOpEquality= ruleOpEquality EOF )
-            // InternalDataDSL.g:4141:2: iv_ruleOpEquality= ruleOpEquality EOF
+            // InternalDataDSL.g:4761:50: (iv_ruleOpEquality= ruleOpEquality EOF )
+            // InternalDataDSL.g:4762:2: iv_ruleOpEquality= ruleOpEquality EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpEqualityRule()); 
@@ -11404,7 +13115,7 @@
 
 
     // $ANTLR start "ruleOpEquality"
-    // InternalDataDSL.g:4147:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
+    // InternalDataDSL.g:4768:1: ruleOpEquality returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) ;
     public final AntlrDatatypeRuleToken ruleOpEquality() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11414,45 +13125,45 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4153:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
-            // InternalDataDSL.g:4154:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            // InternalDataDSL.g:4774:2: ( (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' ) )
+            // InternalDataDSL.g:4775:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
             {
-            // InternalDataDSL.g:4154:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
-            int alt75=4;
+            // InternalDataDSL.g:4775:2: (kw= '==' | kw= '!=' | kw= '===' | kw= '!==' )
+            int alt82=4;
             switch ( input.LA(1) ) {
-            case 98:
+            case 111:
                 {
-                alt75=1;
+                alt82=1;
                 }
                 break;
-            case 99:
+            case 112:
                 {
-                alt75=2;
+                alt82=2;
                 }
                 break;
-            case 100:
+            case 113:
                 {
-                alt75=3;
+                alt82=3;
                 }
                 break;
-            case 101:
+            case 114:
                 {
-                alt75=4;
+                alt82=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 75, 0, input);
+                    new NoViableAltException("", 82, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt75) {
+            switch (alt82) {
                 case 1 :
-                    // InternalDataDSL.g:4155:3: kw= '=='
+                    // InternalDataDSL.g:4776:3: kw= '=='
                     {
-                    kw=(Token)match(input,98,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -11463,9 +13174,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4161:3: kw= '!='
+                    // InternalDataDSL.g:4782:3: kw= '!='
                     {
-                    kw=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -11476,9 +13187,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4167:3: kw= '==='
+                    // InternalDataDSL.g:4788:3: kw= '==='
                     {
-                    kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -11489,9 +13200,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4173:3: kw= '!=='
+                    // InternalDataDSL.g:4794:3: kw= '!=='
                     {
-                    kw=(Token)match(input,101,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -11526,7 +13237,7 @@
 
 
     // $ANTLR start "entryRuleXRelationalExpression"
-    // InternalDataDSL.g:4182:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
+    // InternalDataDSL.g:4803:1: entryRuleXRelationalExpression returns [EObject current=null] : iv_ruleXRelationalExpression= ruleXRelationalExpression EOF ;
     public final EObject entryRuleXRelationalExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11534,8 +13245,8 @@
 
 
         try {
-            // InternalDataDSL.g:4182:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
-            // InternalDataDSL.g:4183:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
+            // InternalDataDSL.g:4803:62: (iv_ruleXRelationalExpression= ruleXRelationalExpression EOF )
+            // InternalDataDSL.g:4804:2: iv_ruleXRelationalExpression= ruleXRelationalExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXRelationalExpressionRule()); 
@@ -11566,7 +13277,7 @@
 
 
     // $ANTLR start "ruleXRelationalExpression"
-    // InternalDataDSL.g:4189:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
+    // InternalDataDSL.g:4810:1: ruleXRelationalExpression returns [EObject current=null] : (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) ;
     public final EObject ruleXRelationalExpression() throws RecognitionException {
         EObject current = null;
 
@@ -11582,18 +13293,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4195:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
-            // InternalDataDSL.g:4196:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalDataDSL.g:4816:2: ( (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* ) )
+            // InternalDataDSL.g:4817:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
             {
-            // InternalDataDSL.g:4196:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
-            // InternalDataDSL.g:4197:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            // InternalDataDSL.g:4817:2: (this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )* )
+            // InternalDataDSL.g:4818:3: this_XOtherOperatorExpression_0= ruleXOtherOperatorExpression ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getXOtherOperatorExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_90);
+            pushFollow(FOLLOW_96);
             this_XOtherOperatorExpression_0=ruleXOtherOperatorExpression();
 
             state._fsp--;
@@ -11604,50 +13315,50 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4205:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
-            loop76:
+            // InternalDataDSL.g:4826:3: ( ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) ) | ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) ) )*
+            loop83:
             do {
-                int alt76=3;
+                int alt83=3;
                 switch ( input.LA(1) ) {
-                case 93:
+                case 106:
                     {
-                    int LA76_2 = input.LA(2);
+                    int LA83_2 = input.LA(2);
 
                     if ( (synpred12_InternalDataDSL()) ) {
-                        alt76=2;
+                        alt83=2;
                     }
 
 
                     }
                     break;
-                case 94:
+                case 107:
                     {
-                    int LA76_3 = input.LA(2);
+                    int LA83_3 = input.LA(2);
 
                     if ( (synpred12_InternalDataDSL()) ) {
-                        alt76=2;
+                        alt83=2;
                     }
 
 
                     }
                     break;
-                case 102:
+                case 115:
                     {
-                    int LA76_4 = input.LA(2);
+                    int LA83_4 = input.LA(2);
 
                     if ( (synpred11_InternalDataDSL()) ) {
-                        alt76=1;
+                        alt83=1;
                     }
 
 
                     }
                     break;
-                case 95:
+                case 108:
                     {
-                    int LA76_5 = input.LA(2);
+                    int LA83_5 = input.LA(2);
 
                     if ( (synpred12_InternalDataDSL()) ) {
-                        alt76=2;
+                        alt83=2;
                     }
 
 
@@ -11656,21 +13367,21 @@
 
                 }
 
-                switch (alt76) {
+                switch (alt83) {
             	case 1 :
-            	    // InternalDataDSL.g:4206:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalDataDSL.g:4827:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
             	    {
-            	    // InternalDataDSL.g:4206:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
-            	    // InternalDataDSL.g:4207:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalDataDSL.g:4827:4: ( ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )
+            	    // InternalDataDSL.g:4828:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // InternalDataDSL.g:4207:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
-            	    // InternalDataDSL.g:4208:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
+            	    // InternalDataDSL.g:4828:5: ( ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' ) )
+            	    // InternalDataDSL.g:4829:6: ( ( () 'instanceof' ) )=> ( () otherlv_2= 'instanceof' )
             	    {
-            	    // InternalDataDSL.g:4214:6: ( () otherlv_2= 'instanceof' )
-            	    // InternalDataDSL.g:4215:7: () otherlv_2= 'instanceof'
+            	    // InternalDataDSL.g:4835:6: ( () otherlv_2= 'instanceof' )
+            	    // InternalDataDSL.g:4836:7: () otherlv_2= 'instanceof'
             	    {
-            	    // InternalDataDSL.g:4215:7: ()
-            	    // InternalDataDSL.g:4216:8: 
+            	    // InternalDataDSL.g:4836:7: ()
+            	    // InternalDataDSL.g:4837:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11682,7 +13393,7 @@
 
             	    }
 
-            	    otherlv_2=(Token)match(input,102,FOLLOW_91); if (state.failed) return current;
+            	    otherlv_2=(Token)match(input,115,FOLLOW_97); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      							newLeafNode(otherlv_2, grammarAccess.getXRelationalExpressionAccess().getInstanceofKeyword_1_0_0_0_1());
@@ -11694,18 +13405,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4228:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // InternalDataDSL.g:4229:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalDataDSL.g:4849:5: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalDataDSL.g:4850:6: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // InternalDataDSL.g:4229:6: (lv_type_3_0= ruleJvmTypeReference )
-            	    // InternalDataDSL.g:4230:7: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalDataDSL.g:4850:6: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalDataDSL.g:4851:7: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_0_1_0());
             	      						
             	    }
-            	    pushFollow(FOLLOW_90);
+            	    pushFollow(FOLLOW_96);
             	    lv_type_3_0=ruleJvmTypeReference();
 
             	    state._fsp--;
@@ -11736,19 +13447,19 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:4249:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalDataDSL.g:4870:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
             	    {
-            	    // InternalDataDSL.g:4249:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
-            	    // InternalDataDSL.g:4250:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalDataDSL.g:4870:4: ( ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) ) )
+            	    // InternalDataDSL.g:4871:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) ) ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
             	    {
-            	    // InternalDataDSL.g:4250:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
-            	    // InternalDataDSL.g:4251:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
+            	    // InternalDataDSL.g:4871:5: ( ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) ) )
+            	    // InternalDataDSL.g:4872:6: ( ( () ( ( ruleOpCompare ) ) ) )=> ( () ( ( ruleOpCompare ) ) )
             	    {
-            	    // InternalDataDSL.g:4261:6: ( () ( ( ruleOpCompare ) ) )
-            	    // InternalDataDSL.g:4262:7: () ( ( ruleOpCompare ) )
+            	    // InternalDataDSL.g:4882:6: ( () ( ( ruleOpCompare ) ) )
+            	    // InternalDataDSL.g:4883:7: () ( ( ruleOpCompare ) )
             	    {
-            	    // InternalDataDSL.g:4262:7: ()
-            	    // InternalDataDSL.g:4263:8: 
+            	    // InternalDataDSL.g:4883:7: ()
+            	    // InternalDataDSL.g:4884:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11760,11 +13471,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4269:7: ( ( ruleOpCompare ) )
-            	    // InternalDataDSL.g:4270:8: ( ruleOpCompare )
+            	    // InternalDataDSL.g:4890:7: ( ( ruleOpCompare ) )
+            	    // InternalDataDSL.g:4891:8: ( ruleOpCompare )
             	    {
-            	    // InternalDataDSL.g:4270:8: ( ruleOpCompare )
-            	    // InternalDataDSL.g:4271:9: ruleOpCompare
+            	    // InternalDataDSL.g:4891:8: ( ruleOpCompare )
+            	    // InternalDataDSL.g:4892:9: ruleOpCompare
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -11778,7 +13489,7 @@
             	      									newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_0_0_1_0());
             	      								
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpCompare();
 
             	    state._fsp--;
@@ -11800,18 +13511,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4287:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
-            	    // InternalDataDSL.g:4288:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalDataDSL.g:4908:5: ( (lv_rightOperand_6_0= ruleXOtherOperatorExpression ) )
+            	    // InternalDataDSL.g:4909:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
             	    {
-            	    // InternalDataDSL.g:4288:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
-            	    // InternalDataDSL.g:4289:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
+            	    // InternalDataDSL.g:4909:6: (lv_rightOperand_6_0= ruleXOtherOperatorExpression )
+            	    // InternalDataDSL.g:4910:7: lv_rightOperand_6_0= ruleXOtherOperatorExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      							newCompositeNode(grammarAccess.getXRelationalExpressionAccess().getRightOperandXOtherOperatorExpressionParserRuleCall_1_1_1_0());
             	      						
             	    }
-            	    pushFollow(FOLLOW_90);
+            	    pushFollow(FOLLOW_96);
             	    lv_rightOperand_6_0=ruleXOtherOperatorExpression();
 
             	    state._fsp--;
@@ -11843,7 +13554,7 @@
             	    break;
 
             	default :
-            	    break loop76;
+            	    break loop83;
                 }
             } while (true);
 
@@ -11872,7 +13583,7 @@
 
 
     // $ANTLR start "entryRuleOpCompare"
-    // InternalDataDSL.g:4312:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
+    // InternalDataDSL.g:4933:1: entryRuleOpCompare returns [String current=null] : iv_ruleOpCompare= ruleOpCompare EOF ;
     public final String entryRuleOpCompare() throws RecognitionException {
         String current = null;
 
@@ -11880,8 +13591,8 @@
 
 
         try {
-            // InternalDataDSL.g:4312:49: (iv_ruleOpCompare= ruleOpCompare EOF )
-            // InternalDataDSL.g:4313:2: iv_ruleOpCompare= ruleOpCompare EOF
+            // InternalDataDSL.g:4933:49: (iv_ruleOpCompare= ruleOpCompare EOF )
+            // InternalDataDSL.g:4934:2: iv_ruleOpCompare= ruleOpCompare EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpCompareRule()); 
@@ -11912,7 +13623,7 @@
 
 
     // $ANTLR start "ruleOpCompare"
-    // InternalDataDSL.g:4319:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
+    // InternalDataDSL.g:4940:1: ruleOpCompare returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) ;
     public final AntlrDatatypeRuleToken ruleOpCompare() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -11922,54 +13633,54 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4325:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
-            // InternalDataDSL.g:4326:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            // InternalDataDSL.g:4946:2: ( (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' ) )
+            // InternalDataDSL.g:4947:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
             {
-            // InternalDataDSL.g:4326:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
-            int alt77=4;
+            // InternalDataDSL.g:4947:2: (kw= '>=' | (kw= '<' kw= '=' ) | kw= '>' | kw= '<' )
+            int alt84=4;
             switch ( input.LA(1) ) {
-            case 95:
+            case 108:
                 {
-                alt77=1;
+                alt84=1;
                 }
                 break;
-            case 93:
+            case 106:
                 {
-                int LA77_2 = input.LA(2);
+                int LA84_2 = input.LA(2);
 
-                if ( (LA77_2==EOF||(LA77_2>=RULE_STRING && LA77_2<=RULE_DECIMAL)||LA77_2==14||LA77_2==50||LA77_2==72||(LA77_2>=75 && LA77_2<=76)||LA77_2==81||(LA77_2>=85 && LA77_2<=86)||LA77_2==93||(LA77_2>=109 && LA77_2<=110)||LA77_2==114||LA77_2==120||LA77_2==122||(LA77_2>=126 && LA77_2<=127)||(LA77_2>=130 && LA77_2<=139)||LA77_2==141) ) {
-                    alt77=4;
+                if ( (LA84_2==EOF||(LA84_2>=RULE_STRING && LA84_2<=RULE_DECIMAL)||LA84_2==14||LA84_2==52||LA84_2==75||(LA84_2>=88 && LA84_2<=89)||LA84_2==94||(LA84_2>=98 && LA84_2<=99)||LA84_2==106||(LA84_2>=122 && LA84_2<=123)||LA84_2==127||LA84_2==133||LA84_2==135||(LA84_2>=139 && LA84_2<=140)||(LA84_2>=143 && LA84_2<=152)||LA84_2==154) ) {
+                    alt84=4;
                 }
-                else if ( (LA77_2==84) ) {
-                    alt77=2;
+                else if ( (LA84_2==97) ) {
+                    alt84=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 77, 2, input);
+                        new NoViableAltException("", 84, 2, input);
 
                     throw nvae;
                 }
                 }
                 break;
-            case 94:
+            case 107:
                 {
-                alt77=3;
+                alt84=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 77, 0, input);
+                    new NoViableAltException("", 84, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt77) {
+            switch (alt84) {
                 case 1 :
-                    // InternalDataDSL.g:4327:3: kw= '>='
+                    // InternalDataDSL.g:4948:3: kw= '>='
                     {
-                    kw=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -11980,19 +13691,19 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4333:3: (kw= '<' kw= '=' )
+                    // InternalDataDSL.g:4954:3: (kw= '<' kw= '=' )
                     {
-                    // InternalDataDSL.g:4333:3: (kw= '<' kw= '=' )
-                    // InternalDataDSL.g:4334:4: kw= '<' kw= '='
+                    // InternalDataDSL.g:4954:3: (kw= '<' kw= '=' )
+                    // InternalDataDSL.g:4955:4: kw= '<' kw= '='
                     {
-                    kw=(Token)match(input,93,FOLLOW_77); if (state.failed) return current;
+                    kw=(Token)match(input,106,FOLLOW_83); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpCompareAccess().getLessThanSignKeyword_1_0());
                       			
                     }
-                    kw=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
@@ -12006,9 +13717,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4346:3: kw= '>'
+                    // InternalDataDSL.g:4967:3: kw= '>'
                     {
-                    kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12019,9 +13730,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4352:3: kw= '<'
+                    // InternalDataDSL.g:4973:3: kw= '<'
                     {
-                    kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12056,7 +13767,7 @@
 
 
     // $ANTLR start "entryRuleXOtherOperatorExpression"
-    // InternalDataDSL.g:4361:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
+    // InternalDataDSL.g:4982:1: entryRuleXOtherOperatorExpression returns [EObject current=null] : iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF ;
     public final EObject entryRuleXOtherOperatorExpression() throws RecognitionException {
         EObject current = null;
 
@@ -12064,8 +13775,8 @@
 
 
         try {
-            // InternalDataDSL.g:4361:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
-            // InternalDataDSL.g:4362:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
+            // InternalDataDSL.g:4982:65: (iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF )
+            // InternalDataDSL.g:4983:2: iv_ruleXOtherOperatorExpression= ruleXOtherOperatorExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXOtherOperatorExpressionRule()); 
@@ -12096,7 +13807,7 @@
 
 
     // $ANTLR start "ruleXOtherOperatorExpression"
-    // InternalDataDSL.g:4368:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
+    // InternalDataDSL.g:4989:1: ruleXOtherOperatorExpression returns [EObject current=null] : (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) ;
     public final EObject ruleXOtherOperatorExpression() throws RecognitionException {
         EObject current = null;
 
@@ -12109,18 +13820,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4374:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
-            // InternalDataDSL.g:4375:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalDataDSL.g:4995:2: ( (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* ) )
+            // InternalDataDSL.g:4996:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
             {
-            // InternalDataDSL.g:4375:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
-            // InternalDataDSL.g:4376:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            // InternalDataDSL.g:4996:2: (this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )* )
+            // InternalDataDSL.g:4997:3: this_XAdditiveExpression_0= ruleXAdditiveExpression ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getXAdditiveExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_92);
+            pushFollow(FOLLOW_98);
             this_XAdditiveExpression_0=ruleXAdditiveExpression();
 
             state._fsp--;
@@ -12131,23 +13842,23 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4384:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
-            loop78:
+            // InternalDataDSL.g:5005:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*
+            loop85:
             do {
-                int alt78=2;
-                alt78 = dfa78.predict(input);
-                switch (alt78) {
+                int alt85=2;
+                alt85 = dfa85.predict(input);
+                switch (alt85) {
             	case 1 :
-            	    // InternalDataDSL.g:4385:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalDataDSL.g:5006:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
             	    {
-            	    // InternalDataDSL.g:4385:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
-            	    // InternalDataDSL.g:4386:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
+            	    // InternalDataDSL.g:5006:4: ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) )
+            	    // InternalDataDSL.g:5007:5: ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) )
             	    {
-            	    // InternalDataDSL.g:4396:5: ( () ( ( ruleOpOther ) ) )
-            	    // InternalDataDSL.g:4397:6: () ( ( ruleOpOther ) )
+            	    // InternalDataDSL.g:5017:5: ( () ( ( ruleOpOther ) ) )
+            	    // InternalDataDSL.g:5018:6: () ( ( ruleOpOther ) )
             	    {
-            	    // InternalDataDSL.g:4397:6: ()
-            	    // InternalDataDSL.g:4398:7: 
+            	    // InternalDataDSL.g:5018:6: ()
+            	    // InternalDataDSL.g:5019:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12159,11 +13870,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4404:6: ( ( ruleOpOther ) )
-            	    // InternalDataDSL.g:4405:7: ( ruleOpOther )
+            	    // InternalDataDSL.g:5025:6: ( ( ruleOpOther ) )
+            	    // InternalDataDSL.g:5026:7: ( ruleOpOther )
             	    {
-            	    // InternalDataDSL.g:4405:7: ( ruleOpOther )
-            	    // InternalDataDSL.g:4406:8: ruleOpOther
+            	    // InternalDataDSL.g:5026:7: ( ruleOpOther )
+            	    // InternalDataDSL.g:5027:8: ruleOpOther
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12177,7 +13888,7 @@
             	      								newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpOther();
 
             	    state._fsp--;
@@ -12199,18 +13910,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4422:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
-            	    // InternalDataDSL.g:4423:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalDataDSL.g:5043:4: ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) )
+            	    // InternalDataDSL.g:5044:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
             	    {
-            	    // InternalDataDSL.g:4423:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
-            	    // InternalDataDSL.g:4424:6: lv_rightOperand_3_0= ruleXAdditiveExpression
+            	    // InternalDataDSL.g:5044:5: (lv_rightOperand_3_0= ruleXAdditiveExpression )
+            	    // InternalDataDSL.g:5045:6: lv_rightOperand_3_0= ruleXAdditiveExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXOtherOperatorExpressionAccess().getRightOperandXAdditiveExpressionParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_92);
+            	    pushFollow(FOLLOW_98);
             	    lv_rightOperand_3_0=ruleXAdditiveExpression();
 
             	    state._fsp--;
@@ -12239,7 +13950,7 @@
             	    break;
 
             	default :
-            	    break loop78;
+            	    break loop85;
                 }
             } while (true);
 
@@ -12268,7 +13979,7 @@
 
 
     // $ANTLR start "entryRuleOpOther"
-    // InternalDataDSL.g:4446:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
+    // InternalDataDSL.g:5067:1: entryRuleOpOther returns [String current=null] : iv_ruleOpOther= ruleOpOther EOF ;
     public final String entryRuleOpOther() throws RecognitionException {
         String current = null;
 
@@ -12276,8 +13987,8 @@
 
 
         try {
-            // InternalDataDSL.g:4446:47: (iv_ruleOpOther= ruleOpOther EOF )
-            // InternalDataDSL.g:4447:2: iv_ruleOpOther= ruleOpOther EOF
+            // InternalDataDSL.g:5067:47: (iv_ruleOpOther= ruleOpOther EOF )
+            // InternalDataDSL.g:5068:2: iv_ruleOpOther= ruleOpOther EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpOtherRule()); 
@@ -12308,7 +14019,7 @@
 
 
     // $ANTLR start "ruleOpOther"
-    // InternalDataDSL.g:4453:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
+    // InternalDataDSL.g:5074:1: ruleOpOther returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) ;
     public final AntlrDatatypeRuleToken ruleOpOther() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -12318,17 +14029,17 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4459:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
-            // InternalDataDSL.g:4460:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            // InternalDataDSL.g:5080:2: ( (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' ) )
+            // InternalDataDSL.g:5081:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
             {
-            // InternalDataDSL.g:4460:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
-            int alt81=9;
-            alt81 = dfa81.predict(input);
-            switch (alt81) {
+            // InternalDataDSL.g:5081:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )
+            int alt88=9;
+            alt88 = dfa88.predict(input);
+            switch (alt88) {
                 case 1 :
-                    // InternalDataDSL.g:4461:3: kw= '->'
+                    // InternalDataDSL.g:5082:3: kw= '->'
                     {
-                    kw=(Token)match(input,103,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12339,9 +14050,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4467:3: kw= '..<'
+                    // InternalDataDSL.g:5088:3: kw= '..<'
                     {
-                    kw=(Token)match(input,104,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,117,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12352,19 +14063,19 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4473:3: (kw= '>' kw= '..' )
+                    // InternalDataDSL.g:5094:3: (kw= '>' kw= '..' )
                     {
-                    // InternalDataDSL.g:4473:3: (kw= '>' kw= '..' )
-                    // InternalDataDSL.g:4474:4: kw= '>' kw= '..'
+                    // InternalDataDSL.g:5094:3: (kw= '>' kw= '..' )
+                    // InternalDataDSL.g:5095:4: kw= '>' kw= '..'
                     {
-                    kw=(Token)match(input,94,FOLLOW_93); if (state.failed) return current;
+                    kw=(Token)match(input,107,FOLLOW_99); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_2_0());
                       			
                     }
-                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
@@ -12378,9 +14089,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4486:3: kw= '..'
+                    // InternalDataDSL.g:5107:3: kw= '..'
                     {
-                    kw=(Token)match(input,105,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,118,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12391,9 +14102,9 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:4492:3: kw= '=>'
+                    // InternalDataDSL.g:5113:3: kw= '=>'
                     {
-                    kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12404,35 +14115,35 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:4498:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalDataDSL.g:5119:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
                     {
-                    // InternalDataDSL.g:4498:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
-                    // InternalDataDSL.g:4499:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    // InternalDataDSL.g:5119:3: (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) )
+                    // InternalDataDSL.g:5120:4: kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
                     {
-                    kw=(Token)match(input,94,FOLLOW_94); if (state.failed) return current;
+                    kw=(Token)match(input,107,FOLLOW_100); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_0());
                       			
                     }
-                    // InternalDataDSL.g:4504:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
-                    int alt79=2;
-                    int LA79_0 = input.LA(1);
+                    // InternalDataDSL.g:5125:4: ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' )
+                    int alt86=2;
+                    int LA86_0 = input.LA(1);
 
-                    if ( (LA79_0==94) ) {
-                        int LA79_1 = input.LA(2);
+                    if ( (LA86_0==107) ) {
+                        int LA86_1 = input.LA(2);
 
-                        if ( (LA79_1==EOF||(LA79_1>=RULE_STRING && LA79_1<=RULE_DECIMAL)||LA79_1==14||LA79_1==50||LA79_1==72||(LA79_1>=75 && LA79_1<=76)||LA79_1==81||(LA79_1>=85 && LA79_1<=86)||LA79_1==93||(LA79_1>=109 && LA79_1<=110)||LA79_1==114||LA79_1==120||LA79_1==122||(LA79_1>=126 && LA79_1<=127)||(LA79_1>=130 && LA79_1<=139)||LA79_1==141) ) {
-                            alt79=2;
+                        if ( (LA86_1==EOF||(LA86_1>=RULE_STRING && LA86_1<=RULE_DECIMAL)||LA86_1==14||LA86_1==52||LA86_1==75||(LA86_1>=88 && LA86_1<=89)||LA86_1==94||(LA86_1>=98 && LA86_1<=99)||LA86_1==106||(LA86_1>=122 && LA86_1<=123)||LA86_1==127||LA86_1==133||LA86_1==135||(LA86_1>=139 && LA86_1<=140)||(LA86_1>=143 && LA86_1<=152)||LA86_1==154) ) {
+                            alt86=2;
                         }
-                        else if ( (LA79_1==94) && (synpred14_InternalDataDSL())) {
-                            alt79=1;
+                        else if ( (LA86_1==107) && (synpred14_InternalDataDSL())) {
+                            alt86=1;
                         }
                         else {
                             if (state.backtracking>0) {state.failed=true; return current;}
                             NoViableAltException nvae =
-                                new NoViableAltException("", 79, 1, input);
+                                new NoViableAltException("", 86, 1, input);
 
                             throw nvae;
                         }
@@ -12440,28 +14151,28 @@
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 79, 0, input);
+                            new NoViableAltException("", 86, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt79) {
+                    switch (alt86) {
                         case 1 :
-                            // InternalDataDSL.g:4505:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalDataDSL.g:5126:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
                             {
-                            // InternalDataDSL.g:4505:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
-                            // InternalDataDSL.g:4506:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
+                            // InternalDataDSL.g:5126:5: ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) )
+                            // InternalDataDSL.g:5127:6: ( ( '>' '>' ) )=> (kw= '>' kw= '>' )
                             {
-                            // InternalDataDSL.g:4511:6: (kw= '>' kw= '>' )
-                            // InternalDataDSL.g:4512:7: kw= '>' kw= '>'
+                            // InternalDataDSL.g:5132:6: (kw= '>' kw= '>' )
+                            // InternalDataDSL.g:5133:7: kw= '>' kw= '>'
                             {
-                            kw=(Token)match(input,94,FOLLOW_94); if (state.failed) return current;
+                            kw=(Token)match(input,107,FOLLOW_100); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							current.merge(kw);
                               							newLeafNode(kw, grammarAccess.getOpOtherAccess().getGreaterThanSignKeyword_5_1_0_0_0());
                               						
                             }
-                            kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                            kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							current.merge(kw);
@@ -12478,9 +14189,9 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:4525:5: kw= '>'
+                            // InternalDataDSL.g:5146:5: kw= '>'
                             {
-                            kw=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                            kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(kw);
@@ -12500,67 +14211,67 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:4533:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalDataDSL.g:5154:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
                     {
-                    // InternalDataDSL.g:4533:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
-                    // InternalDataDSL.g:4534:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    // InternalDataDSL.g:5154:3: (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) )
+                    // InternalDataDSL.g:5155:4: kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
                     {
-                    kw=(Token)match(input,93,FOLLOW_95); if (state.failed) return current;
+                    kw=(Token)match(input,106,FOLLOW_101); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current.merge(kw);
                       				newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_0());
                       			
                     }
-                    // InternalDataDSL.g:4539:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
-                    int alt80=3;
-                    int LA80_0 = input.LA(1);
+                    // InternalDataDSL.g:5160:4: ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' )
+                    int alt87=3;
+                    int LA87_0 = input.LA(1);
 
-                    if ( (LA80_0==93) ) {
-                        int LA80_1 = input.LA(2);
+                    if ( (LA87_0==106) ) {
+                        int LA87_1 = input.LA(2);
 
                         if ( (synpred15_InternalDataDSL()) ) {
-                            alt80=1;
+                            alt87=1;
                         }
                         else if ( (true) ) {
-                            alt80=2;
+                            alt87=2;
                         }
                         else {
                             if (state.backtracking>0) {state.failed=true; return current;}
                             NoViableAltException nvae =
-                                new NoViableAltException("", 80, 1, input);
+                                new NoViableAltException("", 87, 1, input);
 
                             throw nvae;
                         }
                     }
-                    else if ( (LA80_0==106) ) {
-                        alt80=3;
+                    else if ( (LA87_0==119) ) {
+                        alt87=3;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 80, 0, input);
+                            new NoViableAltException("", 87, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt80) {
+                    switch (alt87) {
                         case 1 :
-                            // InternalDataDSL.g:4540:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalDataDSL.g:5161:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
                             {
-                            // InternalDataDSL.g:4540:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
-                            // InternalDataDSL.g:4541:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
+                            // InternalDataDSL.g:5161:5: ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) )
+                            // InternalDataDSL.g:5162:6: ( ( '<' '<' ) )=> (kw= '<' kw= '<' )
                             {
-                            // InternalDataDSL.g:4546:6: (kw= '<' kw= '<' )
-                            // InternalDataDSL.g:4547:7: kw= '<' kw= '<'
+                            // InternalDataDSL.g:5167:6: (kw= '<' kw= '<' )
+                            // InternalDataDSL.g:5168:7: kw= '<' kw= '<'
                             {
-                            kw=(Token)match(input,93,FOLLOW_84); if (state.failed) return current;
+                            kw=(Token)match(input,106,FOLLOW_90); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							current.merge(kw);
                               							newLeafNode(kw, grammarAccess.getOpOtherAccess().getLessThanSignKeyword_6_1_0_0_0());
                               						
                             }
-                            kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
+                            kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							current.merge(kw);
@@ -12577,9 +14288,9 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:4560:5: kw= '<'
+                            // InternalDataDSL.g:5181:5: kw= '<'
                             {
-                            kw=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
+                            kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(kw);
@@ -12590,9 +14301,9 @@
                             }
                             break;
                         case 3 :
-                            // InternalDataDSL.g:4566:5: kw= '=>'
+                            // InternalDataDSL.g:5187:5: kw= '=>'
                             {
-                            kw=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
+                            kw=(Token)match(input,119,FOLLOW_2); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(kw);
@@ -12612,9 +14323,9 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:4574:3: kw= '<>'
+                    // InternalDataDSL.g:5195:3: kw= '<>'
                     {
-                    kw=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,120,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12625,9 +14336,9 @@
                     }
                     break;
                 case 9 :
-                    // InternalDataDSL.g:4580:3: kw= '?:'
+                    // InternalDataDSL.g:5201:3: kw= '?:'
                     {
-                    kw=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,121,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12662,7 +14373,7 @@
 
 
     // $ANTLR start "entryRuleXAdditiveExpression"
-    // InternalDataDSL.g:4589:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
+    // InternalDataDSL.g:5210:1: entryRuleXAdditiveExpression returns [EObject current=null] : iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF ;
     public final EObject entryRuleXAdditiveExpression() throws RecognitionException {
         EObject current = null;
 
@@ -12670,8 +14381,8 @@
 
 
         try {
-            // InternalDataDSL.g:4589:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
-            // InternalDataDSL.g:4590:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
+            // InternalDataDSL.g:5210:60: (iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF )
+            // InternalDataDSL.g:5211:2: iv_ruleXAdditiveExpression= ruleXAdditiveExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXAdditiveExpressionRule()); 
@@ -12702,7 +14413,7 @@
 
 
     // $ANTLR start "ruleXAdditiveExpression"
-    // InternalDataDSL.g:4596:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
+    // InternalDataDSL.g:5217:1: ruleXAdditiveExpression returns [EObject current=null] : (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) ;
     public final EObject ruleXAdditiveExpression() throws RecognitionException {
         EObject current = null;
 
@@ -12715,18 +14426,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4602:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
-            // InternalDataDSL.g:4603:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalDataDSL.g:5223:2: ( (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* ) )
+            // InternalDataDSL.g:5224:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
             {
-            // InternalDataDSL.g:4603:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
-            // InternalDataDSL.g:4604:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            // InternalDataDSL.g:5224:2: (this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )* )
+            // InternalDataDSL.g:5225:3: this_XMultiplicativeExpression_0= ruleXMultiplicativeExpression ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getXMultiplicativeExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_96);
+            pushFollow(FOLLOW_102);
             this_XMultiplicativeExpression_0=ruleXMultiplicativeExpression();
 
             state._fsp--;
@@ -12737,44 +14448,44 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4612:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
-            loop82:
+            // InternalDataDSL.g:5233:3: ( ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) ) )*
+            loop89:
             do {
-                int alt82=2;
-                int LA82_0 = input.LA(1);
+                int alt89=2;
+                int LA89_0 = input.LA(1);
 
-                if ( (LA82_0==109) ) {
-                    int LA82_2 = input.LA(2);
+                if ( (LA89_0==122) ) {
+                    int LA89_2 = input.LA(2);
 
                     if ( (synpred16_InternalDataDSL()) ) {
-                        alt82=1;
+                        alt89=1;
                     }
 
 
                 }
-                else if ( (LA82_0==110) ) {
-                    int LA82_3 = input.LA(2);
+                else if ( (LA89_0==123) ) {
+                    int LA89_3 = input.LA(2);
 
                     if ( (synpred16_InternalDataDSL()) ) {
-                        alt82=1;
+                        alt89=1;
                     }
 
 
                 }
 
 
-                switch (alt82) {
+                switch (alt89) {
             	case 1 :
-            	    // InternalDataDSL.g:4613:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalDataDSL.g:5234:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) ) ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
             	    {
-            	    // InternalDataDSL.g:4613:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
-            	    // InternalDataDSL.g:4614:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
+            	    // InternalDataDSL.g:5234:4: ( ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) ) )
+            	    // InternalDataDSL.g:5235:5: ( ( () ( ( ruleOpAdd ) ) ) )=> ( () ( ( ruleOpAdd ) ) )
             	    {
-            	    // InternalDataDSL.g:4624:5: ( () ( ( ruleOpAdd ) ) )
-            	    // InternalDataDSL.g:4625:6: () ( ( ruleOpAdd ) )
+            	    // InternalDataDSL.g:5245:5: ( () ( ( ruleOpAdd ) ) )
+            	    // InternalDataDSL.g:5246:6: () ( ( ruleOpAdd ) )
             	    {
-            	    // InternalDataDSL.g:4625:6: ()
-            	    // InternalDataDSL.g:4626:7: 
+            	    // InternalDataDSL.g:5246:6: ()
+            	    // InternalDataDSL.g:5247:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12786,11 +14497,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4632:6: ( ( ruleOpAdd ) )
-            	    // InternalDataDSL.g:4633:7: ( ruleOpAdd )
+            	    // InternalDataDSL.g:5253:6: ( ( ruleOpAdd ) )
+            	    // InternalDataDSL.g:5254:7: ( ruleOpAdd )
             	    {
-            	    // InternalDataDSL.g:4633:7: ( ruleOpAdd )
-            	    // InternalDataDSL.g:4634:8: ruleOpAdd
+            	    // InternalDataDSL.g:5254:7: ( ruleOpAdd )
+            	    // InternalDataDSL.g:5255:8: ruleOpAdd
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -12804,7 +14515,7 @@
             	      								newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpAdd();
 
             	    state._fsp--;
@@ -12826,18 +14537,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4650:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
-            	    // InternalDataDSL.g:4651:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalDataDSL.g:5271:4: ( (lv_rightOperand_3_0= ruleXMultiplicativeExpression ) )
+            	    // InternalDataDSL.g:5272:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
             	    {
-            	    // InternalDataDSL.g:4651:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
-            	    // InternalDataDSL.g:4652:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
+            	    // InternalDataDSL.g:5272:5: (lv_rightOperand_3_0= ruleXMultiplicativeExpression )
+            	    // InternalDataDSL.g:5273:6: lv_rightOperand_3_0= ruleXMultiplicativeExpression
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXAdditiveExpressionAccess().getRightOperandXMultiplicativeExpressionParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_96);
+            	    pushFollow(FOLLOW_102);
             	    lv_rightOperand_3_0=ruleXMultiplicativeExpression();
 
             	    state._fsp--;
@@ -12866,7 +14577,7 @@
             	    break;
 
             	default :
-            	    break loop82;
+            	    break loop89;
                 }
             } while (true);
 
@@ -12895,7 +14606,7 @@
 
 
     // $ANTLR start "entryRuleOpAdd"
-    // InternalDataDSL.g:4674:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
+    // InternalDataDSL.g:5295:1: entryRuleOpAdd returns [String current=null] : iv_ruleOpAdd= ruleOpAdd EOF ;
     public final String entryRuleOpAdd() throws RecognitionException {
         String current = null;
 
@@ -12903,8 +14614,8 @@
 
 
         try {
-            // InternalDataDSL.g:4674:45: (iv_ruleOpAdd= ruleOpAdd EOF )
-            // InternalDataDSL.g:4675:2: iv_ruleOpAdd= ruleOpAdd EOF
+            // InternalDataDSL.g:5295:45: (iv_ruleOpAdd= ruleOpAdd EOF )
+            // InternalDataDSL.g:5296:2: iv_ruleOpAdd= ruleOpAdd EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpAddRule()); 
@@ -12935,7 +14646,7 @@
 
 
     // $ANTLR start "ruleOpAdd"
-    // InternalDataDSL.g:4681:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
+    // InternalDataDSL.g:5302:1: ruleOpAdd returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '+' | kw= '-' ) ;
     public final AntlrDatatypeRuleToken ruleOpAdd() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -12945,31 +14656,31 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4687:2: ( (kw= '+' | kw= '-' ) )
-            // InternalDataDSL.g:4688:2: (kw= '+' | kw= '-' )
+            // InternalDataDSL.g:5308:2: ( (kw= '+' | kw= '-' ) )
+            // InternalDataDSL.g:5309:2: (kw= '+' | kw= '-' )
             {
-            // InternalDataDSL.g:4688:2: (kw= '+' | kw= '-' )
-            int alt83=2;
-            int LA83_0 = input.LA(1);
+            // InternalDataDSL.g:5309:2: (kw= '+' | kw= '-' )
+            int alt90=2;
+            int LA90_0 = input.LA(1);
 
-            if ( (LA83_0==109) ) {
-                alt83=1;
+            if ( (LA90_0==122) ) {
+                alt90=1;
             }
-            else if ( (LA83_0==110) ) {
-                alt83=2;
+            else if ( (LA90_0==123) ) {
+                alt90=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 83, 0, input);
+                    new NoViableAltException("", 90, 0, input);
 
                 throw nvae;
             }
-            switch (alt83) {
+            switch (alt90) {
                 case 1 :
-                    // InternalDataDSL.g:4689:3: kw= '+'
+                    // InternalDataDSL.g:5310:3: kw= '+'
                     {
-                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,122,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -12980,9 +14691,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4695:3: kw= '-'
+                    // InternalDataDSL.g:5316:3: kw= '-'
                     {
-                    kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13017,7 +14728,7 @@
 
 
     // $ANTLR start "entryRuleXMultiplicativeExpression"
-    // InternalDataDSL.g:4704:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
+    // InternalDataDSL.g:5325:1: entryRuleXMultiplicativeExpression returns [EObject current=null] : iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF ;
     public final EObject entryRuleXMultiplicativeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13025,8 +14736,8 @@
 
 
         try {
-            // InternalDataDSL.g:4704:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
-            // InternalDataDSL.g:4705:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
+            // InternalDataDSL.g:5325:66: (iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF )
+            // InternalDataDSL.g:5326:2: iv_ruleXMultiplicativeExpression= ruleXMultiplicativeExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMultiplicativeExpressionRule()); 
@@ -13057,7 +14768,7 @@
 
 
     // $ANTLR start "ruleXMultiplicativeExpression"
-    // InternalDataDSL.g:4711:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
+    // InternalDataDSL.g:5332:1: ruleXMultiplicativeExpression returns [EObject current=null] : (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) ;
     public final EObject ruleXMultiplicativeExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13070,18 +14781,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4717:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
-            // InternalDataDSL.g:4718:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalDataDSL.g:5338:2: ( (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* ) )
+            // InternalDataDSL.g:5339:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
             {
-            // InternalDataDSL.g:4718:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
-            // InternalDataDSL.g:4719:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            // InternalDataDSL.g:5339:2: (this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )* )
+            // InternalDataDSL.g:5340:3: this_XUnaryOperation_0= ruleXUnaryOperation ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getXUnaryOperationParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_97);
+            pushFollow(FOLLOW_103);
             this_XUnaryOperation_0=ruleXUnaryOperation();
 
             state._fsp--;
@@ -13092,50 +14803,50 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4727:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
-            loop84:
+            // InternalDataDSL.g:5348:3: ( ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) ) )*
+            loop91:
             do {
-                int alt84=2;
+                int alt91=2;
                 switch ( input.LA(1) ) {
-                case 77:
+                case 90:
                     {
-                    int LA84_2 = input.LA(2);
+                    int LA91_2 = input.LA(2);
 
                     if ( (synpred17_InternalDataDSL()) ) {
-                        alt84=1;
+                        alt91=1;
                     }
 
 
                     }
                     break;
-                case 111:
+                case 124:
                     {
-                    int LA84_3 = input.LA(2);
+                    int LA91_3 = input.LA(2);
 
                     if ( (synpred17_InternalDataDSL()) ) {
-                        alt84=1;
+                        alt91=1;
                     }
 
 
                     }
                     break;
-                case 112:
+                case 125:
                     {
-                    int LA84_4 = input.LA(2);
+                    int LA91_4 = input.LA(2);
 
                     if ( (synpred17_InternalDataDSL()) ) {
-                        alt84=1;
+                        alt91=1;
                     }
 
 
                     }
                     break;
-                case 113:
+                case 126:
                     {
-                    int LA84_5 = input.LA(2);
+                    int LA91_5 = input.LA(2);
 
                     if ( (synpred17_InternalDataDSL()) ) {
-                        alt84=1;
+                        alt91=1;
                     }
 
 
@@ -13144,18 +14855,18 @@
 
                 }
 
-                switch (alt84) {
+                switch (alt91) {
             	case 1 :
-            	    // InternalDataDSL.g:4728:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalDataDSL.g:5349:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) ) ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
             	    {
-            	    // InternalDataDSL.g:4728:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
-            	    // InternalDataDSL.g:4729:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
+            	    // InternalDataDSL.g:5349:4: ( ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) ) )
+            	    // InternalDataDSL.g:5350:5: ( ( () ( ( ruleOpMulti ) ) ) )=> ( () ( ( ruleOpMulti ) ) )
             	    {
-            	    // InternalDataDSL.g:4739:5: ( () ( ( ruleOpMulti ) ) )
-            	    // InternalDataDSL.g:4740:6: () ( ( ruleOpMulti ) )
+            	    // InternalDataDSL.g:5360:5: ( () ( ( ruleOpMulti ) ) )
+            	    // InternalDataDSL.g:5361:6: () ( ( ruleOpMulti ) )
             	    {
-            	    // InternalDataDSL.g:4740:6: ()
-            	    // InternalDataDSL.g:4741:7: 
+            	    // InternalDataDSL.g:5361:6: ()
+            	    // InternalDataDSL.g:5362:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -13167,11 +14878,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4747:6: ( ( ruleOpMulti ) )
-            	    // InternalDataDSL.g:4748:7: ( ruleOpMulti )
+            	    // InternalDataDSL.g:5368:6: ( ( ruleOpMulti ) )
+            	    // InternalDataDSL.g:5369:7: ( ruleOpMulti )
             	    {
-            	    // InternalDataDSL.g:4748:7: ( ruleOpMulti )
-            	    // InternalDataDSL.g:4749:8: ruleOpMulti
+            	    // InternalDataDSL.g:5369:7: ( ruleOpMulti )
+            	    // InternalDataDSL.g:5370:8: ruleOpMulti
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -13185,7 +14896,7 @@
             	      								newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_1_0());
             	      							
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpMulti();
 
             	    state._fsp--;
@@ -13207,18 +14918,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4765:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
-            	    // InternalDataDSL.g:4766:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalDataDSL.g:5386:4: ( (lv_rightOperand_3_0= ruleXUnaryOperation ) )
+            	    // InternalDataDSL.g:5387:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
             	    {
-            	    // InternalDataDSL.g:4766:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
-            	    // InternalDataDSL.g:4767:6: lv_rightOperand_3_0= ruleXUnaryOperation
+            	    // InternalDataDSL.g:5387:5: (lv_rightOperand_3_0= ruleXUnaryOperation )
+            	    // InternalDataDSL.g:5388:6: lv_rightOperand_3_0= ruleXUnaryOperation
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXMultiplicativeExpressionAccess().getRightOperandXUnaryOperationParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_97);
+            	    pushFollow(FOLLOW_103);
             	    lv_rightOperand_3_0=ruleXUnaryOperation();
 
             	    state._fsp--;
@@ -13247,7 +14958,7 @@
             	    break;
 
             	default :
-            	    break loop84;
+            	    break loop91;
                 }
             } while (true);
 
@@ -13276,7 +14987,7 @@
 
 
     // $ANTLR start "entryRuleOpMulti"
-    // InternalDataDSL.g:4789:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
+    // InternalDataDSL.g:5410:1: entryRuleOpMulti returns [String current=null] : iv_ruleOpMulti= ruleOpMulti EOF ;
     public final String entryRuleOpMulti() throws RecognitionException {
         String current = null;
 
@@ -13284,8 +14995,8 @@
 
 
         try {
-            // InternalDataDSL.g:4789:47: (iv_ruleOpMulti= ruleOpMulti EOF )
-            // InternalDataDSL.g:4790:2: iv_ruleOpMulti= ruleOpMulti EOF
+            // InternalDataDSL.g:5410:47: (iv_ruleOpMulti= ruleOpMulti EOF )
+            // InternalDataDSL.g:5411:2: iv_ruleOpMulti= ruleOpMulti EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpMultiRule()); 
@@ -13316,7 +15027,7 @@
 
 
     // $ANTLR start "ruleOpMulti"
-    // InternalDataDSL.g:4796:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
+    // InternalDataDSL.g:5417:1: ruleOpMulti returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) ;
     public final AntlrDatatypeRuleToken ruleOpMulti() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -13326,45 +15037,45 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4802:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
-            // InternalDataDSL.g:4803:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            // InternalDataDSL.g:5423:2: ( (kw= '*' | kw= '**' | kw= '/' | kw= '%' ) )
+            // InternalDataDSL.g:5424:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
             {
-            // InternalDataDSL.g:4803:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
-            int alt85=4;
+            // InternalDataDSL.g:5424:2: (kw= '*' | kw= '**' | kw= '/' | kw= '%' )
+            int alt92=4;
             switch ( input.LA(1) ) {
-            case 77:
+            case 90:
                 {
-                alt85=1;
+                alt92=1;
                 }
                 break;
-            case 111:
+            case 124:
                 {
-                alt85=2;
+                alt92=2;
                 }
                 break;
-            case 112:
+            case 125:
                 {
-                alt85=3;
+                alt92=3;
                 }
                 break;
-            case 113:
+            case 126:
                 {
-                alt85=4;
+                alt92=4;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 85, 0, input);
+                    new NoViableAltException("", 92, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt85) {
+            switch (alt92) {
                 case 1 :
-                    // InternalDataDSL.g:4804:3: kw= '*'
+                    // InternalDataDSL.g:5425:3: kw= '*'
                     {
-                    kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13375,9 +15086,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4810:3: kw= '**'
+                    // InternalDataDSL.g:5431:3: kw= '**'
                     {
-                    kw=(Token)match(input,111,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,124,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13388,9 +15099,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4816:3: kw= '/'
+                    // InternalDataDSL.g:5437:3: kw= '/'
                     {
-                    kw=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,125,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13401,9 +15112,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:4822:3: kw= '%'
+                    // InternalDataDSL.g:5443:3: kw= '%'
                     {
-                    kw=(Token)match(input,113,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,126,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13438,7 +15149,7 @@
 
 
     // $ANTLR start "entryRuleXUnaryOperation"
-    // InternalDataDSL.g:4831:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
+    // InternalDataDSL.g:5452:1: entryRuleXUnaryOperation returns [EObject current=null] : iv_ruleXUnaryOperation= ruleXUnaryOperation EOF ;
     public final EObject entryRuleXUnaryOperation() throws RecognitionException {
         EObject current = null;
 
@@ -13446,8 +15157,8 @@
 
 
         try {
-            // InternalDataDSL.g:4831:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
-            // InternalDataDSL.g:4832:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
+            // InternalDataDSL.g:5452:56: (iv_ruleXUnaryOperation= ruleXUnaryOperation EOF )
+            // InternalDataDSL.g:5453:2: iv_ruleXUnaryOperation= ruleXUnaryOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXUnaryOperationRule()); 
@@ -13478,7 +15189,7 @@
 
 
     // $ANTLR start "ruleXUnaryOperation"
-    // InternalDataDSL.g:4838:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
+    // InternalDataDSL.g:5459:1: ruleXUnaryOperation returns [EObject current=null] : ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) ;
     public final EObject ruleXUnaryOperation() throws RecognitionException {
         EObject current = null;
 
@@ -13491,35 +15202,35 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4844:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
-            // InternalDataDSL.g:4845:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            // InternalDataDSL.g:5465:2: ( ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression ) )
+            // InternalDataDSL.g:5466:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
             {
-            // InternalDataDSL.g:4845:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
-            int alt86=2;
-            int LA86_0 = input.LA(1);
+            // InternalDataDSL.g:5466:2: ( ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) ) | this_XCastedExpression_3= ruleXCastedExpression )
+            int alt93=2;
+            int LA93_0 = input.LA(1);
 
-            if ( ((LA86_0>=109 && LA86_0<=110)||LA86_0==114) ) {
-                alt86=1;
+            if ( ((LA93_0>=122 && LA93_0<=123)||LA93_0==127) ) {
+                alt93=1;
             }
-            else if ( ((LA86_0>=RULE_STRING && LA86_0<=RULE_DECIMAL)||LA86_0==14||LA86_0==50||LA86_0==72||(LA86_0>=75 && LA86_0<=76)||LA86_0==81||(LA86_0>=85 && LA86_0<=86)||LA86_0==93||LA86_0==120||LA86_0==122||(LA86_0>=126 && LA86_0<=127)||(LA86_0>=130 && LA86_0<=139)||LA86_0==141) ) {
-                alt86=2;
+            else if ( ((LA93_0>=RULE_STRING && LA93_0<=RULE_DECIMAL)||LA93_0==14||LA93_0==52||LA93_0==75||(LA93_0>=88 && LA93_0<=89)||LA93_0==94||(LA93_0>=98 && LA93_0<=99)||LA93_0==106||LA93_0==133||LA93_0==135||(LA93_0>=139 && LA93_0<=140)||(LA93_0>=143 && LA93_0<=152)||LA93_0==154) ) {
+                alt93=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 86, 0, input);
+                    new NoViableAltException("", 93, 0, input);
 
                 throw nvae;
             }
-            switch (alt86) {
+            switch (alt93) {
                 case 1 :
-                    // InternalDataDSL.g:4846:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalDataDSL.g:5467:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
                     {
-                    // InternalDataDSL.g:4846:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
-                    // InternalDataDSL.g:4847:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalDataDSL.g:5467:3: ( () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) ) )
+                    // InternalDataDSL.g:5468:4: () ( ( ruleOpUnary ) ) ( (lv_operand_2_0= ruleXUnaryOperation ) )
                     {
-                    // InternalDataDSL.g:4847:4: ()
-                    // InternalDataDSL.g:4848:5: 
+                    // InternalDataDSL.g:5468:4: ()
+                    // InternalDataDSL.g:5469:5: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13531,11 +15242,11 @@
 
                     }
 
-                    // InternalDataDSL.g:4854:4: ( ( ruleOpUnary ) )
-                    // InternalDataDSL.g:4855:5: ( ruleOpUnary )
+                    // InternalDataDSL.g:5475:4: ( ( ruleOpUnary ) )
+                    // InternalDataDSL.g:5476:5: ( ruleOpUnary )
                     {
-                    // InternalDataDSL.g:4855:5: ( ruleOpUnary )
-                    // InternalDataDSL.g:4856:6: ruleOpUnary
+                    // InternalDataDSL.g:5476:5: ( ruleOpUnary )
+                    // InternalDataDSL.g:5477:6: ruleOpUnary
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13549,7 +15260,7 @@
                       						newCompositeNode(grammarAccess.getXUnaryOperationAccess().getFeatureJvmIdentifiableElementCrossReference_0_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_78);
+                    pushFollow(FOLLOW_84);
                     ruleOpUnary();
 
                     state._fsp--;
@@ -13565,11 +15276,11 @@
 
                     }
 
-                    // InternalDataDSL.g:4870:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
-                    // InternalDataDSL.g:4871:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalDataDSL.g:5491:4: ( (lv_operand_2_0= ruleXUnaryOperation ) )
+                    // InternalDataDSL.g:5492:5: (lv_operand_2_0= ruleXUnaryOperation )
                     {
-                    // InternalDataDSL.g:4871:5: (lv_operand_2_0= ruleXUnaryOperation )
-                    // InternalDataDSL.g:4872:6: lv_operand_2_0= ruleXUnaryOperation
+                    // InternalDataDSL.g:5492:5: (lv_operand_2_0= ruleXUnaryOperation )
+                    // InternalDataDSL.g:5493:6: lv_operand_2_0= ruleXUnaryOperation
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13607,7 +15318,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4891:3: this_XCastedExpression_3= ruleXCastedExpression
+                    // InternalDataDSL.g:5512:3: this_XCastedExpression_3= ruleXCastedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -13653,7 +15364,7 @@
 
 
     // $ANTLR start "entryRuleOpUnary"
-    // InternalDataDSL.g:4903:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
+    // InternalDataDSL.g:5524:1: entryRuleOpUnary returns [String current=null] : iv_ruleOpUnary= ruleOpUnary EOF ;
     public final String entryRuleOpUnary() throws RecognitionException {
         String current = null;
 
@@ -13661,8 +15372,8 @@
 
 
         try {
-            // InternalDataDSL.g:4903:47: (iv_ruleOpUnary= ruleOpUnary EOF )
-            // InternalDataDSL.g:4904:2: iv_ruleOpUnary= ruleOpUnary EOF
+            // InternalDataDSL.g:5524:47: (iv_ruleOpUnary= ruleOpUnary EOF )
+            // InternalDataDSL.g:5525:2: iv_ruleOpUnary= ruleOpUnary EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpUnaryRule()); 
@@ -13693,7 +15404,7 @@
 
 
     // $ANTLR start "ruleOpUnary"
-    // InternalDataDSL.g:4910:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
+    // InternalDataDSL.g:5531:1: ruleOpUnary returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '!' | kw= '-' | kw= '+' ) ;
     public final AntlrDatatypeRuleToken ruleOpUnary() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -13703,40 +15414,40 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4916:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
-            // InternalDataDSL.g:4917:2: (kw= '!' | kw= '-' | kw= '+' )
+            // InternalDataDSL.g:5537:2: ( (kw= '!' | kw= '-' | kw= '+' ) )
+            // InternalDataDSL.g:5538:2: (kw= '!' | kw= '-' | kw= '+' )
             {
-            // InternalDataDSL.g:4917:2: (kw= '!' | kw= '-' | kw= '+' )
-            int alt87=3;
+            // InternalDataDSL.g:5538:2: (kw= '!' | kw= '-' | kw= '+' )
+            int alt94=3;
             switch ( input.LA(1) ) {
-            case 114:
+            case 127:
                 {
-                alt87=1;
+                alt94=1;
                 }
                 break;
-            case 110:
+            case 123:
                 {
-                alt87=2;
+                alt94=2;
                 }
                 break;
-            case 109:
+            case 122:
                 {
-                alt87=3;
+                alt94=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 87, 0, input);
+                    new NoViableAltException("", 94, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt87) {
+            switch (alt94) {
                 case 1 :
-                    // InternalDataDSL.g:4918:3: kw= '!'
+                    // InternalDataDSL.g:5539:3: kw= '!'
                     {
-                    kw=(Token)match(input,114,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,127,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13747,9 +15458,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:4924:3: kw= '-'
+                    // InternalDataDSL.g:5545:3: kw= '-'
                     {
-                    kw=(Token)match(input,110,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,123,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13760,9 +15471,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:4930:3: kw= '+'
+                    // InternalDataDSL.g:5551:3: kw= '+'
                     {
-                    kw=(Token)match(input,109,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,122,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -13797,7 +15508,7 @@
 
 
     // $ANTLR start "entryRuleXCastedExpression"
-    // InternalDataDSL.g:4939:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
+    // InternalDataDSL.g:5560:1: entryRuleXCastedExpression returns [EObject current=null] : iv_ruleXCastedExpression= ruleXCastedExpression EOF ;
     public final EObject entryRuleXCastedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13805,8 +15516,8 @@
 
 
         try {
-            // InternalDataDSL.g:4939:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
-            // InternalDataDSL.g:4940:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
+            // InternalDataDSL.g:5560:58: (iv_ruleXCastedExpression= ruleXCastedExpression EOF )
+            // InternalDataDSL.g:5561:2: iv_ruleXCastedExpression= ruleXCastedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCastedExpressionRule()); 
@@ -13837,7 +15548,7 @@
 
 
     // $ANTLR start "ruleXCastedExpression"
-    // InternalDataDSL.g:4946:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
+    // InternalDataDSL.g:5567:1: ruleXCastedExpression returns [EObject current=null] : (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) ;
     public final EObject ruleXCastedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -13851,18 +15562,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:4952:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
-            // InternalDataDSL.g:4953:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalDataDSL.g:5573:2: ( (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* ) )
+            // InternalDataDSL.g:5574:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
             {
-            // InternalDataDSL.g:4953:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
-            // InternalDataDSL.g:4954:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            // InternalDataDSL.g:5574:2: (this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )* )
+            // InternalDataDSL.g:5575:3: this_XPostfixOperation_0= ruleXPostfixOperation ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXCastedExpressionAccess().getXPostfixOperationParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_98);
+            pushFollow(FOLLOW_104);
             this_XPostfixOperation_0=ruleXPostfixOperation();
 
             state._fsp--;
@@ -13873,35 +15584,35 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:4962:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
-            loop88:
+            // InternalDataDSL.g:5583:3: ( ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) ) )*
+            loop95:
             do {
-                int alt88=2;
-                int LA88_0 = input.LA(1);
+                int alt95=2;
+                int LA95_0 = input.LA(1);
 
-                if ( (LA88_0==68) ) {
-                    int LA88_2 = input.LA(2);
+                if ( (LA95_0==71) ) {
+                    int LA95_2 = input.LA(2);
 
                     if ( (synpred18_InternalDataDSL()) ) {
-                        alt88=1;
+                        alt95=1;
                     }
 
 
                 }
 
 
-                switch (alt88) {
+                switch (alt95) {
             	case 1 :
-            	    // InternalDataDSL.g:4963:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalDataDSL.g:5584:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) ) ( (lv_type_3_0= ruleJvmTypeReference ) )
             	    {
-            	    // InternalDataDSL.g:4963:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
-            	    // InternalDataDSL.g:4964:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
+            	    // InternalDataDSL.g:5584:4: ( ( ( () 'as' ) )=> ( () otherlv_2= 'as' ) )
+            	    // InternalDataDSL.g:5585:5: ( ( () 'as' ) )=> ( () otherlv_2= 'as' )
             	    {
-            	    // InternalDataDSL.g:4970:5: ( () otherlv_2= 'as' )
-            	    // InternalDataDSL.g:4971:6: () otherlv_2= 'as'
+            	    // InternalDataDSL.g:5591:5: ( () otherlv_2= 'as' )
+            	    // InternalDataDSL.g:5592:6: () otherlv_2= 'as'
             	    {
-            	    // InternalDataDSL.g:4971:6: ()
-            	    // InternalDataDSL.g:4972:7: 
+            	    // InternalDataDSL.g:5592:6: ()
+            	    // InternalDataDSL.g:5593:7: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -13913,7 +15624,7 @@
 
             	    }
 
-            	    otherlv_2=(Token)match(input,68,FOLLOW_91); if (state.failed) return current;
+            	    otherlv_2=(Token)match(input,71,FOLLOW_97); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      						newLeafNode(otherlv_2, grammarAccess.getXCastedExpressionAccess().getAsKeyword_1_0_0_1());
@@ -13925,18 +15636,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:4984:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
-            	    // InternalDataDSL.g:4985:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalDataDSL.g:5605:4: ( (lv_type_3_0= ruleJvmTypeReference ) )
+            	    // InternalDataDSL.g:5606:5: (lv_type_3_0= ruleJvmTypeReference )
             	    {
-            	    // InternalDataDSL.g:4985:5: (lv_type_3_0= ruleJvmTypeReference )
-            	    // InternalDataDSL.g:4986:6: lv_type_3_0= ruleJvmTypeReference
+            	    // InternalDataDSL.g:5606:5: (lv_type_3_0= ruleJvmTypeReference )
+            	    // InternalDataDSL.g:5607:6: lv_type_3_0= ruleJvmTypeReference
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXCastedExpressionAccess().getTypeJvmTypeReferenceParserRuleCall_1_1_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_98);
+            	    pushFollow(FOLLOW_104);
             	    lv_type_3_0=ruleJvmTypeReference();
 
             	    state._fsp--;
@@ -13965,7 +15676,7 @@
             	    break;
 
             	default :
-            	    break loop88;
+            	    break loop95;
                 }
             } while (true);
 
@@ -13994,7 +15705,7 @@
 
 
     // $ANTLR start "entryRuleXPostfixOperation"
-    // InternalDataDSL.g:5008:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
+    // InternalDataDSL.g:5629:1: entryRuleXPostfixOperation returns [EObject current=null] : iv_ruleXPostfixOperation= ruleXPostfixOperation EOF ;
     public final EObject entryRuleXPostfixOperation() throws RecognitionException {
         EObject current = null;
 
@@ -14002,8 +15713,8 @@
 
 
         try {
-            // InternalDataDSL.g:5008:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
-            // InternalDataDSL.g:5009:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
+            // InternalDataDSL.g:5629:58: (iv_ruleXPostfixOperation= ruleXPostfixOperation EOF )
+            // InternalDataDSL.g:5630:2: iv_ruleXPostfixOperation= ruleXPostfixOperation EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPostfixOperationRule()); 
@@ -14034,7 +15745,7 @@
 
 
     // $ANTLR start "ruleXPostfixOperation"
-    // InternalDataDSL.g:5015:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
+    // InternalDataDSL.g:5636:1: ruleXPostfixOperation returns [EObject current=null] : (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) ;
     public final EObject ruleXPostfixOperation() throws RecognitionException {
         EObject current = null;
 
@@ -14045,18 +15756,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5021:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
-            // InternalDataDSL.g:5022:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalDataDSL.g:5642:2: ( (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? ) )
+            // InternalDataDSL.g:5643:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
             {
-            // InternalDataDSL.g:5022:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
-            // InternalDataDSL.g:5023:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            // InternalDataDSL.g:5643:2: (this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )? )
+            // InternalDataDSL.g:5644:3: this_XMemberFeatureCall_0= ruleXMemberFeatureCall ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXPostfixOperationAccess().getXMemberFeatureCallParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_99);
+            pushFollow(FOLLOW_105);
             this_XMemberFeatureCall_0=ruleXMemberFeatureCall();
 
             state._fsp--;
@@ -14067,33 +15778,33 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:5031:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
-            int alt89=2;
-            int LA89_0 = input.LA(1);
+            // InternalDataDSL.g:5652:3: ( ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) ) )?
+            int alt96=2;
+            int LA96_0 = input.LA(1);
 
-            if ( (LA89_0==115) ) {
-                int LA89_1 = input.LA(2);
+            if ( (LA96_0==128) ) {
+                int LA96_1 = input.LA(2);
 
                 if ( (synpred19_InternalDataDSL()) ) {
-                    alt89=1;
+                    alt96=1;
                 }
             }
-            else if ( (LA89_0==116) ) {
-                int LA89_2 = input.LA(2);
+            else if ( (LA96_0==129) ) {
+                int LA96_2 = input.LA(2);
 
                 if ( (synpred19_InternalDataDSL()) ) {
-                    alt89=1;
+                    alt96=1;
                 }
             }
-            switch (alt89) {
+            switch (alt96) {
                 case 1 :
-                    // InternalDataDSL.g:5032:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
+                    // InternalDataDSL.g:5653:4: ( ( () ( ( ruleOpPostfix ) ) ) )=> ( () ( ( ruleOpPostfix ) ) )
                     {
-                    // InternalDataDSL.g:5042:4: ( () ( ( ruleOpPostfix ) ) )
-                    // InternalDataDSL.g:5043:5: () ( ( ruleOpPostfix ) )
+                    // InternalDataDSL.g:5663:4: ( () ( ( ruleOpPostfix ) ) )
+                    // InternalDataDSL.g:5664:5: () ( ( ruleOpPostfix ) )
                     {
-                    // InternalDataDSL.g:5043:5: ()
-                    // InternalDataDSL.g:5044:6: 
+                    // InternalDataDSL.g:5664:5: ()
+                    // InternalDataDSL.g:5665:6: 
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14105,11 +15816,11 @@
 
                     }
 
-                    // InternalDataDSL.g:5050:5: ( ( ruleOpPostfix ) )
-                    // InternalDataDSL.g:5051:6: ( ruleOpPostfix )
+                    // InternalDataDSL.g:5671:5: ( ( ruleOpPostfix ) )
+                    // InternalDataDSL.g:5672:6: ( ruleOpPostfix )
                     {
-                    // InternalDataDSL.g:5051:6: ( ruleOpPostfix )
-                    // InternalDataDSL.g:5052:7: ruleOpPostfix
+                    // InternalDataDSL.g:5672:6: ( ruleOpPostfix )
+                    // InternalDataDSL.g:5673:7: ruleOpPostfix
                     {
                     if ( state.backtracking==0 ) {
 
@@ -14173,7 +15884,7 @@
 
 
     // $ANTLR start "entryRuleOpPostfix"
-    // InternalDataDSL.g:5072:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
+    // InternalDataDSL.g:5693:1: entryRuleOpPostfix returns [String current=null] : iv_ruleOpPostfix= ruleOpPostfix EOF ;
     public final String entryRuleOpPostfix() throws RecognitionException {
         String current = null;
 
@@ -14181,8 +15892,8 @@
 
 
         try {
-            // InternalDataDSL.g:5072:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
-            // InternalDataDSL.g:5073:2: iv_ruleOpPostfix= ruleOpPostfix EOF
+            // InternalDataDSL.g:5693:49: (iv_ruleOpPostfix= ruleOpPostfix EOF )
+            // InternalDataDSL.g:5694:2: iv_ruleOpPostfix= ruleOpPostfix EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getOpPostfixRule()); 
@@ -14213,7 +15924,7 @@
 
 
     // $ANTLR start "ruleOpPostfix"
-    // InternalDataDSL.g:5079:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
+    // InternalDataDSL.g:5700:1: ruleOpPostfix returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '++' | kw= '--' ) ;
     public final AntlrDatatypeRuleToken ruleOpPostfix() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -14223,31 +15934,31 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5085:2: ( (kw= '++' | kw= '--' ) )
-            // InternalDataDSL.g:5086:2: (kw= '++' | kw= '--' )
+            // InternalDataDSL.g:5706:2: ( (kw= '++' | kw= '--' ) )
+            // InternalDataDSL.g:5707:2: (kw= '++' | kw= '--' )
             {
-            // InternalDataDSL.g:5086:2: (kw= '++' | kw= '--' )
-            int alt90=2;
-            int LA90_0 = input.LA(1);
+            // InternalDataDSL.g:5707:2: (kw= '++' | kw= '--' )
+            int alt97=2;
+            int LA97_0 = input.LA(1);
 
-            if ( (LA90_0==115) ) {
-                alt90=1;
+            if ( (LA97_0==128) ) {
+                alt97=1;
             }
-            else if ( (LA90_0==116) ) {
-                alt90=2;
+            else if ( (LA97_0==129) ) {
+                alt97=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 90, 0, input);
+                    new NoViableAltException("", 97, 0, input);
 
                 throw nvae;
             }
-            switch (alt90) {
+            switch (alt97) {
                 case 1 :
-                    // InternalDataDSL.g:5087:3: kw= '++'
+                    // InternalDataDSL.g:5708:3: kw= '++'
                     {
-                    kw=(Token)match(input,115,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,128,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -14258,9 +15969,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:5093:3: kw= '--'
+                    // InternalDataDSL.g:5714:3: kw= '--'
                     {
-                    kw=(Token)match(input,116,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,129,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -14295,7 +16006,7 @@
 
 
     // $ANTLR start "entryRuleXMemberFeatureCall"
-    // InternalDataDSL.g:5102:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
+    // InternalDataDSL.g:5723:1: entryRuleXMemberFeatureCall returns [EObject current=null] : iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF ;
     public final EObject entryRuleXMemberFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -14303,8 +16014,8 @@
 
 
         try {
-            // InternalDataDSL.g:5102:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
-            // InternalDataDSL.g:5103:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
+            // InternalDataDSL.g:5723:59: (iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF )
+            // InternalDataDSL.g:5724:2: iv_ruleXMemberFeatureCall= ruleXMemberFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXMemberFeatureCallRule()); 
@@ -14335,7 +16046,7 @@
 
 
     // $ANTLR start "ruleXMemberFeatureCall"
-    // InternalDataDSL.g:5109:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
+    // InternalDataDSL.g:5730:1: ruleXMemberFeatureCall returns [EObject current=null] : (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) ;
     public final EObject ruleXMemberFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -14371,18 +16082,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5115:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
-            // InternalDataDSL.g:5116:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            // InternalDataDSL.g:5736:2: ( (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* ) )
+            // InternalDataDSL.g:5737:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
             {
-            // InternalDataDSL.g:5116:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
-            // InternalDataDSL.g:5117:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            // InternalDataDSL.g:5737:2: (this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )* )
+            // InternalDataDSL.g:5738:3: this_XPrimaryExpression_0= ruleXPrimaryExpression ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getXPrimaryExpressionParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_100);
+            pushFollow(FOLLOW_106);
             this_XPrimaryExpression_0=ruleXPrimaryExpression();
 
             state._fsp--;
@@ -14393,45 +16104,45 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:5125:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
-            loop99:
+            // InternalDataDSL.g:5746:3: ( ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) ) | ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? ) )*
+            loop106:
             do {
-                int alt99=3;
+                int alt106=3;
                 switch ( input.LA(1) ) {
-                case 74:
+                case 87:
                     {
-                    int LA99_2 = input.LA(2);
+                    int LA106_2 = input.LA(2);
 
                     if ( (synpred20_InternalDataDSL()) ) {
-                        alt99=1;
+                        alt106=1;
                     }
                     else if ( (synpred21_InternalDataDSL()) ) {
-                        alt99=2;
+                        alt106=2;
                     }
 
 
                     }
                     break;
-                case 117:
+                case 130:
                     {
-                    int LA99_3 = input.LA(2);
+                    int LA106_3 = input.LA(2);
 
                     if ( (synpred20_InternalDataDSL()) ) {
-                        alt99=1;
+                        alt106=1;
                     }
                     else if ( (synpred21_InternalDataDSL()) ) {
-                        alt99=2;
+                        alt106=2;
                     }
 
 
                     }
                     break;
-                case 118:
+                case 131:
                     {
-                    int LA99_4 = input.LA(2);
+                    int LA106_4 = input.LA(2);
 
                     if ( (synpred21_InternalDataDSL()) ) {
-                        alt99=2;
+                        alt106=2;
                     }
 
 
@@ -14440,21 +16151,21 @@
 
                 }
 
-                switch (alt99) {
+                switch (alt106) {
             	case 1 :
-            	    // InternalDataDSL.g:5126:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalDataDSL.g:5747:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
             	    {
-            	    // InternalDataDSL.g:5126:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
-            	    // InternalDataDSL.g:5127:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalDataDSL.g:5747:4: ( ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) ) )
+            	    // InternalDataDSL.g:5748:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) ) ( (lv_value_6_0= ruleXAssignment ) )
             	    {
-            	    // InternalDataDSL.g:5127:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
-            	    // InternalDataDSL.g:5128:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalDataDSL.g:5748:5: ( ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+            	    // InternalDataDSL.g:5749:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )=> ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
             	    {
-            	    // InternalDataDSL.g:5148:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
-            	    // InternalDataDSL.g:5149:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+            	    // InternalDataDSL.g:5769:6: ( () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+            	    // InternalDataDSL.g:5770:7: () (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
             	    {
-            	    // InternalDataDSL.g:5149:7: ()
-            	    // InternalDataDSL.g:5150:8: 
+            	    // InternalDataDSL.g:5770:7: ()
+            	    // InternalDataDSL.g:5771:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -14466,28 +16177,28 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5156:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
-            	    int alt91=2;
-            	    int LA91_0 = input.LA(1);
+            	    // InternalDataDSL.g:5777:7: (otherlv_2= '.' | ( (lv_explicitStatic_3_0= '::' ) ) )
+            	    int alt98=2;
+            	    int LA98_0 = input.LA(1);
 
-            	    if ( (LA91_0==74) ) {
-            	        alt91=1;
+            	    if ( (LA98_0==87) ) {
+            	        alt98=1;
             	    }
-            	    else if ( (LA91_0==117) ) {
-            	        alt91=2;
+            	    else if ( (LA98_0==130) ) {
+            	        alt98=2;
             	    }
             	    else {
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        NoViableAltException nvae =
-            	            new NoViableAltException("", 91, 0, input);
+            	            new NoViableAltException("", 98, 0, input);
 
             	        throw nvae;
             	    }
-            	    switch (alt91) {
+            	    switch (alt98) {
             	        case 1 :
-            	            // InternalDataDSL.g:5157:8: otherlv_2= '.'
+            	            // InternalDataDSL.g:5778:8: otherlv_2= '.'
             	            {
-            	            otherlv_2=(Token)match(input,74,FOLLOW_101); if (state.failed) return current;
+            	            otherlv_2=(Token)match(input,87,FOLLOW_107); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              								newLeafNode(otherlv_2, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_0_0_0_1_0());
@@ -14497,15 +16208,15 @@
             	            }
             	            break;
             	        case 2 :
-            	            // InternalDataDSL.g:5162:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalDataDSL.g:5783:8: ( (lv_explicitStatic_3_0= '::' ) )
             	            {
-            	            // InternalDataDSL.g:5162:8: ( (lv_explicitStatic_3_0= '::' ) )
-            	            // InternalDataDSL.g:5163:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalDataDSL.g:5783:8: ( (lv_explicitStatic_3_0= '::' ) )
+            	            // InternalDataDSL.g:5784:9: (lv_explicitStatic_3_0= '::' )
             	            {
-            	            // InternalDataDSL.g:5163:9: (lv_explicitStatic_3_0= '::' )
-            	            // InternalDataDSL.g:5164:10: lv_explicitStatic_3_0= '::'
+            	            // InternalDataDSL.g:5784:9: (lv_explicitStatic_3_0= '::' )
+            	            // InternalDataDSL.g:5785:10: lv_explicitStatic_3_0= '::'
             	            {
-            	            lv_explicitStatic_3_0=(Token)match(input,117,FOLLOW_101); if (state.failed) return current;
+            	            lv_explicitStatic_3_0=(Token)match(input,130,FOLLOW_107); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              										newLeafNode(lv_explicitStatic_3_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_0_0_0_1_1_0());
@@ -14531,11 +16242,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5177:7: ( ( ruleFeatureCallID ) )
-            	    // InternalDataDSL.g:5178:8: ( ruleFeatureCallID )
+            	    // InternalDataDSL.g:5798:7: ( ( ruleFeatureCallID ) )
+            	    // InternalDataDSL.g:5799:8: ( ruleFeatureCallID )
             	    {
-            	    // InternalDataDSL.g:5178:8: ( ruleFeatureCallID )
-            	    // InternalDataDSL.g:5179:9: ruleFeatureCallID
+            	    // InternalDataDSL.g:5799:8: ( ruleFeatureCallID )
+            	    // InternalDataDSL.g:5800:9: ruleFeatureCallID
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -14549,7 +16260,7 @@
             	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_0_0_0_2_0());
             	      								
             	    }
-            	    pushFollow(FOLLOW_77);
+            	    pushFollow(FOLLOW_83);
             	    ruleFeatureCallID();
 
             	    state._fsp--;
@@ -14570,7 +16281,7 @@
             	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getOpSingleAssignParserRuleCall_1_0_0_0_3());
             	      						
             	    }
-            	    pushFollow(FOLLOW_78);
+            	    pushFollow(FOLLOW_84);
             	    ruleOpSingleAssign();
 
             	    state._fsp--;
@@ -14586,18 +16297,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5202:5: ( (lv_value_6_0= ruleXAssignment ) )
-            	    // InternalDataDSL.g:5203:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalDataDSL.g:5823:5: ( (lv_value_6_0= ruleXAssignment ) )
+            	    // InternalDataDSL.g:5824:6: (lv_value_6_0= ruleXAssignment )
             	    {
-            	    // InternalDataDSL.g:5203:6: (lv_value_6_0= ruleXAssignment )
-            	    // InternalDataDSL.g:5204:7: lv_value_6_0= ruleXAssignment
+            	    // InternalDataDSL.g:5824:6: (lv_value_6_0= ruleXAssignment )
+            	    // InternalDataDSL.g:5825:7: lv_value_6_0= ruleXAssignment
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getValueXAssignmentParserRuleCall_1_0_1_0());
             	      						
             	    }
-            	    pushFollow(FOLLOW_100);
+            	    pushFollow(FOLLOW_106);
             	    lv_value_6_0=ruleXAssignment();
 
             	    state._fsp--;
@@ -14628,19 +16339,19 @@
             	    }
             	    break;
             	case 2 :
-            	    // InternalDataDSL.g:5223:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    // InternalDataDSL.g:5844:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
             	    {
-            	    // InternalDataDSL.g:5223:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
-            	    // InternalDataDSL.g:5224:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    // InternalDataDSL.g:5844:4: ( ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )? )
+            	    // InternalDataDSL.g:5845:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) ) (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )? ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
             	    {
-            	    // InternalDataDSL.g:5224:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
-            	    // InternalDataDSL.g:5225:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalDataDSL.g:5845:5: ( ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) ) )
+            	    // InternalDataDSL.g:5846:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )=> ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
             	    {
-            	    // InternalDataDSL.g:5245:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
-            	    // InternalDataDSL.g:5246:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    // InternalDataDSL.g:5866:6: ( () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) ) )
+            	    // InternalDataDSL.g:5867:7: () (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
             	    {
-            	    // InternalDataDSL.g:5246:7: ()
-            	    // InternalDataDSL.g:5247:8: 
+            	    // InternalDataDSL.g:5867:7: ()
+            	    // InternalDataDSL.g:5868:8: 
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -14652,37 +16363,37 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5253:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
-            	    int alt92=3;
+            	    // InternalDataDSL.g:5874:7: (otherlv_8= '.' | ( (lv_nullSafe_9_0= '?.' ) ) | ( (lv_explicitStatic_10_0= '::' ) ) )
+            	    int alt99=3;
             	    switch ( input.LA(1) ) {
-            	    case 74:
+            	    case 87:
             	        {
-            	        alt92=1;
+            	        alt99=1;
             	        }
             	        break;
-            	    case 118:
+            	    case 131:
             	        {
-            	        alt92=2;
+            	        alt99=2;
             	        }
             	        break;
-            	    case 117:
+            	    case 130:
             	        {
-            	        alt92=3;
+            	        alt99=3;
             	        }
             	        break;
             	    default:
             	        if (state.backtracking>0) {state.failed=true; return current;}
             	        NoViableAltException nvae =
-            	            new NoViableAltException("", 92, 0, input);
+            	            new NoViableAltException("", 99, 0, input);
 
             	        throw nvae;
             	    }
 
-            	    switch (alt92) {
+            	    switch (alt99) {
             	        case 1 :
-            	            // InternalDataDSL.g:5254:8: otherlv_8= '.'
+            	            // InternalDataDSL.g:5875:8: otherlv_8= '.'
             	            {
-            	            otherlv_8=(Token)match(input,74,FOLLOW_102); if (state.failed) return current;
+            	            otherlv_8=(Token)match(input,87,FOLLOW_108); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              								newLeafNode(otherlv_8, grammarAccess.getXMemberFeatureCallAccess().getFullStopKeyword_1_1_0_0_1_0());
@@ -14692,15 +16403,15 @@
             	            }
             	            break;
             	        case 2 :
-            	            // InternalDataDSL.g:5259:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalDataDSL.g:5880:8: ( (lv_nullSafe_9_0= '?.' ) )
             	            {
-            	            // InternalDataDSL.g:5259:8: ( (lv_nullSafe_9_0= '?.' ) )
-            	            // InternalDataDSL.g:5260:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalDataDSL.g:5880:8: ( (lv_nullSafe_9_0= '?.' ) )
+            	            // InternalDataDSL.g:5881:9: (lv_nullSafe_9_0= '?.' )
             	            {
-            	            // InternalDataDSL.g:5260:9: (lv_nullSafe_9_0= '?.' )
-            	            // InternalDataDSL.g:5261:10: lv_nullSafe_9_0= '?.'
+            	            // InternalDataDSL.g:5881:9: (lv_nullSafe_9_0= '?.' )
+            	            // InternalDataDSL.g:5882:10: lv_nullSafe_9_0= '?.'
             	            {
-            	            lv_nullSafe_9_0=(Token)match(input,118,FOLLOW_102); if (state.failed) return current;
+            	            lv_nullSafe_9_0=(Token)match(input,131,FOLLOW_108); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              										newLeafNode(lv_nullSafe_9_0, grammarAccess.getXMemberFeatureCallAccess().getNullSafeQuestionMarkFullStopKeyword_1_1_0_0_1_1_0());
@@ -14724,15 +16435,15 @@
             	            }
             	            break;
             	        case 3 :
-            	            // InternalDataDSL.g:5274:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalDataDSL.g:5895:8: ( (lv_explicitStatic_10_0= '::' ) )
             	            {
-            	            // InternalDataDSL.g:5274:8: ( (lv_explicitStatic_10_0= '::' ) )
-            	            // InternalDataDSL.g:5275:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalDataDSL.g:5895:8: ( (lv_explicitStatic_10_0= '::' ) )
+            	            // InternalDataDSL.g:5896:9: (lv_explicitStatic_10_0= '::' )
             	            {
-            	            // InternalDataDSL.g:5275:9: (lv_explicitStatic_10_0= '::' )
-            	            // InternalDataDSL.g:5276:10: lv_explicitStatic_10_0= '::'
+            	            // InternalDataDSL.g:5896:9: (lv_explicitStatic_10_0= '::' )
+            	            // InternalDataDSL.g:5897:10: lv_explicitStatic_10_0= '::'
             	            {
-            	            lv_explicitStatic_10_0=(Token)match(input,117,FOLLOW_102); if (state.failed) return current;
+            	            lv_explicitStatic_10_0=(Token)match(input,130,FOLLOW_108); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              										newLeafNode(lv_explicitStatic_10_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitStaticColonColonKeyword_1_1_0_0_1_2_0());
@@ -14764,35 +16475,35 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5291:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
-            	    int alt94=2;
-            	    int LA94_0 = input.LA(1);
+            	    // InternalDataDSL.g:5912:5: (otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>' )?
+            	    int alt101=2;
+            	    int LA101_0 = input.LA(1);
 
-            	    if ( (LA94_0==93) ) {
-            	        alt94=1;
+            	    if ( (LA101_0==106) ) {
+            	        alt101=1;
             	    }
-            	    switch (alt94) {
+            	    switch (alt101) {
             	        case 1 :
-            	            // InternalDataDSL.g:5292:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
+            	            // InternalDataDSL.g:5913:6: otherlv_11= '<' ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) ) (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )* otherlv_15= '>'
             	            {
-            	            otherlv_11=(Token)match(input,93,FOLLOW_103); if (state.failed) return current;
+            	            otherlv_11=(Token)match(input,106,FOLLOW_109); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              						newLeafNode(otherlv_11, grammarAccess.getXMemberFeatureCallAccess().getLessThanSignKeyword_1_1_1_0());
             	              					
             	            }
-            	            // InternalDataDSL.g:5296:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
-            	            // InternalDataDSL.g:5297:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalDataDSL.g:5917:6: ( (lv_typeArguments_12_0= ruleJvmArgumentTypeReference ) )
+            	            // InternalDataDSL.g:5918:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
             	            {
-            	            // InternalDataDSL.g:5297:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
-            	            // InternalDataDSL.g:5298:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
+            	            // InternalDataDSL.g:5918:7: (lv_typeArguments_12_0= ruleJvmArgumentTypeReference )
+            	            // InternalDataDSL.g:5919:8: lv_typeArguments_12_0= ruleJvmArgumentTypeReference
             	            {
             	            if ( state.backtracking==0 ) {
 
             	              								newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_1_0());
             	              							
             	            }
-            	            pushFollow(FOLLOW_104);
+            	            pushFollow(FOLLOW_110);
             	            lv_typeArguments_12_0=ruleJvmArgumentTypeReference();
 
             	            state._fsp--;
@@ -14816,39 +16527,39 @@
 
             	            }
 
-            	            // InternalDataDSL.g:5315:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
-            	            loop93:
+            	            // InternalDataDSL.g:5936:6: (otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) ) )*
+            	            loop100:
             	            do {
-            	                int alt93=2;
-            	                int LA93_0 = input.LA(1);
+            	                int alt100=2;
+            	                int LA100_0 = input.LA(1);
 
-            	                if ( (LA93_0==82) ) {
-            	                    alt93=1;
+            	                if ( (LA100_0==95) ) {
+            	                    alt100=1;
             	                }
 
 
-            	                switch (alt93) {
+            	                switch (alt100) {
             	            	case 1 :
-            	            	    // InternalDataDSL.g:5316:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalDataDSL.g:5937:7: otherlv_13= ',' ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
             	            	    {
-            	            	    otherlv_13=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
+            	            	    otherlv_13=(Token)match(input,95,FOLLOW_109); if (state.failed) return current;
             	            	    if ( state.backtracking==0 ) {
 
             	            	      							newLeafNode(otherlv_13, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_1_2_0());
             	            	      						
             	            	    }
-            	            	    // InternalDataDSL.g:5320:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
-            	            	    // InternalDataDSL.g:5321:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalDataDSL.g:5941:7: ( (lv_typeArguments_14_0= ruleJvmArgumentTypeReference ) )
+            	            	    // InternalDataDSL.g:5942:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
             	            	    {
-            	            	    // InternalDataDSL.g:5321:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
-            	            	    // InternalDataDSL.g:5322:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
+            	            	    // InternalDataDSL.g:5942:8: (lv_typeArguments_14_0= ruleJvmArgumentTypeReference )
+            	            	    // InternalDataDSL.g:5943:9: lv_typeArguments_14_0= ruleJvmArgumentTypeReference
             	            	    {
             	            	    if ( state.backtracking==0 ) {
 
             	            	      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_1_2_1_0());
             	            	      								
             	            	    }
-            	            	    pushFollow(FOLLOW_104);
+            	            	    pushFollow(FOLLOW_110);
             	            	    lv_typeArguments_14_0=ruleJvmArgumentTypeReference();
 
             	            	    state._fsp--;
@@ -14877,11 +16588,11 @@
             	            	    break;
 
             	            	default :
-            	            	    break loop93;
+            	            	    break loop100;
             	                }
             	            } while (true);
 
-            	            otherlv_15=(Token)match(input,94,FOLLOW_102); if (state.failed) return current;
+            	            otherlv_15=(Token)match(input,107,FOLLOW_108); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              						newLeafNode(otherlv_15, grammarAccess.getXMemberFeatureCallAccess().getGreaterThanSignKeyword_1_1_1_3());
@@ -14893,11 +16604,11 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5345:5: ( ( ruleIdOrSuper ) )
-            	    // InternalDataDSL.g:5346:6: ( ruleIdOrSuper )
+            	    // InternalDataDSL.g:5966:5: ( ( ruleIdOrSuper ) )
+            	    // InternalDataDSL.g:5967:6: ( ruleIdOrSuper )
             	    {
-            	    // InternalDataDSL.g:5346:6: ( ruleIdOrSuper )
-            	    // InternalDataDSL.g:5347:7: ruleIdOrSuper
+            	    // InternalDataDSL.g:5967:6: ( ruleIdOrSuper )
+            	    // InternalDataDSL.g:5968:7: ruleIdOrSuper
             	    {
             	    if ( state.backtracking==0 ) {
 
@@ -14911,7 +16622,7 @@
             	      							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_1_1_2_0());
             	      						
             	    }
-            	    pushFollow(FOLLOW_105);
+            	    pushFollow(FOLLOW_111);
             	    ruleIdOrSuper();
 
             	    state._fsp--;
@@ -14927,20 +16638,20 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5361:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
-            	    int alt97=2;
-            	    alt97 = dfa97.predict(input);
-            	    switch (alt97) {
+            	    // InternalDataDSL.g:5982:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?
+            	    int alt104=2;
+            	    alt104 = dfa104.predict(input);
+            	    switch (alt104) {
             	        case 1 :
-            	            // InternalDataDSL.g:5362:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
+            	            // InternalDataDSL.g:5983:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')'
             	            {
-            	            // InternalDataDSL.g:5362:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
-            	            // InternalDataDSL.g:5363:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalDataDSL.g:5983:6: ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) )
+            	            // InternalDataDSL.g:5984:7: ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' )
             	            {
-            	            // InternalDataDSL.g:5367:7: (lv_explicitOperationCall_17_0= '(' )
-            	            // InternalDataDSL.g:5368:8: lv_explicitOperationCall_17_0= '('
+            	            // InternalDataDSL.g:5988:7: (lv_explicitOperationCall_17_0= '(' )
+            	            // InternalDataDSL.g:5989:8: lv_explicitOperationCall_17_0= '('
             	            {
-            	            lv_explicitOperationCall_17_0=(Token)match(input,81,FOLLOW_106); if (state.failed) return current;
+            	            lv_explicitOperationCall_17_0=(Token)match(input,94,FOLLOW_112); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              								newLeafNode(lv_explicitOperationCall_17_0, grammarAccess.getXMemberFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_1_1_3_0_0());
@@ -14960,25 +16671,25 @@
 
             	            }
 
-            	            // InternalDataDSL.g:5380:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
-            	            int alt96=3;
-            	            alt96 = dfa96.predict(input);
-            	            switch (alt96) {
+            	            // InternalDataDSL.g:6001:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?
+            	            int alt103=3;
+            	            alt103 = dfa103.predict(input);
+            	            switch (alt103) {
             	                case 1 :
-            	                    // InternalDataDSL.g:5381:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalDataDSL.g:6002:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
             	                    {
-            	                    // InternalDataDSL.g:5381:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
-            	                    // InternalDataDSL.g:5382:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalDataDSL.g:6002:7: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) )
+            	                    // InternalDataDSL.g:6003:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure )
             	                    {
-            	                    // InternalDataDSL.g:5407:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
-            	                    // InternalDataDSL.g:5408:9: lv_memberCallArguments_18_0= ruleXShortClosure
+            	                    // InternalDataDSL.g:6028:8: (lv_memberCallArguments_18_0= ruleXShortClosure )
+            	                    // InternalDataDSL.g:6029:9: lv_memberCallArguments_18_0= ruleXShortClosure
             	                    {
             	                    if ( state.backtracking==0 ) {
 
             	                      									newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXShortClosureParserRuleCall_1_1_3_1_0_0());
             	                      								
             	                    }
-            	                    pushFollow(FOLLOW_76);
+            	                    pushFollow(FOLLOW_82);
             	                    lv_memberCallArguments_18_0=ruleXShortClosure();
 
             	                    state._fsp--;
@@ -15006,23 +16717,23 @@
             	                    }
             	                    break;
             	                case 2 :
-            	                    // InternalDataDSL.g:5426:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalDataDSL.g:6047:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
             	                    {
-            	                    // InternalDataDSL.g:5426:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
-            	                    // InternalDataDSL.g:5427:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    // InternalDataDSL.g:6047:7: ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* )
+            	                    // InternalDataDSL.g:6048:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
             	                    {
-            	                    // InternalDataDSL.g:5427:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
-            	                    // InternalDataDSL.g:5428:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalDataDSL.g:6048:8: ( (lv_memberCallArguments_19_0= ruleXExpression ) )
+            	                    // InternalDataDSL.g:6049:9: (lv_memberCallArguments_19_0= ruleXExpression )
             	                    {
-            	                    // InternalDataDSL.g:5428:9: (lv_memberCallArguments_19_0= ruleXExpression )
-            	                    // InternalDataDSL.g:5429:10: lv_memberCallArguments_19_0= ruleXExpression
+            	                    // InternalDataDSL.g:6049:9: (lv_memberCallArguments_19_0= ruleXExpression )
+            	                    // InternalDataDSL.g:6050:10: lv_memberCallArguments_19_0= ruleXExpression
             	                    {
             	                    if ( state.backtracking==0 ) {
 
             	                      										newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_0_0());
             	                      									
             	                    }
-            	                    pushFollow(FOLLOW_75);
+            	                    pushFollow(FOLLOW_81);
             	                    lv_memberCallArguments_19_0=ruleXExpression();
 
             	                    state._fsp--;
@@ -15046,39 +16757,39 @@
 
             	                    }
 
-            	                    // InternalDataDSL.g:5446:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
-            	                    loop95:
+            	                    // InternalDataDSL.g:6067:8: (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )*
+            	                    loop102:
             	                    do {
-            	                        int alt95=2;
-            	                        int LA95_0 = input.LA(1);
+            	                        int alt102=2;
+            	                        int LA102_0 = input.LA(1);
 
-            	                        if ( (LA95_0==82) ) {
-            	                            alt95=1;
+            	                        if ( (LA102_0==95) ) {
+            	                            alt102=1;
             	                        }
 
 
-            	                        switch (alt95) {
+            	                        switch (alt102) {
             	                    	case 1 :
-            	                    	    // InternalDataDSL.g:5447:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalDataDSL.g:6068:9: otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) )
             	                    	    {
-            	                    	    otherlv_20=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+            	                    	    otherlv_20=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
             	                    	    if ( state.backtracking==0 ) {
 
             	                    	      									newLeafNode(otherlv_20, grammarAccess.getXMemberFeatureCallAccess().getCommaKeyword_1_1_3_1_1_1_0());
             	                    	      								
             	                    	    }
-            	                    	    // InternalDataDSL.g:5451:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
-            	                    	    // InternalDataDSL.g:5452:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalDataDSL.g:6072:9: ( (lv_memberCallArguments_21_0= ruleXExpression ) )
+            	                    	    // InternalDataDSL.g:6073:10: (lv_memberCallArguments_21_0= ruleXExpression )
             	                    	    {
-            	                    	    // InternalDataDSL.g:5452:10: (lv_memberCallArguments_21_0= ruleXExpression )
-            	                    	    // InternalDataDSL.g:5453:11: lv_memberCallArguments_21_0= ruleXExpression
+            	                    	    // InternalDataDSL.g:6073:10: (lv_memberCallArguments_21_0= ruleXExpression )
+            	                    	    // InternalDataDSL.g:6074:11: lv_memberCallArguments_21_0= ruleXExpression
             	                    	    {
             	                    	    if ( state.backtracking==0 ) {
 
             	                    	      											newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXExpressionParserRuleCall_1_1_3_1_1_1_1_0());
             	                    	      										
             	                    	    }
-            	                    	    pushFollow(FOLLOW_75);
+            	                    	    pushFollow(FOLLOW_81);
             	                    	    lv_memberCallArguments_21_0=ruleXExpression();
 
             	                    	    state._fsp--;
@@ -15107,7 +16818,7 @@
             	                    	    break;
 
             	                    	default :
-            	                    	    break loop95;
+            	                    	    break loop102;
             	                        }
             	                    } while (true);
 
@@ -15120,7 +16831,7 @@
 
             	            }
 
-            	            otherlv_22=(Token)match(input,83,FOLLOW_107); if (state.failed) return current;
+            	            otherlv_22=(Token)match(input,96,FOLLOW_113); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              						newLeafNode(otherlv_22, grammarAccess.getXMemberFeatureCallAccess().getRightParenthesisKeyword_1_1_3_2());
@@ -15132,22 +16843,22 @@
 
             	    }
 
-            	    // InternalDataDSL.g:5478:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
-            	    int alt98=2;
-            	    alt98 = dfa98.predict(input);
-            	    switch (alt98) {
+            	    // InternalDataDSL.g:6099:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?
+            	    int alt105=2;
+            	    alt105 = dfa105.predict(input);
+            	    switch (alt105) {
             	        case 1 :
-            	            // InternalDataDSL.g:5479:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalDataDSL.g:6100:6: ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure )
             	            {
-            	            // InternalDataDSL.g:5485:6: (lv_memberCallArguments_23_0= ruleXClosure )
-            	            // InternalDataDSL.g:5486:7: lv_memberCallArguments_23_0= ruleXClosure
+            	            // InternalDataDSL.g:6106:6: (lv_memberCallArguments_23_0= ruleXClosure )
+            	            // InternalDataDSL.g:6107:7: lv_memberCallArguments_23_0= ruleXClosure
             	            {
             	            if ( state.backtracking==0 ) {
 
             	              							newCompositeNode(grammarAccess.getXMemberFeatureCallAccess().getMemberCallArgumentsXClosureParserRuleCall_1_1_4_0());
             	              						
             	            }
-            	            pushFollow(FOLLOW_100);
+            	            pushFollow(FOLLOW_106);
             	            lv_memberCallArguments_23_0=ruleXClosure();
 
             	            state._fsp--;
@@ -15182,7 +16893,7 @@
             	    break;
 
             	default :
-            	    break loop99;
+            	    break loop106;
                 }
             } while (true);
 
@@ -15211,7 +16922,7 @@
 
 
     // $ANTLR start "entryRuleXPrimaryExpression"
-    // InternalDataDSL.g:5509:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
+    // InternalDataDSL.g:6130:1: entryRuleXPrimaryExpression returns [EObject current=null] : iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF ;
     public final EObject entryRuleXPrimaryExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15219,8 +16930,8 @@
 
 
         try {
-            // InternalDataDSL.g:5509:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
-            // InternalDataDSL.g:5510:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
+            // InternalDataDSL.g:6130:59: (iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF )
+            // InternalDataDSL.g:6131:2: iv_ruleXPrimaryExpression= ruleXPrimaryExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXPrimaryExpressionRule()); 
@@ -15251,7 +16962,7 @@
 
 
     // $ANTLR start "ruleXPrimaryExpression"
-    // InternalDataDSL.g:5516:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
+    // InternalDataDSL.g:6137:1: ruleXPrimaryExpression returns [EObject current=null] : (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) ;
     public final EObject ruleXPrimaryExpression() throws RecognitionException {
         EObject current = null;
 
@@ -15290,15 +17001,15 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5522:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
-            // InternalDataDSL.g:5523:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            // InternalDataDSL.g:6143:2: ( (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression ) )
+            // InternalDataDSL.g:6144:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
             {
-            // InternalDataDSL.g:5523:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
-            int alt100=15;
-            alt100 = dfa100.predict(input);
-            switch (alt100) {
+            // InternalDataDSL.g:6144:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )
+            int alt107=15;
+            alt107 = dfa107.predict(input);
+            switch (alt107) {
                 case 1 :
-                    // InternalDataDSL.g:5524:3: this_XConstructorCall_0= ruleXConstructorCall
+                    // InternalDataDSL.g:6145:3: this_XConstructorCall_0= ruleXConstructorCall
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15320,7 +17031,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:5533:3: this_XBlockExpression_1= ruleXBlockExpression
+                    // InternalDataDSL.g:6154:3: this_XBlockExpression_1= ruleXBlockExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15342,7 +17053,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:5542:3: this_XSwitchExpression_2= ruleXSwitchExpression
+                    // InternalDataDSL.g:6163:3: this_XSwitchExpression_2= ruleXSwitchExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15364,10 +17075,10 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:5551:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalDataDSL.g:6172:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
                     {
-                    // InternalDataDSL.g:5551:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
-                    // InternalDataDSL.g:5552:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
+                    // InternalDataDSL.g:6172:3: ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression )
+                    // InternalDataDSL.g:6173:4: ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15392,7 +17103,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:5569:3: this_XFeatureCall_4= ruleXFeatureCall
+                    // InternalDataDSL.g:6190:3: this_XFeatureCall_4= ruleXFeatureCall
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15414,7 +17125,7 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:5578:3: this_XLiteral_5= ruleXLiteral
+                    // InternalDataDSL.g:6199:3: this_XLiteral_5= ruleXLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15436,7 +17147,7 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:5587:3: this_XIfExpression_6= ruleXIfExpression
+                    // InternalDataDSL.g:6208:3: this_XIfExpression_6= ruleXIfExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15458,10 +17169,10 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:5596:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalDataDSL.g:6217:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
                     {
-                    // InternalDataDSL.g:5596:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
-                    // InternalDataDSL.g:5597:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
+                    // InternalDataDSL.g:6217:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression )
+                    // InternalDataDSL.g:6218:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15486,7 +17197,7 @@
                     }
                     break;
                 case 9 :
-                    // InternalDataDSL.g:5620:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
+                    // InternalDataDSL.g:6241:3: this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15508,7 +17219,7 @@
                     }
                     break;
                 case 10 :
-                    // InternalDataDSL.g:5629:3: this_XWhileExpression_9= ruleXWhileExpression
+                    // InternalDataDSL.g:6250:3: this_XWhileExpression_9= ruleXWhileExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15530,7 +17241,7 @@
                     }
                     break;
                 case 11 :
-                    // InternalDataDSL.g:5638:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
+                    // InternalDataDSL.g:6259:3: this_XDoWhileExpression_10= ruleXDoWhileExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15552,7 +17263,7 @@
                     }
                     break;
                 case 12 :
-                    // InternalDataDSL.g:5647:3: this_XThrowExpression_11= ruleXThrowExpression
+                    // InternalDataDSL.g:6268:3: this_XThrowExpression_11= ruleXThrowExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15574,7 +17285,7 @@
                     }
                     break;
                 case 13 :
-                    // InternalDataDSL.g:5656:3: this_XReturnExpression_12= ruleXReturnExpression
+                    // InternalDataDSL.g:6277:3: this_XReturnExpression_12= ruleXReturnExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15596,7 +17307,7 @@
                     }
                     break;
                 case 14 :
-                    // InternalDataDSL.g:5665:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
+                    // InternalDataDSL.g:6286:3: this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15618,7 +17329,7 @@
                     }
                     break;
                 case 15 :
-                    // InternalDataDSL.g:5674:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
+                    // InternalDataDSL.g:6295:3: this_XParenthesizedExpression_14= ruleXParenthesizedExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15664,7 +17375,7 @@
 
 
     // $ANTLR start "entryRuleXLiteral"
-    // InternalDataDSL.g:5686:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
+    // InternalDataDSL.g:6307:1: entryRuleXLiteral returns [EObject current=null] : iv_ruleXLiteral= ruleXLiteral EOF ;
     public final EObject entryRuleXLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -15672,8 +17383,8 @@
 
 
         try {
-            // InternalDataDSL.g:5686:49: (iv_ruleXLiteral= ruleXLiteral EOF )
-            // InternalDataDSL.g:5687:2: iv_ruleXLiteral= ruleXLiteral EOF
+            // InternalDataDSL.g:6307:49: (iv_ruleXLiteral= ruleXLiteral EOF )
+            // InternalDataDSL.g:6308:2: iv_ruleXLiteral= ruleXLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXLiteralRule()); 
@@ -15704,7 +17415,7 @@
 
 
     // $ANTLR start "ruleXLiteral"
-    // InternalDataDSL.g:5693:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
+    // InternalDataDSL.g:6314:1: ruleXLiteral returns [EObject current=null] : (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) ;
     public final EObject ruleXLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -15727,44 +17438,44 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5699:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
-            // InternalDataDSL.g:5700:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            // InternalDataDSL.g:6320:2: ( (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral ) )
+            // InternalDataDSL.g:6321:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
             {
-            // InternalDataDSL.g:5700:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
-            int alt101=7;
-            int LA101_0 = input.LA(1);
+            // InternalDataDSL.g:6321:2: (this_XCollectionLiteral_0= ruleXCollectionLiteral | ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure ) | this_XBooleanLiteral_2= ruleXBooleanLiteral | this_XNumberLiteral_3= ruleXNumberLiteral | this_XNullLiteral_4= ruleXNullLiteral | this_XStringLiteral_5= ruleXStringLiteral | this_XTypeLiteral_6= ruleXTypeLiteral )
+            int alt108=7;
+            int LA108_0 = input.LA(1);
 
-            if ( (LA101_0==85) ) {
-                alt101=1;
+            if ( (LA108_0==98) ) {
+                alt108=1;
             }
-            else if ( (LA101_0==86) && (synpred27_InternalDataDSL())) {
-                alt101=2;
+            else if ( (LA108_0==99) && (synpred27_InternalDataDSL())) {
+                alt108=2;
             }
-            else if ( ((LA101_0>=133 && LA101_0<=134)) ) {
-                alt101=3;
+            else if ( ((LA108_0>=146 && LA108_0<=147)) ) {
+                alt108=3;
             }
-            else if ( (LA101_0==RULE_INT||(LA101_0>=RULE_HEX && LA101_0<=RULE_DECIMAL)) ) {
-                alt101=4;
+            else if ( (LA108_0==RULE_INT||(LA108_0>=RULE_HEX && LA108_0<=RULE_DECIMAL)) ) {
+                alt108=4;
             }
-            else if ( (LA101_0==135) ) {
-                alt101=5;
+            else if ( (LA108_0==148) ) {
+                alt108=5;
             }
-            else if ( (LA101_0==RULE_STRING) ) {
-                alt101=6;
+            else if ( (LA108_0==RULE_STRING) ) {
+                alt108=6;
             }
-            else if ( (LA101_0==136) ) {
-                alt101=7;
+            else if ( (LA108_0==149) ) {
+                alt108=7;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 101, 0, input);
+                    new NoViableAltException("", 108, 0, input);
 
                 throw nvae;
             }
-            switch (alt101) {
+            switch (alt108) {
                 case 1 :
-                    // InternalDataDSL.g:5701:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
+                    // InternalDataDSL.g:6322:3: this_XCollectionLiteral_0= ruleXCollectionLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15786,10 +17497,10 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:5710:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalDataDSL.g:6331:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
                     {
-                    // InternalDataDSL.g:5710:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
-                    // InternalDataDSL.g:5711:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
+                    // InternalDataDSL.g:6331:3: ( ( ( () '[' ) )=>this_XClosure_1= ruleXClosure )
+                    // InternalDataDSL.g:6332:4: ( ( () '[' ) )=>this_XClosure_1= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15814,7 +17525,7 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:5727:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
+                    // InternalDataDSL.g:6348:3: this_XBooleanLiteral_2= ruleXBooleanLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15836,7 +17547,7 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:5736:3: this_XNumberLiteral_3= ruleXNumberLiteral
+                    // InternalDataDSL.g:6357:3: this_XNumberLiteral_3= ruleXNumberLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15858,7 +17569,7 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:5745:3: this_XNullLiteral_4= ruleXNullLiteral
+                    // InternalDataDSL.g:6366:3: this_XNullLiteral_4= ruleXNullLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15880,7 +17591,7 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:5754:3: this_XStringLiteral_5= ruleXStringLiteral
+                    // InternalDataDSL.g:6375:3: this_XStringLiteral_5= ruleXStringLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15902,7 +17613,7 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:5763:3: this_XTypeLiteral_6= ruleXTypeLiteral
+                    // InternalDataDSL.g:6384:3: this_XTypeLiteral_6= ruleXTypeLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -15948,7 +17659,7 @@
 
 
     // $ANTLR start "entryRuleXCollectionLiteral"
-    // InternalDataDSL.g:5775:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
+    // InternalDataDSL.g:6396:1: entryRuleXCollectionLiteral returns [EObject current=null] : iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF ;
     public final EObject entryRuleXCollectionLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -15956,8 +17667,8 @@
 
 
         try {
-            // InternalDataDSL.g:5775:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
-            // InternalDataDSL.g:5776:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
+            // InternalDataDSL.g:6396:59: (iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF )
+            // InternalDataDSL.g:6397:2: iv_ruleXCollectionLiteral= ruleXCollectionLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCollectionLiteralRule()); 
@@ -15988,7 +17699,7 @@
 
 
     // $ANTLR start "ruleXCollectionLiteral"
-    // InternalDataDSL.g:5782:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
+    // InternalDataDSL.g:6403:1: ruleXCollectionLiteral returns [EObject current=null] : (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) ;
     public final EObject ruleXCollectionLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -16001,26 +17712,26 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5788:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
-            // InternalDataDSL.g:5789:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            // InternalDataDSL.g:6409:2: ( (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral ) )
+            // InternalDataDSL.g:6410:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
             {
-            // InternalDataDSL.g:5789:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
-            int alt102=2;
-            int LA102_0 = input.LA(1);
+            // InternalDataDSL.g:6410:2: (this_XSetLiteral_0= ruleXSetLiteral | this_XListLiteral_1= ruleXListLiteral )
+            int alt109=2;
+            int LA109_0 = input.LA(1);
 
-            if ( (LA102_0==85) ) {
-                int LA102_1 = input.LA(2);
+            if ( (LA109_0==98) ) {
+                int LA109_1 = input.LA(2);
 
-                if ( (LA102_1==86) ) {
-                    alt102=2;
+                if ( (LA109_1==99) ) {
+                    alt109=2;
                 }
-                else if ( (LA102_1==14) ) {
-                    alt102=1;
+                else if ( (LA109_1==14) ) {
+                    alt109=1;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 102, 1, input);
+                        new NoViableAltException("", 109, 1, input);
 
                     throw nvae;
                 }
@@ -16028,13 +17739,13 @@
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 102, 0, input);
+                    new NoViableAltException("", 109, 0, input);
 
                 throw nvae;
             }
-            switch (alt102) {
+            switch (alt109) {
                 case 1 :
-                    // InternalDataDSL.g:5790:3: this_XSetLiteral_0= ruleXSetLiteral
+                    // InternalDataDSL.g:6411:3: this_XSetLiteral_0= ruleXSetLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16056,7 +17767,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:5799:3: this_XListLiteral_1= ruleXListLiteral
+                    // InternalDataDSL.g:6420:3: this_XListLiteral_1= ruleXListLiteral
                     {
                     if ( state.backtracking==0 ) {
 
@@ -16102,7 +17813,7 @@
 
 
     // $ANTLR start "entryRuleXSetLiteral"
-    // InternalDataDSL.g:5811:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
+    // InternalDataDSL.g:6432:1: entryRuleXSetLiteral returns [EObject current=null] : iv_ruleXSetLiteral= ruleXSetLiteral EOF ;
     public final EObject entryRuleXSetLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -16110,8 +17821,8 @@
 
 
         try {
-            // InternalDataDSL.g:5811:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
-            // InternalDataDSL.g:5812:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
+            // InternalDataDSL.g:6432:52: (iv_ruleXSetLiteral= ruleXSetLiteral EOF )
+            // InternalDataDSL.g:6433:2: iv_ruleXSetLiteral= ruleXSetLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSetLiteralRule()); 
@@ -16142,7 +17853,7 @@
 
 
     // $ANTLR start "ruleXSetLiteral"
-    // InternalDataDSL.g:5818:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
+    // InternalDataDSL.g:6439:1: ruleXSetLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) ;
     public final EObject ruleXSetLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -16159,14 +17870,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5824:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
-            // InternalDataDSL.g:5825:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalDataDSL.g:6445:2: ( ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' ) )
+            // InternalDataDSL.g:6446:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
             {
-            // InternalDataDSL.g:5825:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
-            // InternalDataDSL.g:5826:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
+            // InternalDataDSL.g:6446:2: ( () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}' )
+            // InternalDataDSL.g:6447:3: () otherlv_1= '#' otherlv_2= '{' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= '}'
             {
-            // InternalDataDSL.g:5826:3: ()
-            // InternalDataDSL.g:5827:4: 
+            // InternalDataDSL.g:6447:3: ()
+            // InternalDataDSL.g:6448:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16178,41 +17889,41 @@
 
             }
 
-            otherlv_1=(Token)match(input,85,FOLLOW_18); if (state.failed) return current;
+            otherlv_1=(Token)match(input,98,FOLLOW_18); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXSetLiteralAccess().getNumberSignKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,14,FOLLOW_108); if (state.failed) return current;
+            otherlv_2=(Token)match(input,14,FOLLOW_114); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXSetLiteralAccess().getLeftCurlyBracketKeyword_2());
               		
             }
-            // InternalDataDSL.g:5841:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
-            int alt104=2;
-            int LA104_0 = input.LA(1);
+            // InternalDataDSL.g:6462:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt111=2;
+            int LA111_0 = input.LA(1);
 
-            if ( ((LA104_0>=RULE_STRING && LA104_0<=RULE_DECIMAL)||LA104_0==14||LA104_0==50||LA104_0==72||(LA104_0>=75 && LA104_0<=76)||LA104_0==81||(LA104_0>=85 && LA104_0<=86)||LA104_0==93||(LA104_0>=109 && LA104_0<=110)||LA104_0==114||LA104_0==120||LA104_0==122||(LA104_0>=126 && LA104_0<=127)||(LA104_0>=130 && LA104_0<=139)||LA104_0==141) ) {
-                alt104=1;
+            if ( ((LA111_0>=RULE_STRING && LA111_0<=RULE_DECIMAL)||LA111_0==14||LA111_0==52||LA111_0==75||(LA111_0>=88 && LA111_0<=89)||LA111_0==94||(LA111_0>=98 && LA111_0<=99)||LA111_0==106||(LA111_0>=122 && LA111_0<=123)||LA111_0==127||LA111_0==133||LA111_0==135||(LA111_0>=139 && LA111_0<=140)||(LA111_0>=143 && LA111_0<=152)||LA111_0==154) ) {
+                alt111=1;
             }
-            switch (alt104) {
+            switch (alt111) {
                 case 1 :
-                    // InternalDataDSL.g:5842:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalDataDSL.g:6463:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // InternalDataDSL.g:5842:4: ( (lv_elements_3_0= ruleXExpression ) )
-                    // InternalDataDSL.g:5843:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalDataDSL.g:6463:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalDataDSL.g:6464:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:5843:5: (lv_elements_3_0= ruleXExpression )
-                    // InternalDataDSL.g:5844:6: lv_elements_3_0= ruleXExpression
+                    // InternalDataDSL.g:6464:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalDataDSL.g:6465:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                       					
                     }
-                    pushFollow(FOLLOW_109);
+                    pushFollow(FOLLOW_115);
                     lv_elements_3_0=ruleXExpression();
 
                     state._fsp--;
@@ -16236,39 +17947,39 @@
 
                     }
 
-                    // InternalDataDSL.g:5861:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
-                    loop103:
+                    // InternalDataDSL.g:6482:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop110:
                     do {
-                        int alt103=2;
-                        int LA103_0 = input.LA(1);
+                        int alt110=2;
+                        int LA110_0 = input.LA(1);
 
-                        if ( (LA103_0==82) ) {
-                            alt103=1;
+                        if ( (LA110_0==95) ) {
+                            alt110=1;
                         }
 
 
-                        switch (alt103) {
+                        switch (alt110) {
                     	case 1 :
-                    	    // InternalDataDSL.g:5862:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:6483:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_4, grammarAccess.getXSetLiteralAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:5866:5: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // InternalDataDSL.g:5867:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalDataDSL.g:6487:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:6488:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // InternalDataDSL.g:5867:6: (lv_elements_5_0= ruleXExpression )
-                    	    // InternalDataDSL.g:5868:7: lv_elements_5_0= ruleXExpression
+                    	    // InternalDataDSL.g:6488:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalDataDSL.g:6489:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXSetLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_109);
+                    	    pushFollow(FOLLOW_115);
                     	    lv_elements_5_0=ruleXExpression();
 
                     	    state._fsp--;
@@ -16297,7 +18008,7 @@
                     	    break;
 
                     	default :
-                    	    break loop103;
+                    	    break loop110;
                         }
                     } while (true);
 
@@ -16338,7 +18049,7 @@
 
 
     // $ANTLR start "entryRuleXListLiteral"
-    // InternalDataDSL.g:5895:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
+    // InternalDataDSL.g:6516:1: entryRuleXListLiteral returns [EObject current=null] : iv_ruleXListLiteral= ruleXListLiteral EOF ;
     public final EObject entryRuleXListLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -16346,8 +18057,8 @@
 
 
         try {
-            // InternalDataDSL.g:5895:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
-            // InternalDataDSL.g:5896:2: iv_ruleXListLiteral= ruleXListLiteral EOF
+            // InternalDataDSL.g:6516:53: (iv_ruleXListLiteral= ruleXListLiteral EOF )
+            // InternalDataDSL.g:6517:2: iv_ruleXListLiteral= ruleXListLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXListLiteralRule()); 
@@ -16378,7 +18089,7 @@
 
 
     // $ANTLR start "ruleXListLiteral"
-    // InternalDataDSL.g:5902:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
+    // InternalDataDSL.g:6523:1: ruleXListLiteral returns [EObject current=null] : ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) ;
     public final EObject ruleXListLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -16395,14 +18106,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5908:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
-            // InternalDataDSL.g:5909:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalDataDSL.g:6529:2: ( ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' ) )
+            // InternalDataDSL.g:6530:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
             {
-            // InternalDataDSL.g:5909:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
-            // InternalDataDSL.g:5910:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
+            // InternalDataDSL.g:6530:2: ( () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']' )
+            // InternalDataDSL.g:6531:3: () otherlv_1= '#' otherlv_2= '[' ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )? otherlv_6= ']'
             {
-            // InternalDataDSL.g:5910:3: ()
-            // InternalDataDSL.g:5911:4: 
+            // InternalDataDSL.g:6531:3: ()
+            // InternalDataDSL.g:6532:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16414,41 +18125,41 @@
 
             }
 
-            otherlv_1=(Token)match(input,85,FOLLOW_79); if (state.failed) return current;
+            otherlv_1=(Token)match(input,98,FOLLOW_85); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXListLiteralAccess().getNumberSignKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,86,FOLLOW_80); if (state.failed) return current;
+            otherlv_2=(Token)match(input,99,FOLLOW_86); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXListLiteralAccess().getLeftSquareBracketKeyword_2());
               		
             }
-            // InternalDataDSL.g:5925:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
-            int alt106=2;
-            int LA106_0 = input.LA(1);
+            // InternalDataDSL.g:6546:3: ( ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )* )?
+            int alt113=2;
+            int LA113_0 = input.LA(1);
 
-            if ( ((LA106_0>=RULE_STRING && LA106_0<=RULE_DECIMAL)||LA106_0==14||LA106_0==50||LA106_0==72||(LA106_0>=75 && LA106_0<=76)||LA106_0==81||(LA106_0>=85 && LA106_0<=86)||LA106_0==93||(LA106_0>=109 && LA106_0<=110)||LA106_0==114||LA106_0==120||LA106_0==122||(LA106_0>=126 && LA106_0<=127)||(LA106_0>=130 && LA106_0<=139)||LA106_0==141) ) {
-                alt106=1;
+            if ( ((LA113_0>=RULE_STRING && LA113_0<=RULE_DECIMAL)||LA113_0==14||LA113_0==52||LA113_0==75||(LA113_0>=88 && LA113_0<=89)||LA113_0==94||(LA113_0>=98 && LA113_0<=99)||LA113_0==106||(LA113_0>=122 && LA113_0<=123)||LA113_0==127||LA113_0==133||LA113_0==135||(LA113_0>=139 && LA113_0<=140)||(LA113_0>=143 && LA113_0<=152)||LA113_0==154) ) {
+                alt113=1;
             }
-            switch (alt106) {
+            switch (alt113) {
                 case 1 :
-                    // InternalDataDSL.g:5926:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    // InternalDataDSL.g:6547:4: ( (lv_elements_3_0= ruleXExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
                     {
-                    // InternalDataDSL.g:5926:4: ( (lv_elements_3_0= ruleXExpression ) )
-                    // InternalDataDSL.g:5927:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalDataDSL.g:6547:4: ( (lv_elements_3_0= ruleXExpression ) )
+                    // InternalDataDSL.g:6548:5: (lv_elements_3_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:5927:5: (lv_elements_3_0= ruleXExpression )
-                    // InternalDataDSL.g:5928:6: lv_elements_3_0= ruleXExpression
+                    // InternalDataDSL.g:6548:5: (lv_elements_3_0= ruleXExpression )
+                    // InternalDataDSL.g:6549:6: lv_elements_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_0_0());
                       					
                     }
-                    pushFollow(FOLLOW_81);
+                    pushFollow(FOLLOW_87);
                     lv_elements_3_0=ruleXExpression();
 
                     state._fsp--;
@@ -16472,39 +18183,39 @@
 
                     }
 
-                    // InternalDataDSL.g:5945:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
-                    loop105:
+                    // InternalDataDSL.g:6566:4: (otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) ) )*
+                    loop112:
                     do {
-                        int alt105=2;
-                        int LA105_0 = input.LA(1);
+                        int alt112=2;
+                        int LA112_0 = input.LA(1);
 
-                        if ( (LA105_0==82) ) {
-                            alt105=1;
+                        if ( (LA112_0==95) ) {
+                            alt112=1;
                         }
 
 
-                        switch (alt105) {
+                        switch (alt112) {
                     	case 1 :
-                    	    // InternalDataDSL.g:5946:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:6567:5: otherlv_4= ',' ( (lv_elements_5_0= ruleXExpression ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_4, grammarAccess.getXListLiteralAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:5950:5: ( (lv_elements_5_0= ruleXExpression ) )
-                    	    // InternalDataDSL.g:5951:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalDataDSL.g:6571:5: ( (lv_elements_5_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:6572:6: (lv_elements_5_0= ruleXExpression )
                     	    {
-                    	    // InternalDataDSL.g:5951:6: (lv_elements_5_0= ruleXExpression )
-                    	    // InternalDataDSL.g:5952:7: lv_elements_5_0= ruleXExpression
+                    	    // InternalDataDSL.g:6572:6: (lv_elements_5_0= ruleXExpression )
+                    	    // InternalDataDSL.g:6573:7: lv_elements_5_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXListLiteralAccess().getElementsXExpressionParserRuleCall_3_1_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_81);
+                    	    pushFollow(FOLLOW_87);
                     	    lv_elements_5_0=ruleXExpression();
 
                     	    state._fsp--;
@@ -16533,7 +18244,7 @@
                     	    break;
 
                     	default :
-                    	    break loop105;
+                    	    break loop112;
                         }
                     } while (true);
 
@@ -16543,7 +18254,7 @@
 
             }
 
-            otherlv_6=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+            otherlv_6=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_6, grammarAccess.getXListLiteralAccess().getRightSquareBracketKeyword_4());
@@ -16574,7 +18285,7 @@
 
 
     // $ANTLR start "entryRuleXClosure"
-    // InternalDataDSL.g:5979:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
+    // InternalDataDSL.g:6600:1: entryRuleXClosure returns [EObject current=null] : iv_ruleXClosure= ruleXClosure EOF ;
     public final EObject entryRuleXClosure() throws RecognitionException {
         EObject current = null;
 
@@ -16582,8 +18293,8 @@
 
 
         try {
-            // InternalDataDSL.g:5979:49: (iv_ruleXClosure= ruleXClosure EOF )
-            // InternalDataDSL.g:5980:2: iv_ruleXClosure= ruleXClosure EOF
+            // InternalDataDSL.g:6600:49: (iv_ruleXClosure= ruleXClosure EOF )
+            // InternalDataDSL.g:6601:2: iv_ruleXClosure= ruleXClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXClosureRule()); 
@@ -16614,7 +18325,7 @@
 
 
     // $ANTLR start "ruleXClosure"
-    // InternalDataDSL.g:5986:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
+    // InternalDataDSL.g:6607:1: ruleXClosure returns [EObject current=null] : ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) ;
     public final EObject ruleXClosure() throws RecognitionException {
         EObject current = null;
 
@@ -16633,20 +18344,20 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:5992:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
-            // InternalDataDSL.g:5993:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            // InternalDataDSL.g:6613:2: ( ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' ) )
+            // InternalDataDSL.g:6614:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
             {
-            // InternalDataDSL.g:5993:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
-            // InternalDataDSL.g:5994:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
+            // InternalDataDSL.g:6614:2: ( ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']' )
+            // InternalDataDSL.g:6615:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) ) ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )? ( (lv_expression_6_0= ruleXExpressionInClosure ) ) otherlv_7= ']'
             {
-            // InternalDataDSL.g:5994:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
-            // InternalDataDSL.g:5995:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
+            // InternalDataDSL.g:6615:3: ( ( ( () '[' ) )=> ( () otherlv_1= '[' ) )
+            // InternalDataDSL.g:6616:4: ( ( () '[' ) )=> ( () otherlv_1= '[' )
             {
-            // InternalDataDSL.g:6001:4: ( () otherlv_1= '[' )
-            // InternalDataDSL.g:6002:5: () otherlv_1= '['
+            // InternalDataDSL.g:6622:4: ( () otherlv_1= '[' )
+            // InternalDataDSL.g:6623:5: () otherlv_1= '['
             {
-            // InternalDataDSL.g:6002:5: ()
-            // InternalDataDSL.g:6003:6: 
+            // InternalDataDSL.g:6623:5: ()
+            // InternalDataDSL.g:6624:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16658,7 +18369,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,86,FOLLOW_110); if (state.failed) return current;
+            otherlv_1=(Token)match(input,99,FOLLOW_116); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_1, grammarAccess.getXClosureAccess().getLeftSquareBracketKeyword_0_0_1());
@@ -16670,39 +18381,39 @@
 
             }
 
-            // InternalDataDSL.g:6015:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
-            int alt109=2;
-            alt109 = dfa109.predict(input);
-            switch (alt109) {
+            // InternalDataDSL.g:6636:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?
+            int alt116=2;
+            alt116 = dfa116.predict(input);
+            switch (alt116) {
                 case 1 :
-                    // InternalDataDSL.g:6016:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalDataDSL.g:6637:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
                     {
-                    // InternalDataDSL.g:6039:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
-                    // InternalDataDSL.g:6040:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalDataDSL.g:6660:4: ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) )
+                    // InternalDataDSL.g:6661:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) )
                     {
-                    // InternalDataDSL.g:6040:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
-                    int alt108=2;
-                    int LA108_0 = input.LA(1);
+                    // InternalDataDSL.g:6661:5: ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )?
+                    int alt115=2;
+                    int LA115_0 = input.LA(1);
 
-                    if ( (LA108_0==RULE_ID||LA108_0==81||LA108_0==106) ) {
-                        alt108=1;
+                    if ( (LA115_0==RULE_ID||LA115_0==94||LA115_0==119) ) {
+                        alt115=1;
                     }
-                    switch (alt108) {
+                    switch (alt115) {
                         case 1 :
-                            // InternalDataDSL.g:6041:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            // InternalDataDSL.g:6662:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
                             {
-                            // InternalDataDSL.g:6041:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
-                            // InternalDataDSL.g:6042:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalDataDSL.g:6662:6: ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) )
+                            // InternalDataDSL.g:6663:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
                             {
-                            // InternalDataDSL.g:6042:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
-                            // InternalDataDSL.g:6043:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
+                            // InternalDataDSL.g:6663:7: (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter )
+                            // InternalDataDSL.g:6664:8: lv_declaredFormalParameters_2_0= ruleJvmFormalParameter
                             {
                             if ( state.backtracking==0 ) {
 
                               								newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_0_0());
                               							
                             }
-                            pushFollow(FOLLOW_111);
+                            pushFollow(FOLLOW_117);
                             lv_declaredFormalParameters_2_0=ruleJvmFormalParameter();
 
                             state._fsp--;
@@ -16726,39 +18437,39 @@
 
                             }
 
-                            // InternalDataDSL.g:6060:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
-                            loop107:
+                            // InternalDataDSL.g:6681:6: (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )*
+                            loop114:
                             do {
-                                int alt107=2;
-                                int LA107_0 = input.LA(1);
+                                int alt114=2;
+                                int LA114_0 = input.LA(1);
 
-                                if ( (LA107_0==82) ) {
-                                    alt107=1;
+                                if ( (LA114_0==95) ) {
+                                    alt114=1;
                                 }
 
 
-                                switch (alt107) {
+                                switch (alt114) {
                             	case 1 :
-                            	    // InternalDataDSL.g:6061:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalDataDSL.g:6682:7: otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
                             	    {
-                            	    otherlv_3=(Token)match(input,82,FOLLOW_91); if (state.failed) return current;
+                            	    otherlv_3=(Token)match(input,95,FOLLOW_97); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      							newLeafNode(otherlv_3, grammarAccess.getXClosureAccess().getCommaKeyword_1_0_0_1_0());
                             	      						
                             	    }
-                            	    // InternalDataDSL.g:6065:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
-                            	    // InternalDataDSL.g:6066:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalDataDSL.g:6686:7: ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) )
+                            	    // InternalDataDSL.g:6687:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
                             	    {
-                            	    // InternalDataDSL.g:6066:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
-                            	    // InternalDataDSL.g:6067:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
+                            	    // InternalDataDSL.g:6687:8: (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter )
+                            	    // InternalDataDSL.g:6688:9: lv_declaredFormalParameters_4_0= ruleJvmFormalParameter
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      									newCompositeNode(grammarAccess.getXClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_1_0_0_1_1_0());
                             	      								
                             	    }
-                            	    pushFollow(FOLLOW_111);
+                            	    pushFollow(FOLLOW_117);
                             	    lv_declaredFormalParameters_4_0=ruleJvmFormalParameter();
 
                             	    state._fsp--;
@@ -16787,7 +18498,7 @@
                             	    break;
 
                             	default :
-                            	    break loop107;
+                            	    break loop114;
                                 }
                             } while (true);
 
@@ -16797,13 +18508,13 @@
 
                     }
 
-                    // InternalDataDSL.g:6086:5: ( (lv_explicitSyntax_5_0= '|' ) )
-                    // InternalDataDSL.g:6087:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalDataDSL.g:6707:5: ( (lv_explicitSyntax_5_0= '|' ) )
+                    // InternalDataDSL.g:6708:6: (lv_explicitSyntax_5_0= '|' )
                     {
-                    // InternalDataDSL.g:6087:6: (lv_explicitSyntax_5_0= '|' )
-                    // InternalDataDSL.g:6088:7: lv_explicitSyntax_5_0= '|'
+                    // InternalDataDSL.g:6708:6: (lv_explicitSyntax_5_0= '|' )
+                    // InternalDataDSL.g:6709:7: lv_explicitSyntax_5_0= '|'
                     {
-                    lv_explicitSyntax_5_0=(Token)match(input,119,FOLLOW_112); if (state.failed) return current;
+                    lv_explicitSyntax_5_0=(Token)match(input,132,FOLLOW_118); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       							newLeafNode(lv_explicitSyntax_5_0, grammarAccess.getXClosureAccess().getExplicitSyntaxVerticalLineKeyword_1_0_1_0());
@@ -16832,18 +18543,18 @@
 
             }
 
-            // InternalDataDSL.g:6102:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
-            // InternalDataDSL.g:6103:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalDataDSL.g:6723:3: ( (lv_expression_6_0= ruleXExpressionInClosure ) )
+            // InternalDataDSL.g:6724:4: (lv_expression_6_0= ruleXExpressionInClosure )
             {
-            // InternalDataDSL.g:6103:4: (lv_expression_6_0= ruleXExpressionInClosure )
-            // InternalDataDSL.g:6104:5: lv_expression_6_0= ruleXExpressionInClosure
+            // InternalDataDSL.g:6724:4: (lv_expression_6_0= ruleXExpressionInClosure )
+            // InternalDataDSL.g:6725:5: lv_expression_6_0= ruleXExpressionInClosure
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXClosureAccess().getExpressionXExpressionInClosureParserRuleCall_2_0());
               				
             }
-            pushFollow(FOLLOW_113);
+            pushFollow(FOLLOW_119);
             lv_expression_6_0=ruleXExpressionInClosure();
 
             state._fsp--;
@@ -16867,7 +18578,7 @@
 
             }
 
-            otherlv_7=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+            otherlv_7=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_7, grammarAccess.getXClosureAccess().getRightSquareBracketKeyword_3());
@@ -16898,7 +18609,7 @@
 
 
     // $ANTLR start "entryRuleXExpressionInClosure"
-    // InternalDataDSL.g:6129:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
+    // InternalDataDSL.g:6750:1: entryRuleXExpressionInClosure returns [EObject current=null] : iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF ;
     public final EObject entryRuleXExpressionInClosure() throws RecognitionException {
         EObject current = null;
 
@@ -16906,8 +18617,8 @@
 
 
         try {
-            // InternalDataDSL.g:6129:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
-            // InternalDataDSL.g:6130:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
+            // InternalDataDSL.g:6750:61: (iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF )
+            // InternalDataDSL.g:6751:2: iv_ruleXExpressionInClosure= ruleXExpressionInClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionInClosureRule()); 
@@ -16938,7 +18649,7 @@
 
 
     // $ANTLR start "ruleXExpressionInClosure"
-    // InternalDataDSL.g:6136:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
+    // InternalDataDSL.g:6757:1: ruleXExpressionInClosure returns [EObject current=null] : ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) ;
     public final EObject ruleXExpressionInClosure() throws RecognitionException {
         EObject current = null;
 
@@ -16950,14 +18661,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6142:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
-            // InternalDataDSL.g:6143:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalDataDSL.g:6763:2: ( ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* ) )
+            // InternalDataDSL.g:6764:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
             {
-            // InternalDataDSL.g:6143:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
-            // InternalDataDSL.g:6144:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            // InternalDataDSL.g:6764:2: ( () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )* )
+            // InternalDataDSL.g:6765:3: () ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
             {
-            // InternalDataDSL.g:6144:3: ()
-            // InternalDataDSL.g:6145:4: 
+            // InternalDataDSL.g:6765:3: ()
+            // InternalDataDSL.g:6766:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -16969,33 +18680,33 @@
 
             }
 
-            // InternalDataDSL.g:6151:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
-            loop111:
+            // InternalDataDSL.g:6772:3: ( ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )? )*
+            loop118:
             do {
-                int alt111=2;
-                int LA111_0 = input.LA(1);
+                int alt118=2;
+                int LA118_0 = input.LA(1);
 
-                if ( ((LA111_0>=RULE_STRING && LA111_0<=RULE_DECIMAL)||LA111_0==14||LA111_0==50||LA111_0==72||(LA111_0>=75 && LA111_0<=76)||LA111_0==81||(LA111_0>=85 && LA111_0<=86)||LA111_0==93||(LA111_0>=109 && LA111_0<=110)||LA111_0==114||LA111_0==120||LA111_0==122||(LA111_0>=126 && LA111_0<=139)||LA111_0==141) ) {
-                    alt111=1;
+                if ( ((LA118_0>=RULE_STRING && LA118_0<=RULE_DECIMAL)||LA118_0==14||LA118_0==52||LA118_0==75||(LA118_0>=88 && LA118_0<=89)||LA118_0==94||(LA118_0>=98 && LA118_0<=99)||LA118_0==106||(LA118_0>=122 && LA118_0<=123)||LA118_0==127||LA118_0==133||LA118_0==135||(LA118_0>=139 && LA118_0<=152)||LA118_0==154) ) {
+                    alt118=1;
                 }
 
 
-                switch (alt111) {
+                switch (alt118) {
             	case 1 :
-            	    // InternalDataDSL.g:6152:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
+            	    // InternalDataDSL.g:6773:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_2= ';' )?
             	    {
-            	    // InternalDataDSL.g:6152:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
-            	    // InternalDataDSL.g:6153:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalDataDSL.g:6773:4: ( (lv_expressions_1_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalDataDSL.g:6774:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
             	    {
-            	    // InternalDataDSL.g:6153:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
-            	    // InternalDataDSL.g:6154:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
+            	    // InternalDataDSL.g:6774:5: (lv_expressions_1_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalDataDSL.g:6775:6: lv_expressions_1_0= ruleXExpressionOrVarDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXExpressionInClosureAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_1_0_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_114);
+            	    pushFollow(FOLLOW_120);
             	    lv_expressions_1_0=ruleXExpressionOrVarDeclaration();
 
             	    state._fsp--;
@@ -17019,18 +18730,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:6171:4: (otherlv_2= ';' )?
-            	    int alt110=2;
-            	    int LA110_0 = input.LA(1);
+            	    // InternalDataDSL.g:6792:4: (otherlv_2= ';' )?
+            	    int alt117=2;
+            	    int LA117_0 = input.LA(1);
 
-            	    if ( (LA110_0==79) ) {
-            	        alt110=1;
+            	    if ( (LA117_0==92) ) {
+            	        alt117=1;
             	    }
-            	    switch (alt110) {
+            	    switch (alt117) {
             	        case 1 :
-            	            // InternalDataDSL.g:6172:5: otherlv_2= ';'
+            	            // InternalDataDSL.g:6793:5: otherlv_2= ';'
             	            {
-            	            otherlv_2=(Token)match(input,79,FOLLOW_115); if (state.failed) return current;
+            	            otherlv_2=(Token)match(input,92,FOLLOW_121); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              					newLeafNode(otherlv_2, grammarAccess.getXExpressionInClosureAccess().getSemicolonKeyword_1_1());
@@ -17047,7 +18758,7 @@
             	    break;
 
             	default :
-            	    break loop111;
+            	    break loop118;
                 }
             } while (true);
 
@@ -17076,7 +18787,7 @@
 
 
     // $ANTLR start "entryRuleXShortClosure"
-    // InternalDataDSL.g:6182:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
+    // InternalDataDSL.g:6803:1: entryRuleXShortClosure returns [EObject current=null] : iv_ruleXShortClosure= ruleXShortClosure EOF ;
     public final EObject entryRuleXShortClosure() throws RecognitionException {
         EObject current = null;
 
@@ -17084,8 +18795,8 @@
 
 
         try {
-            // InternalDataDSL.g:6182:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
-            // InternalDataDSL.g:6183:2: iv_ruleXShortClosure= ruleXShortClosure EOF
+            // InternalDataDSL.g:6803:54: (iv_ruleXShortClosure= ruleXShortClosure EOF )
+            // InternalDataDSL.g:6804:2: iv_ruleXShortClosure= ruleXShortClosure EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXShortClosureRule()); 
@@ -17116,7 +18827,7 @@
 
 
     // $ANTLR start "ruleXShortClosure"
-    // InternalDataDSL.g:6189:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:6810:1: ruleXShortClosure returns [EObject current=null] : ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXShortClosure() throws RecognitionException {
         EObject current = null;
 
@@ -17133,20 +18844,20 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6195:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:6196:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:6816:2: ( ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:6817:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:6196:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:6197:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:6817:2: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:6818:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) ) ( (lv_expression_5_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:6197:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
-            // InternalDataDSL.g:6198:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalDataDSL.g:6818:3: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) ) )
+            // InternalDataDSL.g:6819:4: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
             {
-            // InternalDataDSL.g:6223:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
-            // InternalDataDSL.g:6224:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalDataDSL.g:6844:4: ( () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) ) )
+            // InternalDataDSL.g:6845:5: () ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_4_0= '|' ) )
             {
-            // InternalDataDSL.g:6224:5: ()
-            // InternalDataDSL.g:6225:6: 
+            // InternalDataDSL.g:6845:5: ()
+            // InternalDataDSL.g:6846:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17158,29 +18869,29 @@
 
             }
 
-            // InternalDataDSL.g:6231:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
-            int alt113=2;
-            int LA113_0 = input.LA(1);
+            // InternalDataDSL.g:6852:5: ( ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )* )?
+            int alt120=2;
+            int LA120_0 = input.LA(1);
 
-            if ( (LA113_0==RULE_ID||LA113_0==81||LA113_0==106) ) {
-                alt113=1;
+            if ( (LA120_0==RULE_ID||LA120_0==94||LA120_0==119) ) {
+                alt120=1;
             }
-            switch (alt113) {
+            switch (alt120) {
                 case 1 :
-                    // InternalDataDSL.g:6232:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    // InternalDataDSL.g:6853:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) ) (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
                     {
-                    // InternalDataDSL.g:6232:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
-                    // InternalDataDSL.g:6233:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalDataDSL.g:6853:6: ( (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter ) )
+                    // InternalDataDSL.g:6854:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
                     {
-                    // InternalDataDSL.g:6233:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
-                    // InternalDataDSL.g:6234:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
+                    // InternalDataDSL.g:6854:7: (lv_declaredFormalParameters_1_0= ruleJvmFormalParameter )
+                    // InternalDataDSL.g:6855:8: lv_declaredFormalParameters_1_0= ruleJvmFormalParameter
                     {
                     if ( state.backtracking==0 ) {
 
                       								newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_0_0());
                       							
                     }
-                    pushFollow(FOLLOW_111);
+                    pushFollow(FOLLOW_117);
                     lv_declaredFormalParameters_1_0=ruleJvmFormalParameter();
 
                     state._fsp--;
@@ -17204,39 +18915,39 @@
 
                     }
 
-                    // InternalDataDSL.g:6251:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
-                    loop112:
+                    // InternalDataDSL.g:6872:6: (otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) ) )*
+                    loop119:
                     do {
-                        int alt112=2;
-                        int LA112_0 = input.LA(1);
+                        int alt119=2;
+                        int LA119_0 = input.LA(1);
 
-                        if ( (LA112_0==82) ) {
-                            alt112=1;
+                        if ( (LA119_0==95) ) {
+                            alt119=1;
                         }
 
 
-                        switch (alt112) {
+                        switch (alt119) {
                     	case 1 :
-                    	    // InternalDataDSL.g:6252:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalDataDSL.g:6873:7: otherlv_2= ',' ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
                     	    {
-                    	    otherlv_2=(Token)match(input,82,FOLLOW_91); if (state.failed) return current;
+                    	    otherlv_2=(Token)match(input,95,FOLLOW_97); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      							newLeafNode(otherlv_2, grammarAccess.getXShortClosureAccess().getCommaKeyword_0_0_1_1_0());
                     	      						
                     	    }
-                    	    // InternalDataDSL.g:6256:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
-                    	    // InternalDataDSL.g:6257:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalDataDSL.g:6877:7: ( (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter ) )
+                    	    // InternalDataDSL.g:6878:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
                     	    {
-                    	    // InternalDataDSL.g:6257:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
-                    	    // InternalDataDSL.g:6258:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
+                    	    // InternalDataDSL.g:6878:8: (lv_declaredFormalParameters_3_0= ruleJvmFormalParameter )
+                    	    // InternalDataDSL.g:6879:9: lv_declaredFormalParameters_3_0= ruleJvmFormalParameter
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      									newCompositeNode(grammarAccess.getXShortClosureAccess().getDeclaredFormalParametersJvmFormalParameterParserRuleCall_0_0_1_1_1_0());
                     	      								
                     	    }
-                    	    pushFollow(FOLLOW_111);
+                    	    pushFollow(FOLLOW_117);
                     	    lv_declaredFormalParameters_3_0=ruleJvmFormalParameter();
 
                     	    state._fsp--;
@@ -17265,7 +18976,7 @@
                     	    break;
 
                     	default :
-                    	    break loop112;
+                    	    break loop119;
                         }
                     } while (true);
 
@@ -17275,13 +18986,13 @@
 
             }
 
-            // InternalDataDSL.g:6277:5: ( (lv_explicitSyntax_4_0= '|' ) )
-            // InternalDataDSL.g:6278:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalDataDSL.g:6898:5: ( (lv_explicitSyntax_4_0= '|' ) )
+            // InternalDataDSL.g:6899:6: (lv_explicitSyntax_4_0= '|' )
             {
-            // InternalDataDSL.g:6278:6: (lv_explicitSyntax_4_0= '|' )
-            // InternalDataDSL.g:6279:7: lv_explicitSyntax_4_0= '|'
+            // InternalDataDSL.g:6899:6: (lv_explicitSyntax_4_0= '|' )
+            // InternalDataDSL.g:6900:7: lv_explicitSyntax_4_0= '|'
             {
-            lv_explicitSyntax_4_0=(Token)match(input,119,FOLLOW_78); if (state.failed) return current;
+            lv_explicitSyntax_4_0=(Token)match(input,132,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               							newLeafNode(lv_explicitSyntax_4_0, grammarAccess.getXShortClosureAccess().getExplicitSyntaxVerticalLineKeyword_0_0_2_0());
@@ -17307,11 +19018,11 @@
 
             }
 
-            // InternalDataDSL.g:6293:3: ( (lv_expression_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:6294:4: (lv_expression_5_0= ruleXExpression )
+            // InternalDataDSL.g:6914:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:6915:4: (lv_expression_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:6294:4: (lv_expression_5_0= ruleXExpression )
-            // InternalDataDSL.g:6295:5: lv_expression_5_0= ruleXExpression
+            // InternalDataDSL.g:6915:4: (lv_expression_5_0= ruleXExpression )
+            // InternalDataDSL.g:6916:5: lv_expression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -17367,7 +19078,7 @@
 
 
     // $ANTLR start "entryRuleXParenthesizedExpression"
-    // InternalDataDSL.g:6316:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
+    // InternalDataDSL.g:6937:1: entryRuleXParenthesizedExpression returns [EObject current=null] : iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF ;
     public final EObject entryRuleXParenthesizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17375,8 +19086,8 @@
 
 
         try {
-            // InternalDataDSL.g:6316:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
-            // InternalDataDSL.g:6317:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
+            // InternalDataDSL.g:6937:65: (iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF )
+            // InternalDataDSL.g:6938:2: iv_ruleXParenthesizedExpression= ruleXParenthesizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXParenthesizedExpressionRule()); 
@@ -17407,7 +19118,7 @@
 
 
     // $ANTLR start "ruleXParenthesizedExpression"
-    // InternalDataDSL.g:6323:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
+    // InternalDataDSL.g:6944:1: ruleXParenthesizedExpression returns [EObject current=null] : (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) ;
     public final EObject ruleXParenthesizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17420,13 +19131,13 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6329:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
-            // InternalDataDSL.g:6330:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalDataDSL.g:6950:2: ( (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' ) )
+            // InternalDataDSL.g:6951:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
             {
-            // InternalDataDSL.g:6330:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
-            // InternalDataDSL.g:6331:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
+            // InternalDataDSL.g:6951:2: (otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')' )
+            // InternalDataDSL.g:6952:3: otherlv_0= '(' this_XExpression_1= ruleXExpression otherlv_2= ')'
             {
-            otherlv_0=(Token)match(input,81,FOLLOW_78); if (state.failed) return current;
+            otherlv_0=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_0, grammarAccess.getXParenthesizedExpressionAccess().getLeftParenthesisKeyword_0());
@@ -17437,7 +19148,7 @@
               			newCompositeNode(grammarAccess.getXParenthesizedExpressionAccess().getXExpressionParserRuleCall_1());
               		
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             this_XExpression_1=ruleXExpression();
 
             state._fsp--;
@@ -17448,7 +19159,7 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            otherlv_2=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
+            otherlv_2=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXParenthesizedExpressionAccess().getRightParenthesisKeyword_2());
@@ -17479,7 +19190,7 @@
 
 
     // $ANTLR start "entryRuleXIfExpression"
-    // InternalDataDSL.g:6351:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
+    // InternalDataDSL.g:6972:1: entryRuleXIfExpression returns [EObject current=null] : iv_ruleXIfExpression= ruleXIfExpression EOF ;
     public final EObject entryRuleXIfExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17487,8 +19198,8 @@
 
 
         try {
-            // InternalDataDSL.g:6351:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
-            // InternalDataDSL.g:6352:2: iv_ruleXIfExpression= ruleXIfExpression EOF
+            // InternalDataDSL.g:6972:54: (iv_ruleXIfExpression= ruleXIfExpression EOF )
+            // InternalDataDSL.g:6973:2: iv_ruleXIfExpression= ruleXIfExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXIfExpressionRule()); 
@@ -17519,7 +19230,7 @@
 
 
     // $ANTLR start "ruleXIfExpression"
-    // InternalDataDSL.g:6358:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
+    // InternalDataDSL.g:6979:1: ruleXIfExpression returns [EObject current=null] : ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) ;
     public final EObject ruleXIfExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17538,14 +19249,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6364:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
-            // InternalDataDSL.g:6365:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            // InternalDataDSL.g:6985:2: ( ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? ) )
+            // InternalDataDSL.g:6986:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
             {
-            // InternalDataDSL.g:6365:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
-            // InternalDataDSL.g:6366:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            // InternalDataDSL.g:6986:2: ( () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )? )
+            // InternalDataDSL.g:6987:3: () otherlv_1= 'if' otherlv_2= '(' ( (lv_if_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_then_5_0= ruleXExpression ) ) ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
             {
-            // InternalDataDSL.g:6366:3: ()
-            // InternalDataDSL.g:6367:4: 
+            // InternalDataDSL.g:6987:3: ()
+            // InternalDataDSL.g:6988:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17557,30 +19268,30 @@
 
             }
 
-            otherlv_1=(Token)match(input,120,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,133,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXIfExpressionAccess().getIfKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_78); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXIfExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:6381:3: ( (lv_if_3_0= ruleXExpression ) )
-            // InternalDataDSL.g:6382:4: (lv_if_3_0= ruleXExpression )
+            // InternalDataDSL.g:7002:3: ( (lv_if_3_0= ruleXExpression ) )
+            // InternalDataDSL.g:7003:4: (lv_if_3_0= ruleXExpression )
             {
-            // InternalDataDSL.g:6382:4: (lv_if_3_0= ruleXExpression )
-            // InternalDataDSL.g:6383:5: lv_if_3_0= ruleXExpression
+            // InternalDataDSL.g:7003:4: (lv_if_3_0= ruleXExpression )
+            // InternalDataDSL.g:7004:5: lv_if_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXIfExpressionAccess().getIfXExpressionParserRuleCall_3_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_if_3_0=ruleXExpression();
 
             state._fsp--;
@@ -17604,24 +19315,24 @@
 
             }
 
-            otherlv_4=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_4=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_4, grammarAccess.getXIfExpressionAccess().getRightParenthesisKeyword_4());
               		
             }
-            // InternalDataDSL.g:6404:3: ( (lv_then_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:6405:4: (lv_then_5_0= ruleXExpression )
+            // InternalDataDSL.g:7025:3: ( (lv_then_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:7026:4: (lv_then_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:6405:4: (lv_then_5_0= ruleXExpression )
-            // InternalDataDSL.g:6406:5: lv_then_5_0= ruleXExpression
+            // InternalDataDSL.g:7026:4: (lv_then_5_0= ruleXExpression )
+            // InternalDataDSL.g:7027:5: lv_then_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXIfExpressionAccess().getThenXExpressionParserRuleCall_5_0());
               				
             }
-            pushFollow(FOLLOW_117);
+            pushFollow(FOLLOW_123);
             lv_then_5_0=ruleXExpression();
 
             state._fsp--;
@@ -17645,25 +19356,25 @@
 
             }
 
-            // InternalDataDSL.g:6423:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
-            int alt114=2;
-            int LA114_0 = input.LA(1);
+            // InternalDataDSL.g:7044:3: ( ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) ) )?
+            int alt121=2;
+            int LA121_0 = input.LA(1);
 
-            if ( (LA114_0==121) ) {
-                int LA114_1 = input.LA(2);
+            if ( (LA121_0==134) ) {
+                int LA121_1 = input.LA(2);
 
                 if ( (synpred31_InternalDataDSL()) ) {
-                    alt114=1;
+                    alt121=1;
                 }
             }
-            switch (alt114) {
+            switch (alt121) {
                 case 1 :
-                    // InternalDataDSL.g:6424:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7045:4: ( ( 'else' )=>otherlv_6= 'else' ) ( (lv_else_7_0= ruleXExpression ) )
                     {
-                    // InternalDataDSL.g:6424:4: ( ( 'else' )=>otherlv_6= 'else' )
-                    // InternalDataDSL.g:6425:5: ( 'else' )=>otherlv_6= 'else'
+                    // InternalDataDSL.g:7045:4: ( ( 'else' )=>otherlv_6= 'else' )
+                    // InternalDataDSL.g:7046:5: ( 'else' )=>otherlv_6= 'else'
                     {
-                    otherlv_6=(Token)match(input,121,FOLLOW_78); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,134,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_6, grammarAccess.getXIfExpressionAccess().getElseKeyword_6_0());
@@ -17672,11 +19383,11 @@
 
                     }
 
-                    // InternalDataDSL.g:6431:4: ( (lv_else_7_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6432:5: (lv_else_7_0= ruleXExpression )
+                    // InternalDataDSL.g:7052:4: ( (lv_else_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7053:5: (lv_else_7_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6432:5: (lv_else_7_0= ruleXExpression )
-                    // InternalDataDSL.g:6433:6: lv_else_7_0= ruleXExpression
+                    // InternalDataDSL.g:7053:5: (lv_else_7_0= ruleXExpression )
+                    // InternalDataDSL.g:7054:6: lv_else_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -17738,7 +19449,7 @@
 
 
     // $ANTLR start "entryRuleXSwitchExpression"
-    // InternalDataDSL.g:6455:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
+    // InternalDataDSL.g:7076:1: entryRuleXSwitchExpression returns [EObject current=null] : iv_ruleXSwitchExpression= ruleXSwitchExpression EOF ;
     public final EObject entryRuleXSwitchExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17746,8 +19457,8 @@
 
 
         try {
-            // InternalDataDSL.g:6455:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
-            // InternalDataDSL.g:6456:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
+            // InternalDataDSL.g:7076:58: (iv_ruleXSwitchExpression= ruleXSwitchExpression EOF )
+            // InternalDataDSL.g:7077:2: iv_ruleXSwitchExpression= ruleXSwitchExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSwitchExpressionRule()); 
@@ -17778,7 +19489,7 @@
 
 
     // $ANTLR start "ruleXSwitchExpression"
-    // InternalDataDSL.g:6462:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
+    // InternalDataDSL.g:7083:1: ruleXSwitchExpression returns [EObject current=null] : ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) ;
     public final EObject ruleXSwitchExpression() throws RecognitionException {
         EObject current = null;
 
@@ -17808,14 +19519,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6468:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
-            // InternalDataDSL.g:6469:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            // InternalDataDSL.g:7089:2: ( ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' ) )
+            // InternalDataDSL.g:7090:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
             {
-            // InternalDataDSL.g:6469:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
-            // InternalDataDSL.g:6470:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
+            // InternalDataDSL.g:7090:2: ( () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}' )
+            // InternalDataDSL.g:7091:3: () otherlv_1= 'switch' ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) ) otherlv_10= '{' ( (lv_cases_11_0= ruleXCasePart ) )* (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )? otherlv_15= '}'
             {
-            // InternalDataDSL.g:6470:3: ()
-            // InternalDataDSL.g:6471:4: 
+            // InternalDataDSL.g:7091:3: ()
+            // InternalDataDSL.g:7092:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -17827,46 +19538,46 @@
 
             }
 
-            otherlv_1=(Token)match(input,122,FOLLOW_118); if (state.failed) return current;
+            otherlv_1=(Token)match(input,135,FOLLOW_124); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXSwitchExpressionAccess().getSwitchKeyword_1());
               		
             }
-            // InternalDataDSL.g:6481:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
-            int alt116=2;
-            alt116 = dfa116.predict(input);
-            switch (alt116) {
+            // InternalDataDSL.g:7102:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )
+            int alt123=2;
+            alt123 = dfa123.predict(input);
+            switch (alt123) {
                 case 1 :
-                    // InternalDataDSL.g:6482:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalDataDSL.g:7103:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
                     {
-                    // InternalDataDSL.g:6482:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
-                    // InternalDataDSL.g:6483:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
+                    // InternalDataDSL.g:7103:4: ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' )
+                    // InternalDataDSL.g:7104:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')'
                     {
-                    // InternalDataDSL.g:6483:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
-                    // InternalDataDSL.g:6484:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalDataDSL.g:7104:5: ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+                    // InternalDataDSL.g:7105:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
                     {
-                    // InternalDataDSL.g:6494:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
-                    // InternalDataDSL.g:6495:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+                    // InternalDataDSL.g:7115:6: (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+                    // InternalDataDSL.g:7116:7: otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
                     {
-                    otherlv_2=(Token)match(input,81,FOLLOW_91); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,94,FOLLOW_97); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       							newLeafNode(otherlv_2, grammarAccess.getXSwitchExpressionAccess().getLeftParenthesisKeyword_2_0_0_0_0());
                       						
                     }
-                    // InternalDataDSL.g:6499:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
-                    // InternalDataDSL.g:6500:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalDataDSL.g:7120:7: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+                    // InternalDataDSL.g:7121:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
                     {
-                    // InternalDataDSL.g:6500:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
-                    // InternalDataDSL.g:6501:9: lv_declaredParam_3_0= ruleJvmFormalParameter
+                    // InternalDataDSL.g:7121:8: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+                    // InternalDataDSL.g:7122:9: lv_declaredParam_3_0= ruleJvmFormalParameter
                     {
                     if ( state.backtracking==0 ) {
 
                       									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_0_0_0_1_0());
                       								
                     }
-                    pushFollow(FOLLOW_119);
+                    pushFollow(FOLLOW_125);
                     lv_declaredParam_3_0=ruleJvmFormalParameter();
 
                     state._fsp--;
@@ -17890,7 +19601,7 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,123,FOLLOW_78); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,136,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       							newLeafNode(otherlv_4, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_0_0_0_2());
@@ -17902,18 +19613,18 @@
 
                     }
 
-                    // InternalDataDSL.g:6524:5: ( (lv_switch_5_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6525:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalDataDSL.g:7145:5: ( (lv_switch_5_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7146:6: (lv_switch_5_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6525:6: (lv_switch_5_0= ruleXExpression )
-                    // InternalDataDSL.g:6526:7: lv_switch_5_0= ruleXExpression
+                    // InternalDataDSL.g:7146:6: (lv_switch_5_0= ruleXExpression )
+                    // InternalDataDSL.g:7147:7: lv_switch_5_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       							newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getSwitchXExpressionParserRuleCall_2_0_1_0());
                       						
                     }
-                    pushFollow(FOLLOW_76);
+                    pushFollow(FOLLOW_82);
                     lv_switch_5_0=ruleXExpression();
 
                     state._fsp--;
@@ -17937,7 +19648,7 @@
 
                     }
 
-                    otherlv_6=(Token)match(input,83,FOLLOW_18); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,96,FOLLOW_18); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_6, grammarAccess.getXSwitchExpressionAccess().getRightParenthesisKeyword_2_0_2());
@@ -17950,33 +19661,33 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:6549:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:7170:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
                     {
-                    // InternalDataDSL.g:6549:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
-                    // InternalDataDSL.g:6550:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7170:4: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:7171:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) )
                     {
-                    // InternalDataDSL.g:6550:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
-                    int alt115=2;
-                    alt115 = dfa115.predict(input);
-                    switch (alt115) {
+                    // InternalDataDSL.g:7171:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?
+                    int alt122=2;
+                    alt122 = dfa122.predict(input);
+                    switch (alt122) {
                         case 1 :
-                            // InternalDataDSL.g:6551:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalDataDSL.g:7172:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
                             {
-                            // InternalDataDSL.g:6560:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
-                            // InternalDataDSL.g:6561:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
+                            // InternalDataDSL.g:7181:6: ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' )
+                            // InternalDataDSL.g:7182:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':'
                             {
-                            // InternalDataDSL.g:6561:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
-                            // InternalDataDSL.g:6562:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalDataDSL.g:7182:7: ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) )
+                            // InternalDataDSL.g:7183:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
                             {
-                            // InternalDataDSL.g:6562:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
-                            // InternalDataDSL.g:6563:9: lv_declaredParam_7_0= ruleJvmFormalParameter
+                            // InternalDataDSL.g:7183:8: (lv_declaredParam_7_0= ruleJvmFormalParameter )
+                            // InternalDataDSL.g:7184:9: lv_declaredParam_7_0= ruleJvmFormalParameter
                             {
                             if ( state.backtracking==0 ) {
 
                               									newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_2_1_0_0_0_0());
                               								
                             }
-                            pushFollow(FOLLOW_119);
+                            pushFollow(FOLLOW_125);
                             lv_declaredParam_7_0=ruleJvmFormalParameter();
 
                             state._fsp--;
@@ -18000,7 +19711,7 @@
 
                             }
 
-                            otherlv_8=(Token)match(input,123,FOLLOW_78); if (state.failed) return current;
+                            otherlv_8=(Token)match(input,136,FOLLOW_84); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							newLeafNode(otherlv_8, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_2_1_0_0_1());
@@ -18015,11 +19726,11 @@
 
                     }
 
-                    // InternalDataDSL.g:6586:5: ( (lv_switch_9_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6587:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalDataDSL.g:7207:5: ( (lv_switch_9_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7208:6: (lv_switch_9_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6587:6: (lv_switch_9_0= ruleXExpression )
-                    // InternalDataDSL.g:6588:7: lv_switch_9_0= ruleXExpression
+                    // InternalDataDSL.g:7208:6: (lv_switch_9_0= ruleXExpression )
+                    // InternalDataDSL.g:7209:7: lv_switch_9_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18059,36 +19770,36 @@
 
             }
 
-            otherlv_10=(Token)match(input,14,FOLLOW_120); if (state.failed) return current;
+            otherlv_10=(Token)match(input,14,FOLLOW_126); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_10, grammarAccess.getXSwitchExpressionAccess().getLeftCurlyBracketKeyword_3());
               		
             }
-            // InternalDataDSL.g:6611:3: ( (lv_cases_11_0= ruleXCasePart ) )*
-            loop117:
+            // InternalDataDSL.g:7232:3: ( (lv_cases_11_0= ruleXCasePart ) )*
+            loop124:
             do {
-                int alt117=2;
-                int LA117_0 = input.LA(1);
+                int alt124=2;
+                int LA124_0 = input.LA(1);
 
-                if ( (LA117_0==RULE_ID||(LA117_0>=81 && LA117_0<=82)||LA117_0==106||LA117_0==123||LA117_0==125) ) {
-                    alt117=1;
+                if ( (LA124_0==RULE_ID||(LA124_0>=94 && LA124_0<=95)||LA124_0==119||LA124_0==136||LA124_0==138) ) {
+                    alt124=1;
                 }
 
 
-                switch (alt117) {
+                switch (alt124) {
             	case 1 :
-            	    // InternalDataDSL.g:6612:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalDataDSL.g:7233:4: (lv_cases_11_0= ruleXCasePart )
             	    {
-            	    // InternalDataDSL.g:6612:4: (lv_cases_11_0= ruleXCasePart )
-            	    // InternalDataDSL.g:6613:5: lv_cases_11_0= ruleXCasePart
+            	    // InternalDataDSL.g:7233:4: (lv_cases_11_0= ruleXCasePart )
+            	    // InternalDataDSL.g:7234:5: lv_cases_11_0= ruleXCasePart
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      					newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getCasesXCasePartParserRuleCall_4_0());
             	      				
             	    }
-            	    pushFollow(FOLLOW_120);
+            	    pushFollow(FOLLOW_126);
             	    lv_cases_11_0=ruleXCasePart();
 
             	    state._fsp--;
@@ -18114,45 +19825,45 @@
             	    break;
 
             	default :
-            	    break loop117;
+            	    break loop124;
                 }
             } while (true);
 
-            // InternalDataDSL.g:6630:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
-            int alt118=2;
-            int LA118_0 = input.LA(1);
+            // InternalDataDSL.g:7251:3: (otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) ) )?
+            int alt125=2;
+            int LA125_0 = input.LA(1);
 
-            if ( (LA118_0==124) ) {
-                alt118=1;
+            if ( (LA125_0==137) ) {
+                alt125=1;
             }
-            switch (alt118) {
+            switch (alt125) {
                 case 1 :
-                    // InternalDataDSL.g:6631:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7252:4: otherlv_12= 'default' otherlv_13= ':' ( (lv_default_14_0= ruleXExpression ) )
                     {
-                    otherlv_12=(Token)match(input,124,FOLLOW_119); if (state.failed) return current;
+                    otherlv_12=(Token)match(input,137,FOLLOW_125); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_12, grammarAccess.getXSwitchExpressionAccess().getDefaultKeyword_5_0());
                       			
                     }
-                    otherlv_13=(Token)match(input,123,FOLLOW_78); if (state.failed) return current;
+                    otherlv_13=(Token)match(input,136,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_13, grammarAccess.getXSwitchExpressionAccess().getColonKeyword_5_1());
                       			
                     }
-                    // InternalDataDSL.g:6639:4: ( (lv_default_14_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6640:5: (lv_default_14_0= ruleXExpression )
+                    // InternalDataDSL.g:7260:4: ( (lv_default_14_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7261:5: (lv_default_14_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6640:5: (lv_default_14_0= ruleXExpression )
-                    // InternalDataDSL.g:6641:6: lv_default_14_0= ruleXExpression
+                    // InternalDataDSL.g:7261:5: (lv_default_14_0= ruleXExpression )
+                    // InternalDataDSL.g:7262:6: lv_default_14_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXSwitchExpressionAccess().getDefaultXExpressionParserRuleCall_5_2_0());
                       					
                     }
-                    pushFollow(FOLLOW_41);
+                    pushFollow(FOLLOW_43);
                     lv_default_14_0=ruleXExpression();
 
                     state._fsp--;
@@ -18213,7 +19924,7 @@
 
 
     // $ANTLR start "entryRuleXCasePart"
-    // InternalDataDSL.g:6667:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
+    // InternalDataDSL.g:7288:1: entryRuleXCasePart returns [EObject current=null] : iv_ruleXCasePart= ruleXCasePart EOF ;
     public final EObject entryRuleXCasePart() throws RecognitionException {
         EObject current = null;
 
@@ -18221,8 +19932,8 @@
 
 
         try {
-            // InternalDataDSL.g:6667:50: (iv_ruleXCasePart= ruleXCasePart EOF )
-            // InternalDataDSL.g:6668:2: iv_ruleXCasePart= ruleXCasePart EOF
+            // InternalDataDSL.g:7288:50: (iv_ruleXCasePart= ruleXCasePart EOF )
+            // InternalDataDSL.g:7289:2: iv_ruleXCasePart= ruleXCasePart EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCasePartRule()); 
@@ -18253,7 +19964,7 @@
 
 
     // $ANTLR start "ruleXCasePart"
-    // InternalDataDSL.g:6674:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
+    // InternalDataDSL.g:7295:1: ruleXCasePart returns [EObject current=null] : ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) ;
     public final EObject ruleXCasePart() throws RecognitionException {
         EObject current = null;
 
@@ -18271,14 +19982,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6680:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
-            // InternalDataDSL.g:6681:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            // InternalDataDSL.g:7301:2: ( ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) ) )
+            // InternalDataDSL.g:7302:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
             {
-            // InternalDataDSL.g:6681:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
-            // InternalDataDSL.g:6682:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            // InternalDataDSL.g:7302:2: ( () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) ) )
+            // InternalDataDSL.g:7303:3: () ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )? (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )? ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
             {
-            // InternalDataDSL.g:6682:3: ()
-            // InternalDataDSL.g:6683:4: 
+            // InternalDataDSL.g:7303:3: ()
+            // InternalDataDSL.g:7304:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -18290,26 +20001,26 @@
 
             }
 
-            // InternalDataDSL.g:6689:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
-            int alt119=2;
-            int LA119_0 = input.LA(1);
+            // InternalDataDSL.g:7310:3: ( (lv_typeGuard_1_0= ruleJvmTypeReference ) )?
+            int alt126=2;
+            int LA126_0 = input.LA(1);
 
-            if ( (LA119_0==RULE_ID||LA119_0==81||LA119_0==106) ) {
-                alt119=1;
+            if ( (LA126_0==RULE_ID||LA126_0==94||LA126_0==119) ) {
+                alt126=1;
             }
-            switch (alt119) {
+            switch (alt126) {
                 case 1 :
-                    // InternalDataDSL.g:6690:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:7311:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
                     {
-                    // InternalDataDSL.g:6690:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
-                    // InternalDataDSL.g:6691:5: lv_typeGuard_1_0= ruleJvmTypeReference
+                    // InternalDataDSL.g:7311:4: (lv_typeGuard_1_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:7312:5: lv_typeGuard_1_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
                       					newCompositeNode(grammarAccess.getXCasePartAccess().getTypeGuardJvmTypeReferenceParserRuleCall_1_0());
                       				
                     }
-                    pushFollow(FOLLOW_121);
+                    pushFollow(FOLLOW_127);
                     lv_typeGuard_1_0=ruleJvmTypeReference();
 
                     state._fsp--;
@@ -18336,35 +20047,35 @@
 
             }
 
-            // InternalDataDSL.g:6708:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
-            int alt120=2;
-            int LA120_0 = input.LA(1);
+            // InternalDataDSL.g:7329:3: (otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) ) )?
+            int alt127=2;
+            int LA127_0 = input.LA(1);
 
-            if ( (LA120_0==125) ) {
-                alt120=1;
+            if ( (LA127_0==138) ) {
+                alt127=1;
             }
-            switch (alt120) {
+            switch (alt127) {
                 case 1 :
-                    // InternalDataDSL.g:6709:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7330:4: otherlv_2= 'case' ( (lv_case_3_0= ruleXExpression ) )
                     {
-                    otherlv_2=(Token)match(input,125,FOLLOW_78); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,138,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_2, grammarAccess.getXCasePartAccess().getCaseKeyword_2_0());
                       			
                     }
-                    // InternalDataDSL.g:6713:4: ( (lv_case_3_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6714:5: (lv_case_3_0= ruleXExpression )
+                    // InternalDataDSL.g:7334:4: ( (lv_case_3_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7335:5: (lv_case_3_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6714:5: (lv_case_3_0= ruleXExpression )
-                    // InternalDataDSL.g:6715:6: lv_case_3_0= ruleXExpression
+                    // InternalDataDSL.g:7335:5: (lv_case_3_0= ruleXExpression )
+                    // InternalDataDSL.g:7336:6: lv_case_3_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXCasePartAccess().getCaseXExpressionParserRuleCall_2_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_122);
+                    pushFollow(FOLLOW_128);
                     lv_case_3_0=ruleXExpression();
 
                     state._fsp--;
@@ -18394,41 +20105,41 @@
 
             }
 
-            // InternalDataDSL.g:6733:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
-            int alt121=2;
-            int LA121_0 = input.LA(1);
+            // InternalDataDSL.g:7354:3: ( (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) ) | ( (lv_fallThrough_6_0= ',' ) ) )
+            int alt128=2;
+            int LA128_0 = input.LA(1);
 
-            if ( (LA121_0==123) ) {
-                alt121=1;
+            if ( (LA128_0==136) ) {
+                alt128=1;
             }
-            else if ( (LA121_0==82) ) {
-                alt121=2;
+            else if ( (LA128_0==95) ) {
+                alt128=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 121, 0, input);
+                    new NoViableAltException("", 128, 0, input);
 
                 throw nvae;
             }
-            switch (alt121) {
+            switch (alt128) {
                 case 1 :
-                    // InternalDataDSL.g:6734:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:7355:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
                     {
-                    // InternalDataDSL.g:6734:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
-                    // InternalDataDSL.g:6735:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7355:4: (otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:7356:5: otherlv_4= ':' ( (lv_then_5_0= ruleXExpression ) )
                     {
-                    otherlv_4=(Token)match(input,123,FOLLOW_78); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,136,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_4, grammarAccess.getXCasePartAccess().getColonKeyword_3_0_0());
                       				
                     }
-                    // InternalDataDSL.g:6739:5: ( (lv_then_5_0= ruleXExpression ) )
-                    // InternalDataDSL.g:6740:6: (lv_then_5_0= ruleXExpression )
+                    // InternalDataDSL.g:7360:5: ( (lv_then_5_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7361:6: (lv_then_5_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6740:6: (lv_then_5_0= ruleXExpression )
-                    // InternalDataDSL.g:6741:7: lv_then_5_0= ruleXExpression
+                    // InternalDataDSL.g:7361:6: (lv_then_5_0= ruleXExpression )
+                    // InternalDataDSL.g:7362:7: lv_then_5_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -18466,15 +20177,15 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:6760:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalDataDSL.g:7381:4: ( (lv_fallThrough_6_0= ',' ) )
                     {
-                    // InternalDataDSL.g:6760:4: ( (lv_fallThrough_6_0= ',' ) )
-                    // InternalDataDSL.g:6761:5: (lv_fallThrough_6_0= ',' )
+                    // InternalDataDSL.g:7381:4: ( (lv_fallThrough_6_0= ',' ) )
+                    // InternalDataDSL.g:7382:5: (lv_fallThrough_6_0= ',' )
                     {
-                    // InternalDataDSL.g:6761:5: (lv_fallThrough_6_0= ',' )
-                    // InternalDataDSL.g:6762:6: lv_fallThrough_6_0= ','
+                    // InternalDataDSL.g:7382:5: (lv_fallThrough_6_0= ',' )
+                    // InternalDataDSL.g:7383:6: lv_fallThrough_6_0= ','
                     {
-                    lv_fallThrough_6_0=(Token)match(input,82,FOLLOW_2); if (state.failed) return current;
+                    lv_fallThrough_6_0=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_fallThrough_6_0, grammarAccess.getXCasePartAccess().getFallThroughCommaKeyword_3_1_0());
@@ -18525,7 +20236,7 @@
 
 
     // $ANTLR start "entryRuleXForLoopExpression"
-    // InternalDataDSL.g:6779:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
+    // InternalDataDSL.g:7400:1: entryRuleXForLoopExpression returns [EObject current=null] : iv_ruleXForLoopExpression= ruleXForLoopExpression EOF ;
     public final EObject entryRuleXForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -18533,8 +20244,8 @@
 
 
         try {
-            // InternalDataDSL.g:6779:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
-            // InternalDataDSL.g:6780:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
+            // InternalDataDSL.g:7400:59: (iv_ruleXForLoopExpression= ruleXForLoopExpression EOF )
+            // InternalDataDSL.g:7401:2: iv_ruleXForLoopExpression= ruleXForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXForLoopExpressionRule()); 
@@ -18565,7 +20276,7 @@
 
 
     // $ANTLR start "ruleXForLoopExpression"
-    // InternalDataDSL.g:6786:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:7407:1: ruleXForLoopExpression returns [EObject current=null] : ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) ;
     public final EObject ruleXForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -18584,20 +20295,20 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6792:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:6793:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7413:2: ( ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:7414:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:6793:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:6794:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalDataDSL.g:7414:2: ( ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7415:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_forExpression_5_0= ruleXExpression ) ) otherlv_6= ')' ( (lv_eachExpression_7_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:6794:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
-            // InternalDataDSL.g:6795:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalDataDSL.g:7415:3: ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) )
+            // InternalDataDSL.g:7416:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
             {
-            // InternalDataDSL.g:6808:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
-            // InternalDataDSL.g:6809:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
+            // InternalDataDSL.g:7429:4: ( () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' )
+            // InternalDataDSL.g:7430:5: () otherlv_1= 'for' otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':'
             {
-            // InternalDataDSL.g:6809:5: ()
-            // InternalDataDSL.g:6810:6: 
+            // InternalDataDSL.g:7430:5: ()
+            // InternalDataDSL.g:7431:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -18609,30 +20320,30 @@
 
             }
 
-            otherlv_1=(Token)match(input,50,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,52,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_1, grammarAccess.getXForLoopExpressionAccess().getForKeyword_0_0_1());
               				
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_91); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getXForLoopExpressionAccess().getLeftParenthesisKeyword_0_0_2());
               				
             }
-            // InternalDataDSL.g:6824:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
-            // InternalDataDSL.g:6825:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalDataDSL.g:7445:5: ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) )
+            // InternalDataDSL.g:7446:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
             {
-            // InternalDataDSL.g:6825:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
-            // InternalDataDSL.g:6826:7: lv_declaredParam_3_0= ruleJvmFormalParameter
+            // InternalDataDSL.g:7446:6: (lv_declaredParam_3_0= ruleJvmFormalParameter )
+            // InternalDataDSL.g:7447:7: lv_declaredParam_3_0= ruleJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
 
               							newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getDeclaredParamJvmFormalParameterParserRuleCall_0_0_3_0());
               						
             }
-            pushFollow(FOLLOW_119);
+            pushFollow(FOLLOW_125);
             lv_declaredParam_3_0=ruleJvmFormalParameter();
 
             state._fsp--;
@@ -18656,7 +20367,7 @@
 
             }
 
-            otherlv_4=(Token)match(input,123,FOLLOW_78); if (state.failed) return current;
+            otherlv_4=(Token)match(input,136,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_4, grammarAccess.getXForLoopExpressionAccess().getColonKeyword_0_0_4());
@@ -18668,18 +20379,18 @@
 
             }
 
-            // InternalDataDSL.g:6849:3: ( (lv_forExpression_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:6850:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalDataDSL.g:7470:3: ( (lv_forExpression_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:7471:4: (lv_forExpression_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:6850:4: (lv_forExpression_5_0= ruleXExpression )
-            // InternalDataDSL.g:6851:5: lv_forExpression_5_0= ruleXExpression
+            // InternalDataDSL.g:7471:4: (lv_forExpression_5_0= ruleXExpression )
+            // InternalDataDSL.g:7472:5: lv_forExpression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXForLoopExpressionAccess().getForExpressionXExpressionParserRuleCall_1_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_forExpression_5_0=ruleXExpression();
 
             state._fsp--;
@@ -18703,17 +20414,17 @@
 
             }
 
-            otherlv_6=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_6=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_6, grammarAccess.getXForLoopExpressionAccess().getRightParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:6872:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
-            // InternalDataDSL.g:6873:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalDataDSL.g:7493:3: ( (lv_eachExpression_7_0= ruleXExpression ) )
+            // InternalDataDSL.g:7494:4: (lv_eachExpression_7_0= ruleXExpression )
             {
-            // InternalDataDSL.g:6873:4: (lv_eachExpression_7_0= ruleXExpression )
-            // InternalDataDSL.g:6874:5: lv_eachExpression_7_0= ruleXExpression
+            // InternalDataDSL.g:7494:4: (lv_eachExpression_7_0= ruleXExpression )
+            // InternalDataDSL.g:7495:5: lv_eachExpression_7_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -18769,7 +20480,7 @@
 
 
     // $ANTLR start "entryRuleXBasicForLoopExpression"
-    // InternalDataDSL.g:6895:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
+    // InternalDataDSL.g:7516:1: entryRuleXBasicForLoopExpression returns [EObject current=null] : iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF ;
     public final EObject entryRuleXBasicForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -18777,8 +20488,8 @@
 
 
         try {
-            // InternalDataDSL.g:6895:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
-            // InternalDataDSL.g:6896:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
+            // InternalDataDSL.g:7516:64: (iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF )
+            // InternalDataDSL.g:7517:2: iv_ruleXBasicForLoopExpression= ruleXBasicForLoopExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBasicForLoopExpressionRule()); 
@@ -18809,7 +20520,7 @@
 
 
     // $ANTLR start "ruleXBasicForLoopExpression"
-    // InternalDataDSL.g:6902:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:7523:1: ruleXBasicForLoopExpression returns [EObject current=null] : ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) ;
     public final EObject ruleXBasicForLoopExpression() throws RecognitionException {
         EObject current = null;
 
@@ -18837,14 +20548,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:6908:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:6909:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7529:2: ( ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:7530:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:6909:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:6910:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalDataDSL.g:7530:2: ( () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7531:3: () otherlv_1= 'for' otherlv_2= '(' ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )? otherlv_6= ';' ( (lv_expression_7_0= ruleXExpression ) )? otherlv_8= ';' ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )? otherlv_12= ')' ( (lv_eachExpression_13_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:6910:3: ()
-            // InternalDataDSL.g:6911:4: 
+            // InternalDataDSL.g:7531:3: ()
+            // InternalDataDSL.g:7532:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -18856,41 +20567,41 @@
 
             }
 
-            otherlv_1=(Token)match(input,50,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,52,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXBasicForLoopExpressionAccess().getForKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_123); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_129); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXBasicForLoopExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:6925:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
-            int alt123=2;
-            int LA123_0 = input.LA(1);
+            // InternalDataDSL.g:7546:3: ( ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )* )?
+            int alt130=2;
+            int LA130_0 = input.LA(1);
 
-            if ( ((LA123_0>=RULE_STRING && LA123_0<=RULE_DECIMAL)||LA123_0==14||LA123_0==50||LA123_0==72||(LA123_0>=75 && LA123_0<=76)||LA123_0==81||(LA123_0>=85 && LA123_0<=86)||LA123_0==93||(LA123_0>=109 && LA123_0<=110)||LA123_0==114||LA123_0==120||LA123_0==122||(LA123_0>=126 && LA123_0<=139)||LA123_0==141) ) {
-                alt123=1;
+            if ( ((LA130_0>=RULE_STRING && LA130_0<=RULE_DECIMAL)||LA130_0==14||LA130_0==52||LA130_0==75||(LA130_0>=88 && LA130_0<=89)||LA130_0==94||(LA130_0>=98 && LA130_0<=99)||LA130_0==106||(LA130_0>=122 && LA130_0<=123)||LA130_0==127||LA130_0==133||LA130_0==135||(LA130_0>=139 && LA130_0<=152)||LA130_0==154) ) {
+                alt130=1;
             }
-            switch (alt123) {
+            switch (alt130) {
                 case 1 :
-                    // InternalDataDSL.g:6926:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    // InternalDataDSL.g:7547:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
                     {
-                    // InternalDataDSL.g:6926:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
-                    // InternalDataDSL.g:6927:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalDataDSL.g:7547:4: ( (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration ) )
+                    // InternalDataDSL.g:7548:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
                     {
-                    // InternalDataDSL.g:6927:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
-                    // InternalDataDSL.g:6928:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
+                    // InternalDataDSL.g:7548:5: (lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration )
+                    // InternalDataDSL.g:7549:6: lv_initExpressions_3_0= ruleXExpressionOrVarDeclaration
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_0_0());
                       					
                     }
-                    pushFollow(FOLLOW_124);
+                    pushFollow(FOLLOW_130);
                     lv_initExpressions_3_0=ruleXExpressionOrVarDeclaration();
 
                     state._fsp--;
@@ -18914,39 +20625,39 @@
 
                     }
 
-                    // InternalDataDSL.g:6945:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
-                    loop122:
+                    // InternalDataDSL.g:7566:4: (otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) ) )*
+                    loop129:
                     do {
-                        int alt122=2;
-                        int LA122_0 = input.LA(1);
+                        int alt129=2;
+                        int LA129_0 = input.LA(1);
 
-                        if ( (LA122_0==82) ) {
-                            alt122=1;
+                        if ( (LA129_0==95) ) {
+                            alt129=1;
                         }
 
 
-                        switch (alt122) {
+                        switch (alt129) {
                     	case 1 :
-                    	    // InternalDataDSL.g:6946:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalDataDSL.g:7567:5: otherlv_4= ',' ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
                     	    {
-                    	    otherlv_4=(Token)match(input,82,FOLLOW_125); if (state.failed) return current;
+                    	    otherlv_4=(Token)match(input,95,FOLLOW_131); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_4, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_3_1_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:6950:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
-                    	    // InternalDataDSL.g:6951:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalDataDSL.g:7571:5: ( (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration ) )
+                    	    // InternalDataDSL.g:7572:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
                     	    {
-                    	    // InternalDataDSL.g:6951:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
-                    	    // InternalDataDSL.g:6952:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
+                    	    // InternalDataDSL.g:7572:6: (lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration )
+                    	    // InternalDataDSL.g:7573:7: lv_initExpressions_5_0= ruleXExpressionOrVarDeclaration
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getInitExpressionsXExpressionOrVarDeclarationParserRuleCall_3_1_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_124);
+                    	    pushFollow(FOLLOW_130);
                     	    lv_initExpressions_5_0=ruleXExpressionOrVarDeclaration();
 
                     	    state._fsp--;
@@ -18975,7 +20686,7 @@
                     	    break;
 
                     	default :
-                    	    break loop122;
+                    	    break loop129;
                         }
                     } while (true);
 
@@ -18985,32 +20696,32 @@
 
             }
 
-            otherlv_6=(Token)match(input,79,FOLLOW_126); if (state.failed) return current;
+            otherlv_6=(Token)match(input,92,FOLLOW_132); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_6, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_4());
               		
             }
-            // InternalDataDSL.g:6975:3: ( (lv_expression_7_0= ruleXExpression ) )?
-            int alt124=2;
-            int LA124_0 = input.LA(1);
+            // InternalDataDSL.g:7596:3: ( (lv_expression_7_0= ruleXExpression ) )?
+            int alt131=2;
+            int LA131_0 = input.LA(1);
 
-            if ( ((LA124_0>=RULE_STRING && LA124_0<=RULE_DECIMAL)||LA124_0==14||LA124_0==50||LA124_0==72||(LA124_0>=75 && LA124_0<=76)||LA124_0==81||(LA124_0>=85 && LA124_0<=86)||LA124_0==93||(LA124_0>=109 && LA124_0<=110)||LA124_0==114||LA124_0==120||LA124_0==122||(LA124_0>=126 && LA124_0<=127)||(LA124_0>=130 && LA124_0<=139)||LA124_0==141) ) {
-                alt124=1;
+            if ( ((LA131_0>=RULE_STRING && LA131_0<=RULE_DECIMAL)||LA131_0==14||LA131_0==52||LA131_0==75||(LA131_0>=88 && LA131_0<=89)||LA131_0==94||(LA131_0>=98 && LA131_0<=99)||LA131_0==106||(LA131_0>=122 && LA131_0<=123)||LA131_0==127||LA131_0==133||LA131_0==135||(LA131_0>=139 && LA131_0<=140)||(LA131_0>=143 && LA131_0<=152)||LA131_0==154) ) {
+                alt131=1;
             }
-            switch (alt124) {
+            switch (alt131) {
                 case 1 :
-                    // InternalDataDSL.g:6976:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalDataDSL.g:7597:4: (lv_expression_7_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:6976:4: (lv_expression_7_0= ruleXExpression )
-                    // InternalDataDSL.g:6977:5: lv_expression_7_0= ruleXExpression
+                    // InternalDataDSL.g:7597:4: (lv_expression_7_0= ruleXExpression )
+                    // InternalDataDSL.g:7598:5: lv_expression_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       					newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getExpressionXExpressionParserRuleCall_5_0());
                       				
                     }
-                    pushFollow(FOLLOW_127);
+                    pushFollow(FOLLOW_133);
                     lv_expression_7_0=ruleXExpression();
 
                     state._fsp--;
@@ -19037,35 +20748,35 @@
 
             }
 
-            otherlv_8=(Token)match(input,79,FOLLOW_74); if (state.failed) return current;
+            otherlv_8=(Token)match(input,92,FOLLOW_80); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_8, grammarAccess.getXBasicForLoopExpressionAccess().getSemicolonKeyword_6());
               		
             }
-            // InternalDataDSL.g:6998:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
-            int alt126=2;
-            int LA126_0 = input.LA(1);
+            // InternalDataDSL.g:7619:3: ( ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )* )?
+            int alt133=2;
+            int LA133_0 = input.LA(1);
 
-            if ( ((LA126_0>=RULE_STRING && LA126_0<=RULE_DECIMAL)||LA126_0==14||LA126_0==50||LA126_0==72||(LA126_0>=75 && LA126_0<=76)||LA126_0==81||(LA126_0>=85 && LA126_0<=86)||LA126_0==93||(LA126_0>=109 && LA126_0<=110)||LA126_0==114||LA126_0==120||LA126_0==122||(LA126_0>=126 && LA126_0<=127)||(LA126_0>=130 && LA126_0<=139)||LA126_0==141) ) {
-                alt126=1;
+            if ( ((LA133_0>=RULE_STRING && LA133_0<=RULE_DECIMAL)||LA133_0==14||LA133_0==52||LA133_0==75||(LA133_0>=88 && LA133_0<=89)||LA133_0==94||(LA133_0>=98 && LA133_0<=99)||LA133_0==106||(LA133_0>=122 && LA133_0<=123)||LA133_0==127||LA133_0==133||LA133_0==135||(LA133_0>=139 && LA133_0<=140)||(LA133_0>=143 && LA133_0<=152)||LA133_0==154) ) {
+                alt133=1;
             }
-            switch (alt126) {
+            switch (alt133) {
                 case 1 :
-                    // InternalDataDSL.g:6999:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    // InternalDataDSL.g:7620:4: ( (lv_updateExpressions_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
                     {
-                    // InternalDataDSL.g:6999:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
-                    // InternalDataDSL.g:7000:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalDataDSL.g:7620:4: ( (lv_updateExpressions_9_0= ruleXExpression ) )
+                    // InternalDataDSL.g:7621:5: (lv_updateExpressions_9_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:7000:5: (lv_updateExpressions_9_0= ruleXExpression )
-                    // InternalDataDSL.g:7001:6: lv_updateExpressions_9_0= ruleXExpression
+                    // InternalDataDSL.g:7621:5: (lv_updateExpressions_9_0= ruleXExpression )
+                    // InternalDataDSL.g:7622:6: lv_updateExpressions_9_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_0_0());
                       					
                     }
-                    pushFollow(FOLLOW_75);
+                    pushFollow(FOLLOW_81);
                     lv_updateExpressions_9_0=ruleXExpression();
 
                     state._fsp--;
@@ -19089,39 +20800,39 @@
 
                     }
 
-                    // InternalDataDSL.g:7018:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
-                    loop125:
+                    // InternalDataDSL.g:7639:4: (otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) ) )*
+                    loop132:
                     do {
-                        int alt125=2;
-                        int LA125_0 = input.LA(1);
+                        int alt132=2;
+                        int LA132_0 = input.LA(1);
 
-                        if ( (LA125_0==82) ) {
-                            alt125=1;
+                        if ( (LA132_0==95) ) {
+                            alt132=1;
                         }
 
 
-                        switch (alt125) {
+                        switch (alt132) {
                     	case 1 :
-                    	    // InternalDataDSL.g:7019:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:7640:5: otherlv_10= ',' ( (lv_updateExpressions_11_0= ruleXExpression ) )
                     	    {
-                    	    otherlv_10=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                    	    otherlv_10=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_10, grammarAccess.getXBasicForLoopExpressionAccess().getCommaKeyword_7_1_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:7023:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
-                    	    // InternalDataDSL.g:7024:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalDataDSL.g:7644:5: ( (lv_updateExpressions_11_0= ruleXExpression ) )
+                    	    // InternalDataDSL.g:7645:6: (lv_updateExpressions_11_0= ruleXExpression )
                     	    {
-                    	    // InternalDataDSL.g:7024:6: (lv_updateExpressions_11_0= ruleXExpression )
-                    	    // InternalDataDSL.g:7025:7: lv_updateExpressions_11_0= ruleXExpression
+                    	    // InternalDataDSL.g:7645:6: (lv_updateExpressions_11_0= ruleXExpression )
+                    	    // InternalDataDSL.g:7646:7: lv_updateExpressions_11_0= ruleXExpression
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXBasicForLoopExpressionAccess().getUpdateExpressionsXExpressionParserRuleCall_7_1_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_75);
+                    	    pushFollow(FOLLOW_81);
                     	    lv_updateExpressions_11_0=ruleXExpression();
 
                     	    state._fsp--;
@@ -19150,7 +20861,7 @@
                     	    break;
 
                     	default :
-                    	    break loop125;
+                    	    break loop132;
                         }
                     } while (true);
 
@@ -19160,17 +20871,17 @@
 
             }
 
-            otherlv_12=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_12=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_12, grammarAccess.getXBasicForLoopExpressionAccess().getRightParenthesisKeyword_8());
               		
             }
-            // InternalDataDSL.g:7048:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
-            // InternalDataDSL.g:7049:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalDataDSL.g:7669:3: ( (lv_eachExpression_13_0= ruleXExpression ) )
+            // InternalDataDSL.g:7670:4: (lv_eachExpression_13_0= ruleXExpression )
             {
-            // InternalDataDSL.g:7049:4: (lv_eachExpression_13_0= ruleXExpression )
-            // InternalDataDSL.g:7050:5: lv_eachExpression_13_0= ruleXExpression
+            // InternalDataDSL.g:7670:4: (lv_eachExpression_13_0= ruleXExpression )
+            // InternalDataDSL.g:7671:5: lv_eachExpression_13_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -19226,7 +20937,7 @@
 
 
     // $ANTLR start "entryRuleXWhileExpression"
-    // InternalDataDSL.g:7071:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
+    // InternalDataDSL.g:7692:1: entryRuleXWhileExpression returns [EObject current=null] : iv_ruleXWhileExpression= ruleXWhileExpression EOF ;
     public final EObject entryRuleXWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19234,8 +20945,8 @@
 
 
         try {
-            // InternalDataDSL.g:7071:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
-            // InternalDataDSL.g:7072:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
+            // InternalDataDSL.g:7692:57: (iv_ruleXWhileExpression= ruleXWhileExpression EOF )
+            // InternalDataDSL.g:7693:2: iv_ruleXWhileExpression= ruleXWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXWhileExpressionRule()); 
@@ -19266,7 +20977,7 @@
 
 
     // $ANTLR start "ruleXWhileExpression"
-    // InternalDataDSL.g:7078:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:7699:1: ruleXWhileExpression returns [EObject current=null] : ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19282,14 +20993,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7084:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:7085:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7705:2: ( ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:7706:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:7085:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:7086:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:7706:2: ( () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:7707:3: () otherlv_1= 'while' otherlv_2= '(' ( (lv_predicate_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_body_5_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:7086:3: ()
-            // InternalDataDSL.g:7087:4: 
+            // InternalDataDSL.g:7707:3: ()
+            // InternalDataDSL.g:7708:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -19301,30 +21012,30 @@
 
             }
 
-            otherlv_1=(Token)match(input,126,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,139,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXWhileExpressionAccess().getWhileKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_78); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXWhileExpressionAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:7101:3: ( (lv_predicate_3_0= ruleXExpression ) )
-            // InternalDataDSL.g:7102:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalDataDSL.g:7722:3: ( (lv_predicate_3_0= ruleXExpression ) )
+            // InternalDataDSL.g:7723:4: (lv_predicate_3_0= ruleXExpression )
             {
-            // InternalDataDSL.g:7102:4: (lv_predicate_3_0= ruleXExpression )
-            // InternalDataDSL.g:7103:5: lv_predicate_3_0= ruleXExpression
+            // InternalDataDSL.g:7723:4: (lv_predicate_3_0= ruleXExpression )
+            // InternalDataDSL.g:7724:5: lv_predicate_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXWhileExpressionAccess().getPredicateXExpressionParserRuleCall_3_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_predicate_3_0=ruleXExpression();
 
             state._fsp--;
@@ -19348,17 +21059,17 @@
 
             }
 
-            otherlv_4=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_4=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_4, grammarAccess.getXWhileExpressionAccess().getRightParenthesisKeyword_4());
               		
             }
-            // InternalDataDSL.g:7124:3: ( (lv_body_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:7125:4: (lv_body_5_0= ruleXExpression )
+            // InternalDataDSL.g:7745:3: ( (lv_body_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:7746:4: (lv_body_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:7125:4: (lv_body_5_0= ruleXExpression )
-            // InternalDataDSL.g:7126:5: lv_body_5_0= ruleXExpression
+            // InternalDataDSL.g:7746:4: (lv_body_5_0= ruleXExpression )
+            // InternalDataDSL.g:7747:5: lv_body_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -19414,7 +21125,7 @@
 
 
     // $ANTLR start "entryRuleXDoWhileExpression"
-    // InternalDataDSL.g:7147:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
+    // InternalDataDSL.g:7768:1: entryRuleXDoWhileExpression returns [EObject current=null] : iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF ;
     public final EObject entryRuleXDoWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19422,8 +21133,8 @@
 
 
         try {
-            // InternalDataDSL.g:7147:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
-            // InternalDataDSL.g:7148:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
+            // InternalDataDSL.g:7768:59: (iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF )
+            // InternalDataDSL.g:7769:2: iv_ruleXDoWhileExpression= ruleXDoWhileExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXDoWhileExpressionRule()); 
@@ -19454,7 +21165,7 @@
 
 
     // $ANTLR start "ruleXDoWhileExpression"
-    // InternalDataDSL.g:7154:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
+    // InternalDataDSL.g:7775:1: ruleXDoWhileExpression returns [EObject current=null] : ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) ;
     public final EObject ruleXDoWhileExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19471,14 +21182,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7160:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
-            // InternalDataDSL.g:7161:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalDataDSL.g:7781:2: ( ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' ) )
+            // InternalDataDSL.g:7782:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
             {
-            // InternalDataDSL.g:7161:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
-            // InternalDataDSL.g:7162:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
+            // InternalDataDSL.g:7782:2: ( () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')' )
+            // InternalDataDSL.g:7783:3: () otherlv_1= 'do' ( (lv_body_2_0= ruleXExpression ) ) otherlv_3= 'while' otherlv_4= '(' ( (lv_predicate_5_0= ruleXExpression ) ) otherlv_6= ')'
             {
-            // InternalDataDSL.g:7162:3: ()
-            // InternalDataDSL.g:7163:4: 
+            // InternalDataDSL.g:7783:3: ()
+            // InternalDataDSL.g:7784:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -19490,24 +21201,24 @@
 
             }
 
-            otherlv_1=(Token)match(input,127,FOLLOW_78); if (state.failed) return current;
+            otherlv_1=(Token)match(input,140,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXDoWhileExpressionAccess().getDoKeyword_1());
               		
             }
-            // InternalDataDSL.g:7173:3: ( (lv_body_2_0= ruleXExpression ) )
-            // InternalDataDSL.g:7174:4: (lv_body_2_0= ruleXExpression )
+            // InternalDataDSL.g:7794:3: ( (lv_body_2_0= ruleXExpression ) )
+            // InternalDataDSL.g:7795:4: (lv_body_2_0= ruleXExpression )
             {
-            // InternalDataDSL.g:7174:4: (lv_body_2_0= ruleXExpression )
-            // InternalDataDSL.g:7175:5: lv_body_2_0= ruleXExpression
+            // InternalDataDSL.g:7795:4: (lv_body_2_0= ruleXExpression )
+            // InternalDataDSL.g:7796:5: lv_body_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getBodyXExpressionParserRuleCall_2_0());
               				
             }
-            pushFollow(FOLLOW_128);
+            pushFollow(FOLLOW_134);
             lv_body_2_0=ruleXExpression();
 
             state._fsp--;
@@ -19531,30 +21242,30 @@
 
             }
 
-            otherlv_3=(Token)match(input,126,FOLLOW_116); if (state.failed) return current;
+            otherlv_3=(Token)match(input,139,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getXDoWhileExpressionAccess().getWhileKeyword_3());
               		
             }
-            otherlv_4=(Token)match(input,81,FOLLOW_78); if (state.failed) return current;
+            otherlv_4=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_4, grammarAccess.getXDoWhileExpressionAccess().getLeftParenthesisKeyword_4());
               		
             }
-            // InternalDataDSL.g:7200:3: ( (lv_predicate_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:7201:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalDataDSL.g:7821:3: ( (lv_predicate_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:7822:4: (lv_predicate_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:7201:4: (lv_predicate_5_0= ruleXExpression )
-            // InternalDataDSL.g:7202:5: lv_predicate_5_0= ruleXExpression
+            // InternalDataDSL.g:7822:4: (lv_predicate_5_0= ruleXExpression )
+            // InternalDataDSL.g:7823:5: lv_predicate_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXDoWhileExpressionAccess().getPredicateXExpressionParserRuleCall_5_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_predicate_5_0=ruleXExpression();
 
             state._fsp--;
@@ -19578,7 +21289,7 @@
 
             }
 
-            otherlv_6=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
+            otherlv_6=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_6, grammarAccess.getXDoWhileExpressionAccess().getRightParenthesisKeyword_6());
@@ -19609,7 +21320,7 @@
 
 
     // $ANTLR start "entryRuleXBlockExpression"
-    // InternalDataDSL.g:7227:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
+    // InternalDataDSL.g:7848:1: entryRuleXBlockExpression returns [EObject current=null] : iv_ruleXBlockExpression= ruleXBlockExpression EOF ;
     public final EObject entryRuleXBlockExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19617,8 +21328,8 @@
 
 
         try {
-            // InternalDataDSL.g:7227:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
-            // InternalDataDSL.g:7228:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
+            // InternalDataDSL.g:7848:57: (iv_ruleXBlockExpression= ruleXBlockExpression EOF )
+            // InternalDataDSL.g:7849:2: iv_ruleXBlockExpression= ruleXBlockExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBlockExpressionRule()); 
@@ -19649,7 +21360,7 @@
 
 
     // $ANTLR start "ruleXBlockExpression"
-    // InternalDataDSL.g:7234:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
+    // InternalDataDSL.g:7855:1: ruleXBlockExpression returns [EObject current=null] : ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) ;
     public final EObject ruleXBlockExpression() throws RecognitionException {
         EObject current = null;
 
@@ -19663,14 +21374,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7240:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
-            // InternalDataDSL.g:7241:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalDataDSL.g:7861:2: ( ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' ) )
+            // InternalDataDSL.g:7862:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
             {
-            // InternalDataDSL.g:7241:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
-            // InternalDataDSL.g:7242:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
+            // InternalDataDSL.g:7862:2: ( () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}' )
+            // InternalDataDSL.g:7863:3: () otherlv_1= '{' ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )* otherlv_4= '}'
             {
-            // InternalDataDSL.g:7242:3: ()
-            // InternalDataDSL.g:7243:4: 
+            // InternalDataDSL.g:7863:3: ()
+            // InternalDataDSL.g:7864:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -19682,39 +21393,39 @@
 
             }
 
-            otherlv_1=(Token)match(input,14,FOLLOW_129); if (state.failed) return current;
+            otherlv_1=(Token)match(input,14,FOLLOW_135); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXBlockExpressionAccess().getLeftCurlyBracketKeyword_1());
               		
             }
-            // InternalDataDSL.g:7253:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
-            loop128:
+            // InternalDataDSL.g:7874:3: ( ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )? )*
+            loop135:
             do {
-                int alt128=2;
-                int LA128_0 = input.LA(1);
+                int alt135=2;
+                int LA135_0 = input.LA(1);
 
-                if ( ((LA128_0>=RULE_STRING && LA128_0<=RULE_DECIMAL)||LA128_0==14||LA128_0==50||LA128_0==72||(LA128_0>=75 && LA128_0<=76)||LA128_0==81||(LA128_0>=85 && LA128_0<=86)||LA128_0==93||(LA128_0>=109 && LA128_0<=110)||LA128_0==114||LA128_0==120||LA128_0==122||(LA128_0>=126 && LA128_0<=139)||LA128_0==141) ) {
-                    alt128=1;
+                if ( ((LA135_0>=RULE_STRING && LA135_0<=RULE_DECIMAL)||LA135_0==14||LA135_0==52||LA135_0==75||(LA135_0>=88 && LA135_0<=89)||LA135_0==94||(LA135_0>=98 && LA135_0<=99)||LA135_0==106||(LA135_0>=122 && LA135_0<=123)||LA135_0==127||LA135_0==133||LA135_0==135||(LA135_0>=139 && LA135_0<=152)||LA135_0==154) ) {
+                    alt135=1;
                 }
 
 
-                switch (alt128) {
+                switch (alt135) {
             	case 1 :
-            	    // InternalDataDSL.g:7254:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
+            	    // InternalDataDSL.g:7875:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) ) (otherlv_3= ';' )?
             	    {
-            	    // InternalDataDSL.g:7254:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
-            	    // InternalDataDSL.g:7255:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalDataDSL.g:7875:4: ( (lv_expressions_2_0= ruleXExpressionOrVarDeclaration ) )
+            	    // InternalDataDSL.g:7876:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
             	    {
-            	    // InternalDataDSL.g:7255:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
-            	    // InternalDataDSL.g:7256:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
+            	    // InternalDataDSL.g:7876:5: (lv_expressions_2_0= ruleXExpressionOrVarDeclaration )
+            	    // InternalDataDSL.g:7877:6: lv_expressions_2_0= ruleXExpressionOrVarDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      						newCompositeNode(grammarAccess.getXBlockExpressionAccess().getExpressionsXExpressionOrVarDeclarationParserRuleCall_2_0_0());
             	      					
             	    }
-            	    pushFollow(FOLLOW_130);
+            	    pushFollow(FOLLOW_136);
             	    lv_expressions_2_0=ruleXExpressionOrVarDeclaration();
 
             	    state._fsp--;
@@ -19738,18 +21449,18 @@
 
             	    }
 
-            	    // InternalDataDSL.g:7273:4: (otherlv_3= ';' )?
-            	    int alt127=2;
-            	    int LA127_0 = input.LA(1);
+            	    // InternalDataDSL.g:7894:4: (otherlv_3= ';' )?
+            	    int alt134=2;
+            	    int LA134_0 = input.LA(1);
 
-            	    if ( (LA127_0==79) ) {
-            	        alt127=1;
+            	    if ( (LA134_0==92) ) {
+            	        alt134=1;
             	    }
-            	    switch (alt127) {
+            	    switch (alt134) {
             	        case 1 :
-            	            // InternalDataDSL.g:7274:5: otherlv_3= ';'
+            	            // InternalDataDSL.g:7895:5: otherlv_3= ';'
             	            {
-            	            otherlv_3=(Token)match(input,79,FOLLOW_129); if (state.failed) return current;
+            	            otherlv_3=(Token)match(input,92,FOLLOW_135); if (state.failed) return current;
             	            if ( state.backtracking==0 ) {
 
             	              					newLeafNode(otherlv_3, grammarAccess.getXBlockExpressionAccess().getSemicolonKeyword_2_1());
@@ -19766,7 +21477,7 @@
             	    break;
 
             	default :
-            	    break loop128;
+            	    break loop135;
                 }
             } while (true);
 
@@ -19801,7 +21512,7 @@
 
 
     // $ANTLR start "entryRuleXExpressionOrVarDeclaration"
-    // InternalDataDSL.g:7288:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
+    // InternalDataDSL.g:7909:1: entryRuleXExpressionOrVarDeclaration returns [EObject current=null] : iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF ;
     public final EObject entryRuleXExpressionOrVarDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -19809,8 +21520,8 @@
 
 
         try {
-            // InternalDataDSL.g:7288:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
-            // InternalDataDSL.g:7289:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
+            // InternalDataDSL.g:7909:68: (iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF )
+            // InternalDataDSL.g:7910:2: iv_ruleXExpressionOrVarDeclaration= ruleXExpressionOrVarDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXExpressionOrVarDeclarationRule()); 
@@ -19841,7 +21552,7 @@
 
 
     // $ANTLR start "ruleXExpressionOrVarDeclaration"
-    // InternalDataDSL.g:7295:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
+    // InternalDataDSL.g:7916:1: ruleXExpressionOrVarDeclaration returns [EObject current=null] : (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) ;
     public final EObject ruleXExpressionOrVarDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -19854,29 +21565,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7301:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
-            // InternalDataDSL.g:7302:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            // InternalDataDSL.g:7922:2: ( (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression ) )
+            // InternalDataDSL.g:7923:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
             {
-            // InternalDataDSL.g:7302:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
-            int alt129=2;
-            int LA129_0 = input.LA(1);
+            // InternalDataDSL.g:7923:2: (this_XVariableDeclaration_0= ruleXVariableDeclaration | this_XExpression_1= ruleXExpression )
+            int alt136=2;
+            int LA136_0 = input.LA(1);
 
-            if ( ((LA129_0>=128 && LA129_0<=129)) ) {
-                alt129=1;
+            if ( ((LA136_0>=141 && LA136_0<=142)) ) {
+                alt136=1;
             }
-            else if ( ((LA129_0>=RULE_STRING && LA129_0<=RULE_DECIMAL)||LA129_0==14||LA129_0==50||LA129_0==72||(LA129_0>=75 && LA129_0<=76)||LA129_0==81||(LA129_0>=85 && LA129_0<=86)||LA129_0==93||(LA129_0>=109 && LA129_0<=110)||LA129_0==114||LA129_0==120||LA129_0==122||(LA129_0>=126 && LA129_0<=127)||(LA129_0>=130 && LA129_0<=139)||LA129_0==141) ) {
-                alt129=2;
+            else if ( ((LA136_0>=RULE_STRING && LA136_0<=RULE_DECIMAL)||LA136_0==14||LA136_0==52||LA136_0==75||(LA136_0>=88 && LA136_0<=89)||LA136_0==94||(LA136_0>=98 && LA136_0<=99)||LA136_0==106||(LA136_0>=122 && LA136_0<=123)||LA136_0==127||LA136_0==133||LA136_0==135||(LA136_0>=139 && LA136_0<=140)||(LA136_0>=143 && LA136_0<=152)||LA136_0==154) ) {
+                alt136=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 129, 0, input);
+                    new NoViableAltException("", 136, 0, input);
 
                 throw nvae;
             }
-            switch (alt129) {
+            switch (alt136) {
                 case 1 :
-                    // InternalDataDSL.g:7303:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
+                    // InternalDataDSL.g:7924:3: this_XVariableDeclaration_0= ruleXVariableDeclaration
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19898,7 +21609,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:7312:3: this_XExpression_1= ruleXExpression
+                    // InternalDataDSL.g:7933:3: this_XExpression_1= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -19944,7 +21655,7 @@
 
 
     // $ANTLR start "entryRuleXVariableDeclaration"
-    // InternalDataDSL.g:7324:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
+    // InternalDataDSL.g:7945:1: entryRuleXVariableDeclaration returns [EObject current=null] : iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF ;
     public final EObject entryRuleXVariableDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -19952,8 +21663,8 @@
 
 
         try {
-            // InternalDataDSL.g:7324:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
-            // InternalDataDSL.g:7325:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
+            // InternalDataDSL.g:7945:61: (iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF )
+            // InternalDataDSL.g:7946:2: iv_ruleXVariableDeclaration= ruleXVariableDeclaration EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXVariableDeclarationRule()); 
@@ -19984,7 +21695,7 @@
 
 
     // $ANTLR start "ruleXVariableDeclaration"
-    // InternalDataDSL.g:7331:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
+    // InternalDataDSL.g:7952:1: ruleXVariableDeclaration returns [EObject current=null] : ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) ;
     public final EObject ruleXVariableDeclaration() throws RecognitionException {
         EObject current = null;
 
@@ -20004,14 +21715,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7337:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
-            // InternalDataDSL.g:7338:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            // InternalDataDSL.g:7958:2: ( ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? ) )
+            // InternalDataDSL.g:7959:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
             {
-            // InternalDataDSL.g:7338:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
-            // InternalDataDSL.g:7339:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            // InternalDataDSL.g:7959:2: ( () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )? )
+            // InternalDataDSL.g:7960:3: () ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' ) ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) ) (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
             {
-            // InternalDataDSL.g:7339:3: ()
-            // InternalDataDSL.g:7340:4: 
+            // InternalDataDSL.g:7960:3: ()
+            // InternalDataDSL.g:7961:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20023,34 +21734,34 @@
 
             }
 
-            // InternalDataDSL.g:7346:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
-            int alt130=2;
-            int LA130_0 = input.LA(1);
+            // InternalDataDSL.g:7967:3: ( ( (lv_writeable_1_0= 'var' ) ) | otherlv_2= 'val' )
+            int alt137=2;
+            int LA137_0 = input.LA(1);
 
-            if ( (LA130_0==128) ) {
-                alt130=1;
+            if ( (LA137_0==141) ) {
+                alt137=1;
             }
-            else if ( (LA130_0==129) ) {
-                alt130=2;
+            else if ( (LA137_0==142) ) {
+                alt137=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 130, 0, input);
+                    new NoViableAltException("", 137, 0, input);
 
                 throw nvae;
             }
-            switch (alt130) {
+            switch (alt137) {
                 case 1 :
-                    // InternalDataDSL.g:7347:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalDataDSL.g:7968:4: ( (lv_writeable_1_0= 'var' ) )
                     {
-                    // InternalDataDSL.g:7347:4: ( (lv_writeable_1_0= 'var' ) )
-                    // InternalDataDSL.g:7348:5: (lv_writeable_1_0= 'var' )
+                    // InternalDataDSL.g:7968:4: ( (lv_writeable_1_0= 'var' ) )
+                    // InternalDataDSL.g:7969:5: (lv_writeable_1_0= 'var' )
                     {
-                    // InternalDataDSL.g:7348:5: (lv_writeable_1_0= 'var' )
-                    // InternalDataDSL.g:7349:6: lv_writeable_1_0= 'var'
+                    // InternalDataDSL.g:7969:5: (lv_writeable_1_0= 'var' )
+                    // InternalDataDSL.g:7970:6: lv_writeable_1_0= 'var'
                     {
-                    lv_writeable_1_0=(Token)match(input,128,FOLLOW_91); if (state.failed) return current;
+                    lv_writeable_1_0=(Token)match(input,141,FOLLOW_97); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_writeable_1_0, grammarAccess.getXVariableDeclarationAccess().getWriteableVarKeyword_1_0_0());
@@ -20074,9 +21785,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:7362:4: otherlv_2= 'val'
+                    // InternalDataDSL.g:7983:4: otherlv_2= 'val'
                     {
-                    otherlv_2=(Token)match(input,129,FOLLOW_91); if (state.failed) return current;
+                    otherlv_2=(Token)match(input,142,FOLLOW_97); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_2, grammarAccess.getXVariableDeclarationAccess().getValKeyword_1_1());
@@ -20088,55 +21799,55 @@
 
             }
 
-            // InternalDataDSL.g:7367:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
-            int alt131=2;
-            int LA131_0 = input.LA(1);
+            // InternalDataDSL.g:7988:3: ( ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) ) | ( (lv_name_5_0= ruleValidID ) ) )
+            int alt138=2;
+            int LA138_0 = input.LA(1);
 
-            if ( (LA131_0==RULE_ID) ) {
-                int LA131_1 = input.LA(2);
+            if ( (LA138_0==RULE_ID) ) {
+                int LA138_1 = input.LA(2);
 
                 if ( (synpred35_InternalDataDSL()) ) {
-                    alt131=1;
+                    alt138=1;
                 }
                 else if ( (true) ) {
-                    alt131=2;
+                    alt138=2;
                 }
                 else {
                     if (state.backtracking>0) {state.failed=true; return current;}
                     NoViableAltException nvae =
-                        new NoViableAltException("", 131, 1, input);
+                        new NoViableAltException("", 138, 1, input);
 
                     throw nvae;
                 }
             }
-            else if ( (LA131_0==81) && (synpred35_InternalDataDSL())) {
-                alt131=1;
+            else if ( (LA138_0==94) && (synpred35_InternalDataDSL())) {
+                alt138=1;
             }
-            else if ( (LA131_0==106) && (synpred35_InternalDataDSL())) {
-                alt131=1;
+            else if ( (LA138_0==119) && (synpred35_InternalDataDSL())) {
+                alt138=1;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 131, 0, input);
+                    new NoViableAltException("", 138, 0, input);
 
                 throw nvae;
             }
-            switch (alt131) {
+            switch (alt138) {
                 case 1 :
-                    // InternalDataDSL.g:7368:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalDataDSL.g:7989:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
                     {
-                    // InternalDataDSL.g:7368:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
-                    // InternalDataDSL.g:7369:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalDataDSL.g:7989:4: ( ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) ) )
+                    // InternalDataDSL.g:7990:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )=> ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
                     {
-                    // InternalDataDSL.g:7382:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
-                    // InternalDataDSL.g:7383:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
+                    // InternalDataDSL.g:8003:5: ( ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) ) )
+                    // InternalDataDSL.g:8004:6: ( (lv_type_3_0= ruleJvmTypeReference ) ) ( (lv_name_4_0= ruleValidID ) )
                     {
-                    // InternalDataDSL.g:7383:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
-                    // InternalDataDSL.g:7384:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:8004:6: ( (lv_type_3_0= ruleJvmTypeReference ) )
+                    // InternalDataDSL.g:8005:7: (lv_type_3_0= ruleJvmTypeReference )
                     {
-                    // InternalDataDSL.g:7384:7: (lv_type_3_0= ruleJvmTypeReference )
-                    // InternalDataDSL.g:7385:8: lv_type_3_0= ruleJvmTypeReference
+                    // InternalDataDSL.g:8005:7: (lv_type_3_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:8006:8: lv_type_3_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20167,18 +21878,18 @@
 
                     }
 
-                    // InternalDataDSL.g:7402:6: ( (lv_name_4_0= ruleValidID ) )
-                    // InternalDataDSL.g:7403:7: (lv_name_4_0= ruleValidID )
+                    // InternalDataDSL.g:8023:6: ( (lv_name_4_0= ruleValidID ) )
+                    // InternalDataDSL.g:8024:7: (lv_name_4_0= ruleValidID )
                     {
-                    // InternalDataDSL.g:7403:7: (lv_name_4_0= ruleValidID )
-                    // InternalDataDSL.g:7404:8: lv_name_4_0= ruleValidID
+                    // InternalDataDSL.g:8024:7: (lv_name_4_0= ruleValidID )
+                    // InternalDataDSL.g:8025:8: lv_name_4_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
                       								newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_0_0_1_0());
                       							
                     }
-                    pushFollow(FOLLOW_131);
+                    pushFollow(FOLLOW_137);
                     lv_name_4_0=ruleValidID();
 
                     state._fsp--;
@@ -20212,20 +21923,20 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:7424:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalDataDSL.g:8045:4: ( (lv_name_5_0= ruleValidID ) )
                     {
-                    // InternalDataDSL.g:7424:4: ( (lv_name_5_0= ruleValidID ) )
-                    // InternalDataDSL.g:7425:5: (lv_name_5_0= ruleValidID )
+                    // InternalDataDSL.g:8045:4: ( (lv_name_5_0= ruleValidID ) )
+                    // InternalDataDSL.g:8046:5: (lv_name_5_0= ruleValidID )
                     {
-                    // InternalDataDSL.g:7425:5: (lv_name_5_0= ruleValidID )
-                    // InternalDataDSL.g:7426:6: lv_name_5_0= ruleValidID
+                    // InternalDataDSL.g:8046:5: (lv_name_5_0= ruleValidID )
+                    // InternalDataDSL.g:8047:6: lv_name_5_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXVariableDeclarationAccess().getNameValidIDParserRuleCall_2_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_131);
+                    pushFollow(FOLLOW_137);
                     lv_name_5_0=ruleValidID();
 
                     state._fsp--;
@@ -20255,28 +21966,28 @@
 
             }
 
-            // InternalDataDSL.g:7444:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
-            int alt132=2;
-            int LA132_0 = input.LA(1);
+            // InternalDataDSL.g:8065:3: (otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) ) )?
+            int alt139=2;
+            int LA139_0 = input.LA(1);
 
-            if ( (LA132_0==84) ) {
-                alt132=1;
+            if ( (LA139_0==97) ) {
+                alt139=1;
             }
-            switch (alt132) {
+            switch (alt139) {
                 case 1 :
-                    // InternalDataDSL.g:7445:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:8066:4: otherlv_6= '=' ( (lv_right_7_0= ruleXExpression ) )
                     {
-                    otherlv_6=(Token)match(input,84,FOLLOW_78); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,97,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_6, grammarAccess.getXVariableDeclarationAccess().getEqualsSignKeyword_3_0());
                       			
                     }
-                    // InternalDataDSL.g:7449:4: ( (lv_right_7_0= ruleXExpression ) )
-                    // InternalDataDSL.g:7450:5: (lv_right_7_0= ruleXExpression )
+                    // InternalDataDSL.g:8070:4: ( (lv_right_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:8071:5: (lv_right_7_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:7450:5: (lv_right_7_0= ruleXExpression )
-                    // InternalDataDSL.g:7451:6: lv_right_7_0= ruleXExpression
+                    // InternalDataDSL.g:8071:5: (lv_right_7_0= ruleXExpression )
+                    // InternalDataDSL.g:8072:6: lv_right_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20338,7 +22049,7 @@
 
 
     // $ANTLR start "entryRuleJvmFormalParameter"
-    // InternalDataDSL.g:7473:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
+    // InternalDataDSL.g:8094:1: entryRuleJvmFormalParameter returns [EObject current=null] : iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF ;
     public final EObject entryRuleJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -20346,8 +22057,8 @@
 
 
         try {
-            // InternalDataDSL.g:7473:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
-            // InternalDataDSL.g:7474:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
+            // InternalDataDSL.g:8094:59: (iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF )
+            // InternalDataDSL.g:8095:2: iv_ruleJvmFormalParameter= ruleJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmFormalParameterRule()); 
@@ -20378,7 +22089,7 @@
 
 
     // $ANTLR start "ruleJvmFormalParameter"
-    // InternalDataDSL.g:7480:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
+    // InternalDataDSL.g:8101:1: ruleJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) ;
     public final EObject ruleJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -20391,32 +22102,32 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7486:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
-            // InternalDataDSL.g:7487:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalDataDSL.g:8107:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalDataDSL.g:8108:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
             {
-            // InternalDataDSL.g:7487:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
-            // InternalDataDSL.g:7488:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
+            // InternalDataDSL.g:8108:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalDataDSL.g:8109:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )? ( (lv_name_1_0= ruleValidID ) )
             {
-            // InternalDataDSL.g:7488:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
-            int alt133=2;
-            int LA133_0 = input.LA(1);
+            // InternalDataDSL.g:8109:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )?
+            int alt140=2;
+            int LA140_0 = input.LA(1);
 
-            if ( (LA133_0==RULE_ID) ) {
-                int LA133_1 = input.LA(2);
+            if ( (LA140_0==RULE_ID) ) {
+                int LA140_1 = input.LA(2);
 
-                if ( (LA133_1==RULE_ID||LA133_1==74||LA133_1==86||LA133_1==93) ) {
-                    alt133=1;
+                if ( (LA140_1==RULE_ID||LA140_1==87||LA140_1==99||LA140_1==106) ) {
+                    alt140=1;
                 }
             }
-            else if ( (LA133_0==81||LA133_0==106) ) {
-                alt133=1;
+            else if ( (LA140_0==94||LA140_0==119) ) {
+                alt140=1;
             }
-            switch (alt133) {
+            switch (alt140) {
                 case 1 :
-                    // InternalDataDSL.g:7489:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:8110:4: (lv_parameterType_0_0= ruleJvmTypeReference )
                     {
-                    // InternalDataDSL.g:7489:4: (lv_parameterType_0_0= ruleJvmTypeReference )
-                    // InternalDataDSL.g:7490:5: lv_parameterType_0_0= ruleJvmTypeReference
+                    // InternalDataDSL.g:8110:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+                    // InternalDataDSL.g:8111:5: lv_parameterType_0_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -20450,11 +22161,11 @@
 
             }
 
-            // InternalDataDSL.g:7507:3: ( (lv_name_1_0= ruleValidID ) )
-            // InternalDataDSL.g:7508:4: (lv_name_1_0= ruleValidID )
+            // InternalDataDSL.g:8128:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalDataDSL.g:8129:4: (lv_name_1_0= ruleValidID )
             {
-            // InternalDataDSL.g:7508:4: (lv_name_1_0= ruleValidID )
-            // InternalDataDSL.g:7509:5: lv_name_1_0= ruleValidID
+            // InternalDataDSL.g:8129:4: (lv_name_1_0= ruleValidID )
+            // InternalDataDSL.g:8130:5: lv_name_1_0= ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -20510,7 +22221,7 @@
 
 
     // $ANTLR start "entryRuleFullJvmFormalParameter"
-    // InternalDataDSL.g:7530:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
+    // InternalDataDSL.g:8151:1: entryRuleFullJvmFormalParameter returns [EObject current=null] : iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF ;
     public final EObject entryRuleFullJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -20518,8 +22229,8 @@
 
 
         try {
-            // InternalDataDSL.g:7530:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
-            // InternalDataDSL.g:7531:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
+            // InternalDataDSL.g:8151:63: (iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF )
+            // InternalDataDSL.g:8152:2: iv_ruleFullJvmFormalParameter= ruleFullJvmFormalParameter EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFullJvmFormalParameterRule()); 
@@ -20550,7 +22261,7 @@
 
 
     // $ANTLR start "ruleFullJvmFormalParameter"
-    // InternalDataDSL.g:7537:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
+    // InternalDataDSL.g:8158:1: ruleFullJvmFormalParameter returns [EObject current=null] : ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) ;
     public final EObject ruleFullJvmFormalParameter() throws RecognitionException {
         EObject current = null;
 
@@ -20563,17 +22274,17 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7543:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
-            // InternalDataDSL.g:7544:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalDataDSL.g:8164:2: ( ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) ) )
+            // InternalDataDSL.g:8165:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
             {
-            // InternalDataDSL.g:7544:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
-            // InternalDataDSL.g:7545:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
+            // InternalDataDSL.g:8165:2: ( ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) ) )
+            // InternalDataDSL.g:8166:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) ) ( (lv_name_1_0= ruleValidID ) )
             {
-            // InternalDataDSL.g:7545:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:7546:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:8166:3: ( (lv_parameterType_0_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:8167:4: (lv_parameterType_0_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:7546:4: (lv_parameterType_0_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:7547:5: lv_parameterType_0_0= ruleJvmTypeReference
+            // InternalDataDSL.g:8167:4: (lv_parameterType_0_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:8168:5: lv_parameterType_0_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -20604,11 +22315,11 @@
 
             }
 
-            // InternalDataDSL.g:7564:3: ( (lv_name_1_0= ruleValidID ) )
-            // InternalDataDSL.g:7565:4: (lv_name_1_0= ruleValidID )
+            // InternalDataDSL.g:8185:3: ( (lv_name_1_0= ruleValidID ) )
+            // InternalDataDSL.g:8186:4: (lv_name_1_0= ruleValidID )
             {
-            // InternalDataDSL.g:7565:4: (lv_name_1_0= ruleValidID )
-            // InternalDataDSL.g:7566:5: lv_name_1_0= ruleValidID
+            // InternalDataDSL.g:8186:4: (lv_name_1_0= ruleValidID )
+            // InternalDataDSL.g:8187:5: lv_name_1_0= ruleValidID
             {
             if ( state.backtracking==0 ) {
 
@@ -20664,7 +22375,7 @@
 
 
     // $ANTLR start "entryRuleXFeatureCall"
-    // InternalDataDSL.g:7587:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
+    // InternalDataDSL.g:8208:1: entryRuleXFeatureCall returns [EObject current=null] : iv_ruleXFeatureCall= ruleXFeatureCall EOF ;
     public final EObject entryRuleXFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -20672,8 +22383,8 @@
 
 
         try {
-            // InternalDataDSL.g:7587:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
-            // InternalDataDSL.g:7588:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
+            // InternalDataDSL.g:8208:53: (iv_ruleXFeatureCall= ruleXFeatureCall EOF )
+            // InternalDataDSL.g:8209:2: iv_ruleXFeatureCall= ruleXFeatureCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXFeatureCallRule()); 
@@ -20704,7 +22415,7 @@
 
 
     // $ANTLR start "ruleXFeatureCall"
-    // InternalDataDSL.g:7594:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
+    // InternalDataDSL.g:8215:1: ruleXFeatureCall returns [EObject current=null] : ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) ;
     public final EObject ruleXFeatureCall() throws RecognitionException {
         EObject current = null;
 
@@ -20731,14 +22442,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7600:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
-            // InternalDataDSL.g:7601:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            // InternalDataDSL.g:8221:2: ( ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? ) )
+            // InternalDataDSL.g:8222:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
             {
-            // InternalDataDSL.g:7601:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
-            // InternalDataDSL.g:7602:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            // InternalDataDSL.g:8222:2: ( () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )? )
+            // InternalDataDSL.g:8223:3: () (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )? ( ( ruleIdOrSuper ) ) ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )? ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
             {
-            // InternalDataDSL.g:7602:3: ()
-            // InternalDataDSL.g:7603:4: 
+            // InternalDataDSL.g:8223:3: ()
+            // InternalDataDSL.g:8224:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -20750,35 +22461,35 @@
 
             }
 
-            // InternalDataDSL.g:7609:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
-            int alt135=2;
-            int LA135_0 = input.LA(1);
+            // InternalDataDSL.g:8230:3: (otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' )?
+            int alt142=2;
+            int LA142_0 = input.LA(1);
 
-            if ( (LA135_0==93) ) {
-                alt135=1;
+            if ( (LA142_0==106) ) {
+                alt142=1;
             }
-            switch (alt135) {
+            switch (alt142) {
                 case 1 :
-                    // InternalDataDSL.g:7610:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
+                    // InternalDataDSL.g:8231:4: otherlv_1= '<' ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>'
                     {
-                    otherlv_1=(Token)match(input,93,FOLLOW_103); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,106,FOLLOW_109); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_1, grammarAccess.getXFeatureCallAccess().getLessThanSignKeyword_1_0());
                       			
                     }
-                    // InternalDataDSL.g:7614:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
-                    // InternalDataDSL.g:7615:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:8235:4: ( (lv_typeArguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalDataDSL.g:8236:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalDataDSL.g:7615:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
-                    // InternalDataDSL.g:7616:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
+                    // InternalDataDSL.g:8236:5: (lv_typeArguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:8237:6: lv_typeArguments_2_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_104);
+                    pushFollow(FOLLOW_110);
                     lv_typeArguments_2_0=ruleJvmArgumentTypeReference();
 
                     state._fsp--;
@@ -20802,39 +22513,39 @@
 
                     }
 
-                    // InternalDataDSL.g:7633:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
-                    loop134:
+                    // InternalDataDSL.g:8254:4: (otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop141:
                     do {
-                        int alt134=2;
-                        int LA134_0 = input.LA(1);
+                        int alt141=2;
+                        int LA141_0 = input.LA(1);
 
-                        if ( (LA134_0==82) ) {
-                            alt134=1;
+                        if ( (LA141_0==95) ) {
+                            alt141=1;
                         }
 
 
-                        switch (alt134) {
+                        switch (alt141) {
                     	case 1 :
-                    	    // InternalDataDSL.g:7634:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:8255:5: otherlv_3= ',' ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
                     	    {
-                    	    otherlv_3=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,95,FOLLOW_109); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_3, grammarAccess.getXFeatureCallAccess().getCommaKeyword_1_2_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:7638:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalDataDSL.g:7639:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:8259:5: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:8260:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalDataDSL.g:7639:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
-                    	    // InternalDataDSL.g:7640:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    	    // InternalDataDSL.g:8260:6: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:8261:7: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXFeatureCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_104);
+                    	    pushFollow(FOLLOW_110);
                     	    lv_typeArguments_4_0=ruleJvmArgumentTypeReference();
 
                     	    state._fsp--;
@@ -20863,11 +22574,11 @@
                     	    break;
 
                     	default :
-                    	    break loop134;
+                    	    break loop141;
                         }
                     } while (true);
 
-                    otherlv_5=(Token)match(input,94,FOLLOW_102); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,107,FOLLOW_108); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_5, grammarAccess.getXFeatureCallAccess().getGreaterThanSignKeyword_1_3());
@@ -20879,11 +22590,11 @@
 
             }
 
-            // InternalDataDSL.g:7663:3: ( ( ruleIdOrSuper ) )
-            // InternalDataDSL.g:7664:4: ( ruleIdOrSuper )
+            // InternalDataDSL.g:8284:3: ( ( ruleIdOrSuper ) )
+            // InternalDataDSL.g:8285:4: ( ruleIdOrSuper )
             {
-            // InternalDataDSL.g:7664:4: ( ruleIdOrSuper )
-            // InternalDataDSL.g:7665:5: ruleIdOrSuper
+            // InternalDataDSL.g:8285:4: ( ruleIdOrSuper )
+            // InternalDataDSL.g:8286:5: ruleIdOrSuper
             {
             if ( state.backtracking==0 ) {
 
@@ -20897,7 +22608,7 @@
               					newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureJvmIdentifiableElementCrossReference_2_0());
               				
             }
-            pushFollow(FOLLOW_132);
+            pushFollow(FOLLOW_138);
             ruleIdOrSuper();
 
             state._fsp--;
@@ -20913,20 +22624,20 @@
 
             }
 
-            // InternalDataDSL.g:7679:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
-            int alt138=2;
-            alt138 = dfa138.predict(input);
-            switch (alt138) {
+            // InternalDataDSL.g:8300:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?
+            int alt145=2;
+            alt145 = dfa145.predict(input);
+            switch (alt145) {
                 case 1 :
-                    // InternalDataDSL.g:7680:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
+                    // InternalDataDSL.g:8301:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')'
                     {
-                    // InternalDataDSL.g:7680:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
-                    // InternalDataDSL.g:7681:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
+                    // InternalDataDSL.g:8301:4: ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) )
+                    // InternalDataDSL.g:8302:5: ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' )
                     {
-                    // InternalDataDSL.g:7685:5: (lv_explicitOperationCall_7_0= '(' )
-                    // InternalDataDSL.g:7686:6: lv_explicitOperationCall_7_0= '('
+                    // InternalDataDSL.g:8306:5: (lv_explicitOperationCall_7_0= '(' )
+                    // InternalDataDSL.g:8307:6: lv_explicitOperationCall_7_0= '('
                     {
-                    lv_explicitOperationCall_7_0=(Token)match(input,81,FOLLOW_106); if (state.failed) return current;
+                    lv_explicitOperationCall_7_0=(Token)match(input,94,FOLLOW_112); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_explicitOperationCall_7_0, grammarAccess.getXFeatureCallAccess().getExplicitOperationCallLeftParenthesisKeyword_3_0_0());
@@ -20946,25 +22657,25 @@
 
                     }
 
-                    // InternalDataDSL.g:7698:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
-                    int alt137=3;
-                    alt137 = dfa137.predict(input);
-                    switch (alt137) {
+                    // InternalDataDSL.g:8319:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?
+                    int alt144=3;
+                    alt144 = dfa144.predict(input);
+                    switch (alt144) {
                         case 1 :
-                            // InternalDataDSL.g:7699:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalDataDSL.g:8320:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
                             {
-                            // InternalDataDSL.g:7699:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
-                            // InternalDataDSL.g:7700:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalDataDSL.g:8320:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) )
+                            // InternalDataDSL.g:8321:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure )
                             {
-                            // InternalDataDSL.g:7725:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
-                            // InternalDataDSL.g:7726:7: lv_featureCallArguments_8_0= ruleXShortClosure
+                            // InternalDataDSL.g:8346:6: (lv_featureCallArguments_8_0= ruleXShortClosure )
+                            // InternalDataDSL.g:8347:7: lv_featureCallArguments_8_0= ruleXShortClosure
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXShortClosureParserRuleCall_3_1_0_0());
                               						
                             }
-                            pushFollow(FOLLOW_76);
+                            pushFollow(FOLLOW_82);
                             lv_featureCallArguments_8_0=ruleXShortClosure();
 
                             state._fsp--;
@@ -20992,23 +22703,23 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:7744:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalDataDSL.g:8365:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
                             {
-                            // InternalDataDSL.g:7744:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
-                            // InternalDataDSL.g:7745:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            // InternalDataDSL.g:8365:5: ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* )
+                            // InternalDataDSL.g:8366:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
                             {
-                            // InternalDataDSL.g:7745:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
-                            // InternalDataDSL.g:7746:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalDataDSL.g:8366:6: ( (lv_featureCallArguments_9_0= ruleXExpression ) )
+                            // InternalDataDSL.g:8367:7: (lv_featureCallArguments_9_0= ruleXExpression )
                             {
-                            // InternalDataDSL.g:7746:7: (lv_featureCallArguments_9_0= ruleXExpression )
-                            // InternalDataDSL.g:7747:8: lv_featureCallArguments_9_0= ruleXExpression
+                            // InternalDataDSL.g:8367:7: (lv_featureCallArguments_9_0= ruleXExpression )
+                            // InternalDataDSL.g:8368:8: lv_featureCallArguments_9_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
                               								newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_0_0());
                               							
                             }
-                            pushFollow(FOLLOW_75);
+                            pushFollow(FOLLOW_81);
                             lv_featureCallArguments_9_0=ruleXExpression();
 
                             state._fsp--;
@@ -21032,39 +22743,39 @@
 
                             }
 
-                            // InternalDataDSL.g:7764:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
-                            loop136:
+                            // InternalDataDSL.g:8385:6: (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )*
+                            loop143:
                             do {
-                                int alt136=2;
-                                int LA136_0 = input.LA(1);
+                                int alt143=2;
+                                int LA143_0 = input.LA(1);
 
-                                if ( (LA136_0==82) ) {
-                                    alt136=1;
+                                if ( (LA143_0==95) ) {
+                                    alt143=1;
                                 }
 
 
-                                switch (alt136) {
+                                switch (alt143) {
                             	case 1 :
-                            	    // InternalDataDSL.g:7765:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalDataDSL.g:8386:7: otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) )
                             	    {
-                            	    otherlv_10=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                            	    otherlv_10=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      							newLeafNode(otherlv_10, grammarAccess.getXFeatureCallAccess().getCommaKeyword_3_1_1_1_0());
                             	      						
                             	    }
-                            	    // InternalDataDSL.g:7769:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
-                            	    // InternalDataDSL.g:7770:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalDataDSL.g:8390:7: ( (lv_featureCallArguments_11_0= ruleXExpression ) )
+                            	    // InternalDataDSL.g:8391:8: (lv_featureCallArguments_11_0= ruleXExpression )
                             	    {
-                            	    // InternalDataDSL.g:7770:8: (lv_featureCallArguments_11_0= ruleXExpression )
-                            	    // InternalDataDSL.g:7771:9: lv_featureCallArguments_11_0= ruleXExpression
+                            	    // InternalDataDSL.g:8391:8: (lv_featureCallArguments_11_0= ruleXExpression )
+                            	    // InternalDataDSL.g:8392:9: lv_featureCallArguments_11_0= ruleXExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      									newCompositeNode(grammarAccess.getXFeatureCallAccess().getFeatureCallArgumentsXExpressionParserRuleCall_3_1_1_1_1_0());
                             	      								
                             	    }
-                            	    pushFollow(FOLLOW_75);
+                            	    pushFollow(FOLLOW_81);
                             	    lv_featureCallArguments_11_0=ruleXExpression();
 
                             	    state._fsp--;
@@ -21093,7 +22804,7 @@
                             	    break;
 
                             	default :
-                            	    break loop136;
+                            	    break loop143;
                                 }
                             } while (true);
 
@@ -21106,7 +22817,7 @@
 
                     }
 
-                    otherlv_12=(Token)match(input,83,FOLLOW_133); if (state.failed) return current;
+                    otherlv_12=(Token)match(input,96,FOLLOW_139); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_12, grammarAccess.getXFeatureCallAccess().getRightParenthesisKeyword_3_2());
@@ -21118,15 +22829,15 @@
 
             }
 
-            // InternalDataDSL.g:7796:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
-            int alt139=2;
-            alt139 = dfa139.predict(input);
-            switch (alt139) {
+            // InternalDataDSL.g:8417:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?
+            int alt146=2;
+            alt146 = dfa146.predict(input);
+            switch (alt146) {
                 case 1 :
-                    // InternalDataDSL.g:7797:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalDataDSL.g:8418:4: ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure )
                     {
-                    // InternalDataDSL.g:7803:4: (lv_featureCallArguments_13_0= ruleXClosure )
-                    // InternalDataDSL.g:7804:5: lv_featureCallArguments_13_0= ruleXClosure
+                    // InternalDataDSL.g:8424:4: (lv_featureCallArguments_13_0= ruleXClosure )
+                    // InternalDataDSL.g:8425:5: lv_featureCallArguments_13_0= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -21185,7 +22896,7 @@
 
 
     // $ANTLR start "entryRuleFeatureCallID"
-    // InternalDataDSL.g:7825:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
+    // InternalDataDSL.g:8446:1: entryRuleFeatureCallID returns [String current=null] : iv_ruleFeatureCallID= ruleFeatureCallID EOF ;
     public final String entryRuleFeatureCallID() throws RecognitionException {
         String current = null;
 
@@ -21193,8 +22904,8 @@
 
 
         try {
-            // InternalDataDSL.g:7825:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
-            // InternalDataDSL.g:7826:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
+            // InternalDataDSL.g:8446:53: (iv_ruleFeatureCallID= ruleFeatureCallID EOF )
+            // InternalDataDSL.g:8447:2: iv_ruleFeatureCallID= ruleFeatureCallID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getFeatureCallIDRule()); 
@@ -21225,7 +22936,7 @@
 
 
     // $ANTLR start "ruleFeatureCallID"
-    // InternalDataDSL.g:7832:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
+    // InternalDataDSL.g:8453:1: ruleFeatureCallID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) ;
     public final AntlrDatatypeRuleToken ruleFeatureCallID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21237,48 +22948,48 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7838:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
-            // InternalDataDSL.g:7839:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            // InternalDataDSL.g:8459:2: ( (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' ) )
+            // InternalDataDSL.g:8460:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
             {
-            // InternalDataDSL.g:7839:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
-            int alt140=5;
+            // InternalDataDSL.g:8460:2: (this_ValidID_0= ruleValidID | kw= 'extends' | kw= 'static' | kw= 'import' | kw= 'extension' )
+            int alt147=5;
             switch ( input.LA(1) ) {
             case RULE_ID:
                 {
-                alt140=1;
+                alt147=1;
                 }
                 break;
-            case 130:
+            case 143:
                 {
-                alt140=2;
+                alt147=2;
                 }
                 break;
-            case 76:
+            case 89:
                 {
-                alt140=3;
+                alt147=3;
+                }
+                break;
+            case 88:
+                {
+                alt147=4;
                 }
                 break;
             case 75:
                 {
-                alt140=4;
-                }
-                break;
-            case 72:
-                {
-                alt140=5;
+                alt147=5;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 140, 0, input);
+                    new NoViableAltException("", 147, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt140) {
+            switch (alt147) {
                 case 1 :
-                    // InternalDataDSL.g:7840:3: this_ValidID_0= ruleValidID
+                    // InternalDataDSL.g:8461:3: this_ValidID_0= ruleValidID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -21304,9 +23015,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:7851:3: kw= 'extends'
+                    // InternalDataDSL.g:8472:3: kw= 'extends'
                     {
-                    kw=(Token)match(input,130,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,143,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -21317,9 +23028,9 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:7857:3: kw= 'static'
+                    // InternalDataDSL.g:8478:3: kw= 'static'
                     {
-                    kw=(Token)match(input,76,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,89,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -21330,9 +23041,9 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:7863:3: kw= 'import'
+                    // InternalDataDSL.g:8484:3: kw= 'import'
                     {
-                    kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,88,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -21343,9 +23054,9 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:7869:3: kw= 'extension'
+                    // InternalDataDSL.g:8490:3: kw= 'extension'
                     {
-                    kw=(Token)match(input,72,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,75,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -21380,7 +23091,7 @@
 
 
     // $ANTLR start "entryRuleIdOrSuper"
-    // InternalDataDSL.g:7878:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
+    // InternalDataDSL.g:8499:1: entryRuleIdOrSuper returns [String current=null] : iv_ruleIdOrSuper= ruleIdOrSuper EOF ;
     public final String entryRuleIdOrSuper() throws RecognitionException {
         String current = null;
 
@@ -21388,8 +23099,8 @@
 
 
         try {
-            // InternalDataDSL.g:7878:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
-            // InternalDataDSL.g:7879:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
+            // InternalDataDSL.g:8499:49: (iv_ruleIdOrSuper= ruleIdOrSuper EOF )
+            // InternalDataDSL.g:8500:2: iv_ruleIdOrSuper= ruleIdOrSuper EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getIdOrSuperRule()); 
@@ -21420,7 +23131,7 @@
 
 
     // $ANTLR start "ruleIdOrSuper"
-    // InternalDataDSL.g:7885:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
+    // InternalDataDSL.g:8506:1: ruleIdOrSuper returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) ;
     public final AntlrDatatypeRuleToken ruleIdOrSuper() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -21432,29 +23143,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7891:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
-            // InternalDataDSL.g:7892:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            // InternalDataDSL.g:8512:2: ( (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' ) )
+            // InternalDataDSL.g:8513:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
             {
-            // InternalDataDSL.g:7892:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
-            int alt141=2;
-            int LA141_0 = input.LA(1);
+            // InternalDataDSL.g:8513:2: (this_FeatureCallID_0= ruleFeatureCallID | kw= 'super' )
+            int alt148=2;
+            int LA148_0 = input.LA(1);
 
-            if ( (LA141_0==RULE_ID||LA141_0==72||(LA141_0>=75 && LA141_0<=76)||LA141_0==130) ) {
-                alt141=1;
+            if ( (LA148_0==RULE_ID||LA148_0==75||(LA148_0>=88 && LA148_0<=89)||LA148_0==143) ) {
+                alt148=1;
             }
-            else if ( (LA141_0==131) ) {
-                alt141=2;
+            else if ( (LA148_0==144) ) {
+                alt148=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 141, 0, input);
+                    new NoViableAltException("", 148, 0, input);
 
                 throw nvae;
             }
-            switch (alt141) {
+            switch (alt148) {
                 case 1 :
-                    // InternalDataDSL.g:7893:3: this_FeatureCallID_0= ruleFeatureCallID
+                    // InternalDataDSL.g:8514:3: this_FeatureCallID_0= ruleFeatureCallID
                     {
                     if ( state.backtracking==0 ) {
 
@@ -21480,9 +23191,9 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:7904:3: kw= 'super'
+                    // InternalDataDSL.g:8525:3: kw= 'super'
                     {
-                    kw=(Token)match(input,131,FOLLOW_2); if (state.failed) return current;
+                    kw=(Token)match(input,144,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       			current.merge(kw);
@@ -21517,7 +23228,7 @@
 
 
     // $ANTLR start "entryRuleXConstructorCall"
-    // InternalDataDSL.g:7913:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
+    // InternalDataDSL.g:8534:1: entryRuleXConstructorCall returns [EObject current=null] : iv_ruleXConstructorCall= ruleXConstructorCall EOF ;
     public final EObject entryRuleXConstructorCall() throws RecognitionException {
         EObject current = null;
 
@@ -21525,8 +23236,8 @@
 
 
         try {
-            // InternalDataDSL.g:7913:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
-            // InternalDataDSL.g:7914:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
+            // InternalDataDSL.g:8534:57: (iv_ruleXConstructorCall= ruleXConstructorCall EOF )
+            // InternalDataDSL.g:8535:2: iv_ruleXConstructorCall= ruleXConstructorCall EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXConstructorCallRule()); 
@@ -21557,7 +23268,7 @@
 
 
     // $ANTLR start "ruleXConstructorCall"
-    // InternalDataDSL.g:7920:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
+    // InternalDataDSL.g:8541:1: ruleXConstructorCall returns [EObject current=null] : ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) ;
     public final EObject ruleXConstructorCall() throws RecognitionException {
         EObject current = null;
 
@@ -21585,14 +23296,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:7926:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
-            // InternalDataDSL.g:7927:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            // InternalDataDSL.g:8547:2: ( ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? ) )
+            // InternalDataDSL.g:8548:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
             {
-            // InternalDataDSL.g:7927:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
-            // InternalDataDSL.g:7928:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            // InternalDataDSL.g:8548:2: ( () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )? )
+            // InternalDataDSL.g:8549:3: () otherlv_1= 'new' ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )? ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )? ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
             {
-            // InternalDataDSL.g:7928:3: ()
-            // InternalDataDSL.g:7929:4: 
+            // InternalDataDSL.g:8549:3: ()
+            // InternalDataDSL.g:8550:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -21604,17 +23315,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,132,FOLLOW_4); if (state.failed) return current;
+            otherlv_1=(Token)match(input,145,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXConstructorCallAccess().getNewKeyword_1());
               		
             }
-            // InternalDataDSL.g:7939:3: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:7940:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:8560:3: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:8561:4: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:7940:4: ( ruleQualifiedName )
-            // InternalDataDSL.g:7941:5: ruleQualifiedName
+            // InternalDataDSL.g:8561:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:8562:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -21628,7 +23339,7 @@
               					newCompositeNode(grammarAccess.getXConstructorCallAccess().getConstructorJvmConstructorCrossReference_2_0());
               				
             }
-            pushFollow(FOLLOW_134);
+            pushFollow(FOLLOW_140);
             ruleQualifiedName();
 
             state._fsp--;
@@ -21644,17 +23355,17 @@
 
             }
 
-            // InternalDataDSL.g:7955:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
-            int alt143=2;
-            alt143 = dfa143.predict(input);
-            switch (alt143) {
+            // InternalDataDSL.g:8576:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?
+            int alt150=2;
+            alt150 = dfa150.predict(input);
+            switch (alt150) {
                 case 1 :
-                    // InternalDataDSL.g:7956:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
+                    // InternalDataDSL.g:8577:4: ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>'
                     {
-                    // InternalDataDSL.g:7956:4: ( ( '<' )=>otherlv_3= '<' )
-                    // InternalDataDSL.g:7957:5: ( '<' )=>otherlv_3= '<'
+                    // InternalDataDSL.g:8577:4: ( ( '<' )=>otherlv_3= '<' )
+                    // InternalDataDSL.g:8578:5: ( '<' )=>otherlv_3= '<'
                     {
-                    otherlv_3=(Token)match(input,93,FOLLOW_103); if (state.failed) return current;
+                    otherlv_3=(Token)match(input,106,FOLLOW_109); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_3, grammarAccess.getXConstructorCallAccess().getLessThanSignKeyword_3_0());
@@ -21663,18 +23374,18 @@
 
                     }
 
-                    // InternalDataDSL.g:7963:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
-                    // InternalDataDSL.g:7964:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:8584:4: ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) )
+                    // InternalDataDSL.g:8585:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalDataDSL.g:7964:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
-                    // InternalDataDSL.g:7965:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
+                    // InternalDataDSL.g:8585:5: (lv_typeArguments_4_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:8586:6: lv_typeArguments_4_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_104);
+                    pushFollow(FOLLOW_110);
                     lv_typeArguments_4_0=ruleJvmArgumentTypeReference();
 
                     state._fsp--;
@@ -21698,39 +23409,39 @@
 
                     }
 
-                    // InternalDataDSL.g:7982:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
-                    loop142:
+                    // InternalDataDSL.g:8603:4: (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop149:
                     do {
-                        int alt142=2;
-                        int LA142_0 = input.LA(1);
+                        int alt149=2;
+                        int LA149_0 = input.LA(1);
 
-                        if ( (LA142_0==82) ) {
-                            alt142=1;
+                        if ( (LA149_0==95) ) {
+                            alt149=1;
                         }
 
 
-                        switch (alt142) {
+                        switch (alt149) {
                     	case 1 :
-                    	    // InternalDataDSL.g:7983:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:8604:5: otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
                     	    {
-                    	    otherlv_5=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
+                    	    otherlv_5=(Token)match(input,95,FOLLOW_109); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_5, grammarAccess.getXConstructorCallAccess().getCommaKeyword_3_2_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:7987:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalDataDSL.g:7988:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:8608:5: ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:8609:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalDataDSL.g:7988:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
-                    	    // InternalDataDSL.g:7989:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
+                    	    // InternalDataDSL.g:8609:6: (lv_typeArguments_6_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:8610:7: lv_typeArguments_6_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXConstructorCallAccess().getTypeArgumentsJvmArgumentTypeReferenceParserRuleCall_3_2_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_104);
+                    	    pushFollow(FOLLOW_110);
                     	    lv_typeArguments_6_0=ruleJvmArgumentTypeReference();
 
                     	    state._fsp--;
@@ -21759,11 +23470,11 @@
                     	    break;
 
                     	default :
-                    	    break loop142;
+                    	    break loop149;
                         }
                     } while (true);
 
-                    otherlv_7=(Token)match(input,94,FOLLOW_132); if (state.failed) return current;
+                    otherlv_7=(Token)match(input,107,FOLLOW_138); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_7, grammarAccess.getXConstructorCallAccess().getGreaterThanSignKeyword_3_3());
@@ -21775,20 +23486,20 @@
 
             }
 
-            // InternalDataDSL.g:8012:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
-            int alt146=2;
-            alt146 = dfa146.predict(input);
-            switch (alt146) {
+            // InternalDataDSL.g:8633:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?
+            int alt153=2;
+            alt153 = dfa153.predict(input);
+            switch (alt153) {
                 case 1 :
-                    // InternalDataDSL.g:8013:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
+                    // InternalDataDSL.g:8634:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')'
                     {
-                    // InternalDataDSL.g:8013:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
-                    // InternalDataDSL.g:8014:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalDataDSL.g:8634:4: ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) )
+                    // InternalDataDSL.g:8635:5: ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' )
                     {
-                    // InternalDataDSL.g:8018:5: (lv_explicitConstructorCall_8_0= '(' )
-                    // InternalDataDSL.g:8019:6: lv_explicitConstructorCall_8_0= '('
+                    // InternalDataDSL.g:8639:5: (lv_explicitConstructorCall_8_0= '(' )
+                    // InternalDataDSL.g:8640:6: lv_explicitConstructorCall_8_0= '('
                     {
-                    lv_explicitConstructorCall_8_0=(Token)match(input,81,FOLLOW_106); if (state.failed) return current;
+                    lv_explicitConstructorCall_8_0=(Token)match(input,94,FOLLOW_112); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_explicitConstructorCall_8_0, grammarAccess.getXConstructorCallAccess().getExplicitConstructorCallLeftParenthesisKeyword_4_0_0());
@@ -21808,25 +23519,25 @@
 
                     }
 
-                    // InternalDataDSL.g:8031:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
-                    int alt145=3;
-                    alt145 = dfa145.predict(input);
-                    switch (alt145) {
+                    // InternalDataDSL.g:8652:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?
+                    int alt152=3;
+                    alt152 = dfa152.predict(input);
+                    switch (alt152) {
                         case 1 :
-                            // InternalDataDSL.g:8032:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalDataDSL.g:8653:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
                             {
-                            // InternalDataDSL.g:8032:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
-                            // InternalDataDSL.g:8033:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalDataDSL.g:8653:5: ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) )
+                            // InternalDataDSL.g:8654:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure )
                             {
-                            // InternalDataDSL.g:8058:6: (lv_arguments_9_0= ruleXShortClosure )
-                            // InternalDataDSL.g:8059:7: lv_arguments_9_0= ruleXShortClosure
+                            // InternalDataDSL.g:8679:6: (lv_arguments_9_0= ruleXShortClosure )
+                            // InternalDataDSL.g:8680:7: lv_arguments_9_0= ruleXShortClosure
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXShortClosureParserRuleCall_4_1_0_0());
                               						
                             }
-                            pushFollow(FOLLOW_76);
+                            pushFollow(FOLLOW_82);
                             lv_arguments_9_0=ruleXShortClosure();
 
                             state._fsp--;
@@ -21854,23 +23565,23 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:8077:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalDataDSL.g:8698:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
                             {
-                            // InternalDataDSL.g:8077:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
-                            // InternalDataDSL.g:8078:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            // InternalDataDSL.g:8698:5: ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* )
+                            // InternalDataDSL.g:8699:6: ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
                             {
-                            // InternalDataDSL.g:8078:6: ( (lv_arguments_10_0= ruleXExpression ) )
-                            // InternalDataDSL.g:8079:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalDataDSL.g:8699:6: ( (lv_arguments_10_0= ruleXExpression ) )
+                            // InternalDataDSL.g:8700:7: (lv_arguments_10_0= ruleXExpression )
                             {
-                            // InternalDataDSL.g:8079:7: (lv_arguments_10_0= ruleXExpression )
-                            // InternalDataDSL.g:8080:8: lv_arguments_10_0= ruleXExpression
+                            // InternalDataDSL.g:8700:7: (lv_arguments_10_0= ruleXExpression )
+                            // InternalDataDSL.g:8701:8: lv_arguments_10_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
                               								newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_0_0());
                               							
                             }
-                            pushFollow(FOLLOW_75);
+                            pushFollow(FOLLOW_81);
                             lv_arguments_10_0=ruleXExpression();
 
                             state._fsp--;
@@ -21894,39 +23605,39 @@
 
                             }
 
-                            // InternalDataDSL.g:8097:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
-                            loop144:
+                            // InternalDataDSL.g:8718:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )*
+                            loop151:
                             do {
-                                int alt144=2;
-                                int LA144_0 = input.LA(1);
+                                int alt151=2;
+                                int LA151_0 = input.LA(1);
 
-                                if ( (LA144_0==82) ) {
-                                    alt144=1;
+                                if ( (LA151_0==95) ) {
+                                    alt151=1;
                                 }
 
 
-                                switch (alt144) {
+                                switch (alt151) {
                             	case 1 :
-                            	    // InternalDataDSL.g:8098:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalDataDSL.g:8719:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) )
                             	    {
-                            	    otherlv_11=(Token)match(input,82,FOLLOW_78); if (state.failed) return current;
+                            	    otherlv_11=(Token)match(input,95,FOLLOW_84); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      							newLeafNode(otherlv_11, grammarAccess.getXConstructorCallAccess().getCommaKeyword_4_1_1_1_0());
                             	      						
                             	    }
-                            	    // InternalDataDSL.g:8102:7: ( (lv_arguments_12_0= ruleXExpression ) )
-                            	    // InternalDataDSL.g:8103:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalDataDSL.g:8723:7: ( (lv_arguments_12_0= ruleXExpression ) )
+                            	    // InternalDataDSL.g:8724:8: (lv_arguments_12_0= ruleXExpression )
                             	    {
-                            	    // InternalDataDSL.g:8103:8: (lv_arguments_12_0= ruleXExpression )
-                            	    // InternalDataDSL.g:8104:9: lv_arguments_12_0= ruleXExpression
+                            	    // InternalDataDSL.g:8724:8: (lv_arguments_12_0= ruleXExpression )
+                            	    // InternalDataDSL.g:8725:9: lv_arguments_12_0= ruleXExpression
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      									newCompositeNode(grammarAccess.getXConstructorCallAccess().getArgumentsXExpressionParserRuleCall_4_1_1_1_1_0());
                             	      								
                             	    }
-                            	    pushFollow(FOLLOW_75);
+                            	    pushFollow(FOLLOW_81);
                             	    lv_arguments_12_0=ruleXExpression();
 
                             	    state._fsp--;
@@ -21955,7 +23666,7 @@
                             	    break;
 
                             	default :
-                            	    break loop144;
+                            	    break loop151;
                                 }
                             } while (true);
 
@@ -21968,7 +23679,7 @@
 
                     }
 
-                    otherlv_13=(Token)match(input,83,FOLLOW_133); if (state.failed) return current;
+                    otherlv_13=(Token)match(input,96,FOLLOW_139); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_13, grammarAccess.getXConstructorCallAccess().getRightParenthesisKeyword_4_2());
@@ -21980,15 +23691,15 @@
 
             }
 
-            // InternalDataDSL.g:8129:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
-            int alt147=2;
-            alt147 = dfa147.predict(input);
-            switch (alt147) {
+            // InternalDataDSL.g:8750:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?
+            int alt154=2;
+            alt154 = dfa154.predict(input);
+            switch (alt154) {
                 case 1 :
-                    // InternalDataDSL.g:8130:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
+                    // InternalDataDSL.g:8751:4: ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure )
                     {
-                    // InternalDataDSL.g:8136:4: (lv_arguments_14_0= ruleXClosure )
-                    // InternalDataDSL.g:8137:5: lv_arguments_14_0= ruleXClosure
+                    // InternalDataDSL.g:8757:4: (lv_arguments_14_0= ruleXClosure )
+                    // InternalDataDSL.g:8758:5: lv_arguments_14_0= ruleXClosure
                     {
                     if ( state.backtracking==0 ) {
 
@@ -22047,7 +23758,7 @@
 
 
     // $ANTLR start "entryRuleXBooleanLiteral"
-    // InternalDataDSL.g:8158:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
+    // InternalDataDSL.g:8779:1: entryRuleXBooleanLiteral returns [EObject current=null] : iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF ;
     public final EObject entryRuleXBooleanLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22055,8 +23766,8 @@
 
 
         try {
-            // InternalDataDSL.g:8158:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
-            // InternalDataDSL.g:8159:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
+            // InternalDataDSL.g:8779:56: (iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF )
+            // InternalDataDSL.g:8780:2: iv_ruleXBooleanLiteral= ruleXBooleanLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXBooleanLiteralRule()); 
@@ -22087,7 +23798,7 @@
 
 
     // $ANTLR start "ruleXBooleanLiteral"
-    // InternalDataDSL.g:8165:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
+    // InternalDataDSL.g:8786:1: ruleXBooleanLiteral returns [EObject current=null] : ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) ;
     public final EObject ruleXBooleanLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22098,14 +23809,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8171:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
-            // InternalDataDSL.g:8172:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalDataDSL.g:8792:2: ( ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) ) )
+            // InternalDataDSL.g:8793:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
             {
-            // InternalDataDSL.g:8172:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
-            // InternalDataDSL.g:8173:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            // InternalDataDSL.g:8793:2: ( () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) ) )
+            // InternalDataDSL.g:8794:3: () (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
             {
-            // InternalDataDSL.g:8173:3: ()
-            // InternalDataDSL.g:8174:4: 
+            // InternalDataDSL.g:8794:3: ()
+            // InternalDataDSL.g:8795:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22117,28 +23828,28 @@
 
             }
 
-            // InternalDataDSL.g:8180:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
-            int alt148=2;
-            int LA148_0 = input.LA(1);
+            // InternalDataDSL.g:8801:3: (otherlv_1= 'false' | ( (lv_isTrue_2_0= 'true' ) ) )
+            int alt155=2;
+            int LA155_0 = input.LA(1);
 
-            if ( (LA148_0==133) ) {
-                alt148=1;
+            if ( (LA155_0==146) ) {
+                alt155=1;
             }
-            else if ( (LA148_0==134) ) {
-                alt148=2;
+            else if ( (LA155_0==147) ) {
+                alt155=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 148, 0, input);
+                    new NoViableAltException("", 155, 0, input);
 
                 throw nvae;
             }
-            switch (alt148) {
+            switch (alt155) {
                 case 1 :
-                    // InternalDataDSL.g:8181:4: otherlv_1= 'false'
+                    // InternalDataDSL.g:8802:4: otherlv_1= 'false'
                     {
-                    otherlv_1=(Token)match(input,133,FOLLOW_2); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_1, grammarAccess.getXBooleanLiteralAccess().getFalseKeyword_1_0());
@@ -22148,15 +23859,15 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:8186:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalDataDSL.g:8807:4: ( (lv_isTrue_2_0= 'true' ) )
                     {
-                    // InternalDataDSL.g:8186:4: ( (lv_isTrue_2_0= 'true' ) )
-                    // InternalDataDSL.g:8187:5: (lv_isTrue_2_0= 'true' )
+                    // InternalDataDSL.g:8807:4: ( (lv_isTrue_2_0= 'true' ) )
+                    // InternalDataDSL.g:8808:5: (lv_isTrue_2_0= 'true' )
                     {
-                    // InternalDataDSL.g:8187:5: (lv_isTrue_2_0= 'true' )
-                    // InternalDataDSL.g:8188:6: lv_isTrue_2_0= 'true'
+                    // InternalDataDSL.g:8808:5: (lv_isTrue_2_0= 'true' )
+                    // InternalDataDSL.g:8809:6: lv_isTrue_2_0= 'true'
                     {
-                    lv_isTrue_2_0=(Token)match(input,134,FOLLOW_2); if (state.failed) return current;
+                    lv_isTrue_2_0=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       						newLeafNode(lv_isTrue_2_0, grammarAccess.getXBooleanLiteralAccess().getIsTrueTrueKeyword_1_1_0());
@@ -22207,7 +23918,7 @@
 
 
     // $ANTLR start "entryRuleXNullLiteral"
-    // InternalDataDSL.g:8205:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
+    // InternalDataDSL.g:8826:1: entryRuleXNullLiteral returns [EObject current=null] : iv_ruleXNullLiteral= ruleXNullLiteral EOF ;
     public final EObject entryRuleXNullLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22215,8 +23926,8 @@
 
 
         try {
-            // InternalDataDSL.g:8205:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
-            // InternalDataDSL.g:8206:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
+            // InternalDataDSL.g:8826:53: (iv_ruleXNullLiteral= ruleXNullLiteral EOF )
+            // InternalDataDSL.g:8827:2: iv_ruleXNullLiteral= ruleXNullLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXNullLiteralRule()); 
@@ -22247,7 +23958,7 @@
 
 
     // $ANTLR start "ruleXNullLiteral"
-    // InternalDataDSL.g:8212:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
+    // InternalDataDSL.g:8833:1: ruleXNullLiteral returns [EObject current=null] : ( () otherlv_1= 'null' ) ;
     public final EObject ruleXNullLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22257,14 +23968,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8218:2: ( ( () otherlv_1= 'null' ) )
-            // InternalDataDSL.g:8219:2: ( () otherlv_1= 'null' )
+            // InternalDataDSL.g:8839:2: ( ( () otherlv_1= 'null' ) )
+            // InternalDataDSL.g:8840:2: ( () otherlv_1= 'null' )
             {
-            // InternalDataDSL.g:8219:2: ( () otherlv_1= 'null' )
-            // InternalDataDSL.g:8220:3: () otherlv_1= 'null'
+            // InternalDataDSL.g:8840:2: ( () otherlv_1= 'null' )
+            // InternalDataDSL.g:8841:3: () otherlv_1= 'null'
             {
-            // InternalDataDSL.g:8220:3: ()
-            // InternalDataDSL.g:8221:4: 
+            // InternalDataDSL.g:8841:3: ()
+            // InternalDataDSL.g:8842:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22276,7 +23987,7 @@
 
             }
 
-            otherlv_1=(Token)match(input,135,FOLLOW_2); if (state.failed) return current;
+            otherlv_1=(Token)match(input,148,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXNullLiteralAccess().getNullKeyword_1());
@@ -22307,7 +24018,7 @@
 
 
     // $ANTLR start "entryRuleXNumberLiteral"
-    // InternalDataDSL.g:8235:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
+    // InternalDataDSL.g:8856:1: entryRuleXNumberLiteral returns [EObject current=null] : iv_ruleXNumberLiteral= ruleXNumberLiteral EOF ;
     public final EObject entryRuleXNumberLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22315,8 +24026,8 @@
 
 
         try {
-            // InternalDataDSL.g:8235:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
-            // InternalDataDSL.g:8236:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
+            // InternalDataDSL.g:8856:55: (iv_ruleXNumberLiteral= ruleXNumberLiteral EOF )
+            // InternalDataDSL.g:8857:2: iv_ruleXNumberLiteral= ruleXNumberLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXNumberLiteralRule()); 
@@ -22347,7 +24058,7 @@
 
 
     // $ANTLR start "ruleXNumberLiteral"
-    // InternalDataDSL.g:8242:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
+    // InternalDataDSL.g:8863:1: ruleXNumberLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= ruleNumber ) ) ) ;
     public final EObject ruleXNumberLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22358,14 +24069,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8248:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
-            // InternalDataDSL.g:8249:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalDataDSL.g:8869:2: ( ( () ( (lv_value_1_0= ruleNumber ) ) ) )
+            // InternalDataDSL.g:8870:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
             {
-            // InternalDataDSL.g:8249:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
-            // InternalDataDSL.g:8250:3: () ( (lv_value_1_0= ruleNumber ) )
+            // InternalDataDSL.g:8870:2: ( () ( (lv_value_1_0= ruleNumber ) ) )
+            // InternalDataDSL.g:8871:3: () ( (lv_value_1_0= ruleNumber ) )
             {
-            // InternalDataDSL.g:8250:3: ()
-            // InternalDataDSL.g:8251:4: 
+            // InternalDataDSL.g:8871:3: ()
+            // InternalDataDSL.g:8872:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22377,11 +24088,11 @@
 
             }
 
-            // InternalDataDSL.g:8257:3: ( (lv_value_1_0= ruleNumber ) )
-            // InternalDataDSL.g:8258:4: (lv_value_1_0= ruleNumber )
+            // InternalDataDSL.g:8878:3: ( (lv_value_1_0= ruleNumber ) )
+            // InternalDataDSL.g:8879:4: (lv_value_1_0= ruleNumber )
             {
-            // InternalDataDSL.g:8258:4: (lv_value_1_0= ruleNumber )
-            // InternalDataDSL.g:8259:5: lv_value_1_0= ruleNumber
+            // InternalDataDSL.g:8879:4: (lv_value_1_0= ruleNumber )
+            // InternalDataDSL.g:8880:5: lv_value_1_0= ruleNumber
             {
             if ( state.backtracking==0 ) {
 
@@ -22437,7 +24148,7 @@
 
 
     // $ANTLR start "entryRuleXStringLiteral"
-    // InternalDataDSL.g:8280:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
+    // InternalDataDSL.g:8901:1: entryRuleXStringLiteral returns [EObject current=null] : iv_ruleXStringLiteral= ruleXStringLiteral EOF ;
     public final EObject entryRuleXStringLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22445,8 +24156,8 @@
 
 
         try {
-            // InternalDataDSL.g:8280:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
-            // InternalDataDSL.g:8281:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
+            // InternalDataDSL.g:8901:55: (iv_ruleXStringLiteral= ruleXStringLiteral EOF )
+            // InternalDataDSL.g:8902:2: iv_ruleXStringLiteral= ruleXStringLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXStringLiteralRule()); 
@@ -22477,7 +24188,7 @@
 
 
     // $ANTLR start "ruleXStringLiteral"
-    // InternalDataDSL.g:8287:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
+    // InternalDataDSL.g:8908:1: ruleXStringLiteral returns [EObject current=null] : ( () ( (lv_value_1_0= RULE_STRING ) ) ) ;
     public final EObject ruleXStringLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22487,14 +24198,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8293:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
-            // InternalDataDSL.g:8294:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:8914:2: ( ( () ( (lv_value_1_0= RULE_STRING ) ) ) )
+            // InternalDataDSL.g:8915:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
             {
-            // InternalDataDSL.g:8294:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
-            // InternalDataDSL.g:8295:3: () ( (lv_value_1_0= RULE_STRING ) )
+            // InternalDataDSL.g:8915:2: ( () ( (lv_value_1_0= RULE_STRING ) ) )
+            // InternalDataDSL.g:8916:3: () ( (lv_value_1_0= RULE_STRING ) )
             {
-            // InternalDataDSL.g:8295:3: ()
-            // InternalDataDSL.g:8296:4: 
+            // InternalDataDSL.g:8916:3: ()
+            // InternalDataDSL.g:8917:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22506,11 +24217,11 @@
 
             }
 
-            // InternalDataDSL.g:8302:3: ( (lv_value_1_0= RULE_STRING ) )
-            // InternalDataDSL.g:8303:4: (lv_value_1_0= RULE_STRING )
+            // InternalDataDSL.g:8923:3: ( (lv_value_1_0= RULE_STRING ) )
+            // InternalDataDSL.g:8924:4: (lv_value_1_0= RULE_STRING )
             {
-            // InternalDataDSL.g:8303:4: (lv_value_1_0= RULE_STRING )
-            // InternalDataDSL.g:8304:5: lv_value_1_0= RULE_STRING
+            // InternalDataDSL.g:8924:4: (lv_value_1_0= RULE_STRING )
+            // InternalDataDSL.g:8925:5: lv_value_1_0= RULE_STRING
             {
             lv_value_1_0=(Token)match(input,RULE_STRING,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -22561,7 +24272,7 @@
 
 
     // $ANTLR start "entryRuleXTypeLiteral"
-    // InternalDataDSL.g:8324:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
+    // InternalDataDSL.g:8945:1: entryRuleXTypeLiteral returns [EObject current=null] : iv_ruleXTypeLiteral= ruleXTypeLiteral EOF ;
     public final EObject entryRuleXTypeLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22569,8 +24280,8 @@
 
 
         try {
-            // InternalDataDSL.g:8324:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
-            // InternalDataDSL.g:8325:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
+            // InternalDataDSL.g:8945:53: (iv_ruleXTypeLiteral= ruleXTypeLiteral EOF )
+            // InternalDataDSL.g:8946:2: iv_ruleXTypeLiteral= ruleXTypeLiteral EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXTypeLiteralRule()); 
@@ -22601,7 +24312,7 @@
 
 
     // $ANTLR start "ruleXTypeLiteral"
-    // InternalDataDSL.g:8331:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
+    // InternalDataDSL.g:8952:1: ruleXTypeLiteral returns [EObject current=null] : ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) ;
     public final EObject ruleXTypeLiteral() throws RecognitionException {
         EObject current = null;
 
@@ -22615,14 +24326,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8337:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
-            // InternalDataDSL.g:8338:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalDataDSL.g:8958:2: ( ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' ) )
+            // InternalDataDSL.g:8959:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
             {
-            // InternalDataDSL.g:8338:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
-            // InternalDataDSL.g:8339:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
+            // InternalDataDSL.g:8959:2: ( () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')' )
+            // InternalDataDSL.g:8960:3: () otherlv_1= 'typeof' otherlv_2= '(' ( ( ruleQualifiedName ) ) ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )* otherlv_5= ')'
             {
-            // InternalDataDSL.g:8339:3: ()
-            // InternalDataDSL.g:8340:4: 
+            // InternalDataDSL.g:8960:3: ()
+            // InternalDataDSL.g:8961:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22634,23 +24345,23 @@
 
             }
 
-            otherlv_1=(Token)match(input,136,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,149,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXTypeLiteralAccess().getTypeofKeyword_1());
               		
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_4); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_4); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_2, grammarAccess.getXTypeLiteralAccess().getLeftParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:8354:3: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:8355:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:8975:3: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:8976:4: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:8355:4: ( ruleQualifiedName )
-            // InternalDataDSL.g:8356:5: ruleQualifiedName
+            // InternalDataDSL.g:8976:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:8977:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -22664,7 +24375,7 @@
               					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getTypeJvmTypeCrossReference_3_0());
               				
             }
-            pushFollow(FOLLOW_135);
+            pushFollow(FOLLOW_141);
             ruleQualifiedName();
 
             state._fsp--;
@@ -22680,30 +24391,30 @@
 
             }
 
-            // InternalDataDSL.g:8370:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
-            loop149:
+            // InternalDataDSL.g:8991:3: ( (lv_arrayDimensions_4_0= ruleArrayBrackets ) )*
+            loop156:
             do {
-                int alt149=2;
-                int LA149_0 = input.LA(1);
+                int alt156=2;
+                int LA156_0 = input.LA(1);
 
-                if ( (LA149_0==86) ) {
-                    alt149=1;
+                if ( (LA156_0==99) ) {
+                    alt156=1;
                 }
 
 
-                switch (alt149) {
+                switch (alt156) {
             	case 1 :
-            	    // InternalDataDSL.g:8371:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalDataDSL.g:8992:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
             	    {
-            	    // InternalDataDSL.g:8371:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
-            	    // InternalDataDSL.g:8372:5: lv_arrayDimensions_4_0= ruleArrayBrackets
+            	    // InternalDataDSL.g:8992:4: (lv_arrayDimensions_4_0= ruleArrayBrackets )
+            	    // InternalDataDSL.g:8993:5: lv_arrayDimensions_4_0= ruleArrayBrackets
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      					newCompositeNode(grammarAccess.getXTypeLiteralAccess().getArrayDimensionsArrayBracketsParserRuleCall_4_0());
             	      				
             	    }
-            	    pushFollow(FOLLOW_135);
+            	    pushFollow(FOLLOW_141);
             	    lv_arrayDimensions_4_0=ruleArrayBrackets();
 
             	    state._fsp--;
@@ -22729,11 +24440,11 @@
             	    break;
 
             	default :
-            	    break loop149;
+            	    break loop156;
                 }
             } while (true);
 
-            otherlv_5=(Token)match(input,83,FOLLOW_2); if (state.failed) return current;
+            otherlv_5=(Token)match(input,96,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_5, grammarAccess.getXTypeLiteralAccess().getRightParenthesisKeyword_5());
@@ -22764,7 +24475,7 @@
 
 
     // $ANTLR start "entryRuleXThrowExpression"
-    // InternalDataDSL.g:8397:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
+    // InternalDataDSL.g:9018:1: entryRuleXThrowExpression returns [EObject current=null] : iv_ruleXThrowExpression= ruleXThrowExpression EOF ;
     public final EObject entryRuleXThrowExpression() throws RecognitionException {
         EObject current = null;
 
@@ -22772,8 +24483,8 @@
 
 
         try {
-            // InternalDataDSL.g:8397:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
-            // InternalDataDSL.g:8398:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
+            // InternalDataDSL.g:9018:57: (iv_ruleXThrowExpression= ruleXThrowExpression EOF )
+            // InternalDataDSL.g:9019:2: iv_ruleXThrowExpression= ruleXThrowExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXThrowExpressionRule()); 
@@ -22804,7 +24515,7 @@
 
 
     // $ANTLR start "ruleXThrowExpression"
-    // InternalDataDSL.g:8404:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:9025:1: ruleXThrowExpression returns [EObject current=null] : ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) ;
     public final EObject ruleXThrowExpression() throws RecognitionException {
         EObject current = null;
 
@@ -22816,14 +24527,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8410:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:8411:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9031:2: ( ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:9032:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:8411:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:8412:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalDataDSL.g:9032:2: ( () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9033:3: () otherlv_1= 'throw' ( (lv_expression_2_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:8412:3: ()
-            // InternalDataDSL.g:8413:4: 
+            // InternalDataDSL.g:9033:3: ()
+            // InternalDataDSL.g:9034:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22835,17 +24546,17 @@
 
             }
 
-            otherlv_1=(Token)match(input,137,FOLLOW_78); if (state.failed) return current;
+            otherlv_1=(Token)match(input,150,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXThrowExpressionAccess().getThrowKeyword_1());
               		
             }
-            // InternalDataDSL.g:8423:3: ( (lv_expression_2_0= ruleXExpression ) )
-            // InternalDataDSL.g:8424:4: (lv_expression_2_0= ruleXExpression )
+            // InternalDataDSL.g:9044:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalDataDSL.g:9045:4: (lv_expression_2_0= ruleXExpression )
             {
-            // InternalDataDSL.g:8424:4: (lv_expression_2_0= ruleXExpression )
-            // InternalDataDSL.g:8425:5: lv_expression_2_0= ruleXExpression
+            // InternalDataDSL.g:9045:4: (lv_expression_2_0= ruleXExpression )
+            // InternalDataDSL.g:9046:5: lv_expression_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -22901,7 +24612,7 @@
 
 
     // $ANTLR start "entryRuleXReturnExpression"
-    // InternalDataDSL.g:8446:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
+    // InternalDataDSL.g:9067:1: entryRuleXReturnExpression returns [EObject current=null] : iv_ruleXReturnExpression= ruleXReturnExpression EOF ;
     public final EObject entryRuleXReturnExpression() throws RecognitionException {
         EObject current = null;
 
@@ -22909,8 +24620,8 @@
 
 
         try {
-            // InternalDataDSL.g:8446:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
-            // InternalDataDSL.g:8447:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
+            // InternalDataDSL.g:9067:58: (iv_ruleXReturnExpression= ruleXReturnExpression EOF )
+            // InternalDataDSL.g:9068:2: iv_ruleXReturnExpression= ruleXReturnExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXReturnExpressionRule()); 
@@ -22941,7 +24652,7 @@
 
 
     // $ANTLR start "ruleXReturnExpression"
-    // InternalDataDSL.g:8453:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
+    // InternalDataDSL.g:9074:1: ruleXReturnExpression returns [EObject current=null] : ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) ;
     public final EObject ruleXReturnExpression() throws RecognitionException {
         EObject current = null;
 
@@ -22953,14 +24664,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8459:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
-            // InternalDataDSL.g:8460:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            // InternalDataDSL.g:9080:2: ( ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? ) )
+            // InternalDataDSL.g:9081:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
             {
-            // InternalDataDSL.g:8460:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
-            // InternalDataDSL.g:8461:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            // InternalDataDSL.g:9081:2: ( () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )? )
+            // InternalDataDSL.g:9082:3: () otherlv_1= 'return' ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
             {
-            // InternalDataDSL.g:8461:3: ()
-            // InternalDataDSL.g:8462:4: 
+            // InternalDataDSL.g:9082:3: ()
+            // InternalDataDSL.g:9083:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -22972,21 +24683,21 @@
 
             }
 
-            otherlv_1=(Token)match(input,138,FOLLOW_136); if (state.failed) return current;
+            otherlv_1=(Token)match(input,151,FOLLOW_142); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXReturnExpressionAccess().getReturnKeyword_1());
               		
             }
-            // InternalDataDSL.g:8472:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
-            int alt150=2;
-            alt150 = dfa150.predict(input);
-            switch (alt150) {
+            // InternalDataDSL.g:9093:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?
+            int alt157=2;
+            alt157 = dfa157.predict(input);
+            switch (alt157) {
                 case 1 :
-                    // InternalDataDSL.g:8473:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
+                    // InternalDataDSL.g:9094:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:8474:4: (lv_expression_2_0= ruleXExpression )
-                    // InternalDataDSL.g:8475:5: lv_expression_2_0= ruleXExpression
+                    // InternalDataDSL.g:9095:4: (lv_expression_2_0= ruleXExpression )
+                    // InternalDataDSL.g:9096:5: lv_expression_2_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23045,7 +24756,7 @@
 
 
     // $ANTLR start "entryRuleXTryCatchFinallyExpression"
-    // InternalDataDSL.g:8496:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
+    // InternalDataDSL.g:9117:1: entryRuleXTryCatchFinallyExpression returns [EObject current=null] : iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF ;
     public final EObject entryRuleXTryCatchFinallyExpression() throws RecognitionException {
         EObject current = null;
 
@@ -23053,8 +24764,8 @@
 
 
         try {
-            // InternalDataDSL.g:8496:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
-            // InternalDataDSL.g:8497:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
+            // InternalDataDSL.g:9117:67: (iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF )
+            // InternalDataDSL.g:9118:2: iv_ruleXTryCatchFinallyExpression= ruleXTryCatchFinallyExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionRule()); 
@@ -23085,7 +24796,7 @@
 
 
     // $ANTLR start "ruleXTryCatchFinallyExpression"
-    // InternalDataDSL.g:8503:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
+    // InternalDataDSL.g:9124:1: ruleXTryCatchFinallyExpression returns [EObject current=null] : ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) ;
     public final EObject ruleXTryCatchFinallyExpression() throws RecognitionException {
         EObject current = null;
 
@@ -23105,14 +24816,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8509:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
-            // InternalDataDSL.g:8510:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            // InternalDataDSL.g:9130:2: ( ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) ) )
+            // InternalDataDSL.g:9131:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
             {
-            // InternalDataDSL.g:8510:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
-            // InternalDataDSL.g:8511:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:9131:2: ( () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) ) )
+            // InternalDataDSL.g:9132:3: () otherlv_1= 'try' ( (lv_expression_2_0= ruleXExpression ) ) ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
             {
-            // InternalDataDSL.g:8511:3: ()
-            // InternalDataDSL.g:8512:4: 
+            // InternalDataDSL.g:9132:3: ()
+            // InternalDataDSL.g:9133:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -23124,24 +24835,24 @@
 
             }
 
-            otherlv_1=(Token)match(input,139,FOLLOW_78); if (state.failed) return current;
+            otherlv_1=(Token)match(input,152,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXTryCatchFinallyExpressionAccess().getTryKeyword_1());
               		
             }
-            // InternalDataDSL.g:8522:3: ( (lv_expression_2_0= ruleXExpression ) )
-            // InternalDataDSL.g:8523:4: (lv_expression_2_0= ruleXExpression )
+            // InternalDataDSL.g:9143:3: ( (lv_expression_2_0= ruleXExpression ) )
+            // InternalDataDSL.g:9144:4: (lv_expression_2_0= ruleXExpression )
             {
-            // InternalDataDSL.g:8523:4: (lv_expression_2_0= ruleXExpression )
-            // InternalDataDSL.g:8524:5: lv_expression_2_0= ruleXExpression
+            // InternalDataDSL.g:9144:4: (lv_expression_2_0= ruleXExpression )
+            // InternalDataDSL.g:9145:5: lv_expression_2_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getExpressionXExpressionParserRuleCall_2_0());
               				
             }
-            pushFollow(FOLLOW_137);
+            pushFollow(FOLLOW_143);
             lv_expression_2_0=ruleXExpression();
 
             state._fsp--;
@@ -23165,61 +24876,61 @@
 
             }
 
-            // InternalDataDSL.g:8541:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
-            int alt153=2;
-            int LA153_0 = input.LA(1);
+            // InternalDataDSL.g:9162:3: ( ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? ) | (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) ) )
+            int alt160=2;
+            int LA160_0 = input.LA(1);
 
-            if ( (LA153_0==142) ) {
-                alt153=1;
+            if ( (LA160_0==155) ) {
+                alt160=1;
             }
-            else if ( (LA153_0==140) ) {
-                alt153=2;
+            else if ( (LA160_0==153) ) {
+                alt160=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 153, 0, input);
+                    new NoViableAltException("", 160, 0, input);
 
                 throw nvae;
             }
-            switch (alt153) {
+            switch (alt160) {
                 case 1 :
-                    // InternalDataDSL.g:8542:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalDataDSL.g:9163:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
                     {
-                    // InternalDataDSL.g:8542:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
-                    // InternalDataDSL.g:8543:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    // InternalDataDSL.g:9163:4: ( ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )? )
+                    // InternalDataDSL.g:9164:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+ ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
                     {
-                    // InternalDataDSL.g:8543:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
-                    int cnt151=0;
-                    loop151:
+                    // InternalDataDSL.g:9164:5: ( ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause ) )+
+                    int cnt158=0;
+                    loop158:
                     do {
-                        int alt151=2;
-                        int LA151_0 = input.LA(1);
+                        int alt158=2;
+                        int LA158_0 = input.LA(1);
 
-                        if ( (LA151_0==142) ) {
-                            int LA151_2 = input.LA(2);
+                        if ( (LA158_0==155) ) {
+                            int LA158_2 = input.LA(2);
 
                             if ( (synpred44_InternalDataDSL()) ) {
-                                alt151=1;
+                                alt158=1;
                             }
 
 
                         }
 
 
-                        switch (alt151) {
+                        switch (alt158) {
                     	case 1 :
-                    	    // InternalDataDSL.g:8544:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalDataDSL.g:9165:6: ( 'catch' )=> (lv_catchClauses_3_0= ruleXCatchClause )
                     	    {
-                    	    // InternalDataDSL.g:8545:6: (lv_catchClauses_3_0= ruleXCatchClause )
-                    	    // InternalDataDSL.g:8546:7: lv_catchClauses_3_0= ruleXCatchClause
+                    	    // InternalDataDSL.g:9166:6: (lv_catchClauses_3_0= ruleXCatchClause )
+                    	    // InternalDataDSL.g:9167:7: lv_catchClauses_3_0= ruleXCatchClause
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getXTryCatchFinallyExpressionAccess().getCatchClausesXCatchClauseParserRuleCall_3_0_0_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_138);
+                    	    pushFollow(FOLLOW_144);
                     	    lv_catchClauses_3_0=ruleXCatchClause();
 
                     	    state._fsp--;
@@ -23245,34 +24956,34 @@
                     	    break;
 
                     	default :
-                    	    if ( cnt151 >= 1 ) break loop151;
+                    	    if ( cnt158 >= 1 ) break loop158;
                     	    if (state.backtracking>0) {state.failed=true; return current;}
                                 EarlyExitException eee =
-                                    new EarlyExitException(151, input);
+                                    new EarlyExitException(158, input);
                                 throw eee;
                         }
-                        cnt151++;
+                        cnt158++;
                     } while (true);
 
-                    // InternalDataDSL.g:8563:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
-                    int alt152=2;
-                    int LA152_0 = input.LA(1);
+                    // InternalDataDSL.g:9184:5: ( ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) ) )?
+                    int alt159=2;
+                    int LA159_0 = input.LA(1);
 
-                    if ( (LA152_0==140) ) {
-                        int LA152_1 = input.LA(2);
+                    if ( (LA159_0==153) ) {
+                        int LA159_1 = input.LA(2);
 
                         if ( (synpred45_InternalDataDSL()) ) {
-                            alt152=1;
+                            alt159=1;
                         }
                     }
-                    switch (alt152) {
+                    switch (alt159) {
                         case 1 :
-                            // InternalDataDSL.g:8564:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalDataDSL.g:9185:6: ( ( 'finally' )=>otherlv_4= 'finally' ) ( (lv_finallyExpression_5_0= ruleXExpression ) )
                             {
-                            // InternalDataDSL.g:8564:6: ( ( 'finally' )=>otherlv_4= 'finally' )
-                            // InternalDataDSL.g:8565:7: ( 'finally' )=>otherlv_4= 'finally'
+                            // InternalDataDSL.g:9185:6: ( ( 'finally' )=>otherlv_4= 'finally' )
+                            // InternalDataDSL.g:9186:7: ( 'finally' )=>otherlv_4= 'finally'
                             {
-                            otherlv_4=(Token)match(input,140,FOLLOW_78); if (state.failed) return current;
+                            otherlv_4=(Token)match(input,153,FOLLOW_84); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               							newLeafNode(otherlv_4, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_0_1_0());
@@ -23281,11 +24992,11 @@
 
                             }
 
-                            // InternalDataDSL.g:8571:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
-                            // InternalDataDSL.g:8572:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalDataDSL.g:9192:6: ( (lv_finallyExpression_5_0= ruleXExpression ) )
+                            // InternalDataDSL.g:9193:7: (lv_finallyExpression_5_0= ruleXExpression )
                             {
-                            // InternalDataDSL.g:8572:7: (lv_finallyExpression_5_0= ruleXExpression )
-                            // InternalDataDSL.g:8573:8: lv_finallyExpression_5_0= ruleXExpression
+                            // InternalDataDSL.g:9193:7: (lv_finallyExpression_5_0= ruleXExpression )
+                            // InternalDataDSL.g:9194:8: lv_finallyExpression_5_0= ruleXExpression
                             {
                             if ( state.backtracking==0 ) {
 
@@ -23329,22 +25040,22 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:8593:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:9214:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
                     {
-                    // InternalDataDSL.g:8593:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
-                    // InternalDataDSL.g:8594:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:9214:4: (otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) ) )
+                    // InternalDataDSL.g:9215:5: otherlv_6= 'finally' ( (lv_finallyExpression_7_0= ruleXExpression ) )
                     {
-                    otherlv_6=(Token)match(input,140,FOLLOW_78); if (state.failed) return current;
+                    otherlv_6=(Token)match(input,153,FOLLOW_84); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_6, grammarAccess.getXTryCatchFinallyExpressionAccess().getFinallyKeyword_3_1_0());
                       				
                     }
-                    // InternalDataDSL.g:8598:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
-                    // InternalDataDSL.g:8599:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalDataDSL.g:9219:5: ( (lv_finallyExpression_7_0= ruleXExpression ) )
+                    // InternalDataDSL.g:9220:6: (lv_finallyExpression_7_0= ruleXExpression )
                     {
-                    // InternalDataDSL.g:8599:6: (lv_finallyExpression_7_0= ruleXExpression )
-                    // InternalDataDSL.g:8600:7: lv_finallyExpression_7_0= ruleXExpression
+                    // InternalDataDSL.g:9220:6: (lv_finallyExpression_7_0= ruleXExpression )
+                    // InternalDataDSL.g:9221:7: lv_finallyExpression_7_0= ruleXExpression
                     {
                     if ( state.backtracking==0 ) {
 
@@ -23409,7 +25120,7 @@
 
 
     // $ANTLR start "entryRuleXSynchronizedExpression"
-    // InternalDataDSL.g:8623:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
+    // InternalDataDSL.g:9244:1: entryRuleXSynchronizedExpression returns [EObject current=null] : iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF ;
     public final EObject entryRuleXSynchronizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -23417,8 +25128,8 @@
 
 
         try {
-            // InternalDataDSL.g:8623:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
-            // InternalDataDSL.g:8624:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
+            // InternalDataDSL.g:9244:64: (iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF )
+            // InternalDataDSL.g:9245:2: iv_ruleXSynchronizedExpression= ruleXSynchronizedExpression EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXSynchronizedExpressionRule()); 
@@ -23449,7 +25160,7 @@
 
 
     // $ANTLR start "ruleXSynchronizedExpression"
-    // InternalDataDSL.g:8630:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:9251:1: ruleXSynchronizedExpression returns [EObject current=null] : ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) ;
     public final EObject ruleXSynchronizedExpression() throws RecognitionException {
         EObject current = null;
 
@@ -23465,20 +25176,20 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8636:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:8637:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9257:2: ( ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:9258:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:8637:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:8638:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:9258:2: ( ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9259:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) ) ( (lv_param_3_0= ruleXExpression ) ) otherlv_4= ')' ( (lv_expression_5_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:8638:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
-            // InternalDataDSL.g:8639:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalDataDSL.g:9259:3: ( ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' ) )
+            // InternalDataDSL.g:9260:4: ( ( () 'synchronized' '(' ) )=> ( () otherlv_1= 'synchronized' otherlv_2= '(' )
             {
-            // InternalDataDSL.g:8646:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
-            // InternalDataDSL.g:8647:5: () otherlv_1= 'synchronized' otherlv_2= '('
+            // InternalDataDSL.g:9267:4: ( () otherlv_1= 'synchronized' otherlv_2= '(' )
+            // InternalDataDSL.g:9268:5: () otherlv_1= 'synchronized' otherlv_2= '('
             {
-            // InternalDataDSL.g:8647:5: ()
-            // InternalDataDSL.g:8648:6: 
+            // InternalDataDSL.g:9268:5: ()
+            // InternalDataDSL.g:9269:6: 
             {
             if ( state.backtracking==0 ) {
 
@@ -23490,13 +25201,13 @@
 
             }
 
-            otherlv_1=(Token)match(input,141,FOLLOW_116); if (state.failed) return current;
+            otherlv_1=(Token)match(input,154,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_1, grammarAccess.getXSynchronizedExpressionAccess().getSynchronizedKeyword_0_0_1());
               				
             }
-            otherlv_2=(Token)match(input,81,FOLLOW_78); if (state.failed) return current;
+            otherlv_2=(Token)match(input,94,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               					newLeafNode(otherlv_2, grammarAccess.getXSynchronizedExpressionAccess().getLeftParenthesisKeyword_0_0_2());
@@ -23508,18 +25219,18 @@
 
             }
 
-            // InternalDataDSL.g:8664:3: ( (lv_param_3_0= ruleXExpression ) )
-            // InternalDataDSL.g:8665:4: (lv_param_3_0= ruleXExpression )
+            // InternalDataDSL.g:9285:3: ( (lv_param_3_0= ruleXExpression ) )
+            // InternalDataDSL.g:9286:4: (lv_param_3_0= ruleXExpression )
             {
-            // InternalDataDSL.g:8665:4: (lv_param_3_0= ruleXExpression )
-            // InternalDataDSL.g:8666:5: lv_param_3_0= ruleXExpression
+            // InternalDataDSL.g:9286:4: (lv_param_3_0= ruleXExpression )
+            // InternalDataDSL.g:9287:5: lv_param_3_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXSynchronizedExpressionAccess().getParamXExpressionParserRuleCall_1_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_param_3_0=ruleXExpression();
 
             state._fsp--;
@@ -23543,17 +25254,17 @@
 
             }
 
-            otherlv_4=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_4=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_4, grammarAccess.getXSynchronizedExpressionAccess().getRightParenthesisKeyword_2());
               		
             }
-            // InternalDataDSL.g:8687:3: ( (lv_expression_5_0= ruleXExpression ) )
-            // InternalDataDSL.g:8688:4: (lv_expression_5_0= ruleXExpression )
+            // InternalDataDSL.g:9308:3: ( (lv_expression_5_0= ruleXExpression ) )
+            // InternalDataDSL.g:9309:4: (lv_expression_5_0= ruleXExpression )
             {
-            // InternalDataDSL.g:8688:4: (lv_expression_5_0= ruleXExpression )
-            // InternalDataDSL.g:8689:5: lv_expression_5_0= ruleXExpression
+            // InternalDataDSL.g:9309:4: (lv_expression_5_0= ruleXExpression )
+            // InternalDataDSL.g:9310:5: lv_expression_5_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -23609,7 +25320,7 @@
 
 
     // $ANTLR start "entryRuleXCatchClause"
-    // InternalDataDSL.g:8710:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
+    // InternalDataDSL.g:9331:1: entryRuleXCatchClause returns [EObject current=null] : iv_ruleXCatchClause= ruleXCatchClause EOF ;
     public final EObject entryRuleXCatchClause() throws RecognitionException {
         EObject current = null;
 
@@ -23617,8 +25328,8 @@
 
 
         try {
-            // InternalDataDSL.g:8710:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
-            // InternalDataDSL.g:8711:2: iv_ruleXCatchClause= ruleXCatchClause EOF
+            // InternalDataDSL.g:9331:53: (iv_ruleXCatchClause= ruleXCatchClause EOF )
+            // InternalDataDSL.g:9332:2: iv_ruleXCatchClause= ruleXCatchClause EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXCatchClauseRule()); 
@@ -23649,7 +25360,7 @@
 
 
     // $ANTLR start "ruleXCatchClause"
-    // InternalDataDSL.g:8717:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
+    // InternalDataDSL.g:9338:1: ruleXCatchClause returns [EObject current=null] : ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) ;
     public final EObject ruleXCatchClause() throws RecognitionException {
         EObject current = null;
 
@@ -23665,16 +25376,16 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8723:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
-            // InternalDataDSL.g:8724:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9344:2: ( ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) ) )
+            // InternalDataDSL.g:9345:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
             {
-            // InternalDataDSL.g:8724:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
-            // InternalDataDSL.g:8725:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalDataDSL.g:9345:2: ( ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) ) )
+            // InternalDataDSL.g:9346:3: ( ( 'catch' )=>otherlv_0= 'catch' ) otherlv_1= '(' ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) ) otherlv_3= ')' ( (lv_expression_4_0= ruleXExpression ) )
             {
-            // InternalDataDSL.g:8725:3: ( ( 'catch' )=>otherlv_0= 'catch' )
-            // InternalDataDSL.g:8726:4: ( 'catch' )=>otherlv_0= 'catch'
+            // InternalDataDSL.g:9346:3: ( ( 'catch' )=>otherlv_0= 'catch' )
+            // InternalDataDSL.g:9347:4: ( 'catch' )=>otherlv_0= 'catch'
             {
-            otherlv_0=(Token)match(input,142,FOLLOW_116); if (state.failed) return current;
+            otherlv_0=(Token)match(input,155,FOLLOW_122); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               				newLeafNode(otherlv_0, grammarAccess.getXCatchClauseAccess().getCatchKeyword_0());
@@ -23683,24 +25394,24 @@
 
             }
 
-            otherlv_1=(Token)match(input,81,FOLLOW_91); if (state.failed) return current;
+            otherlv_1=(Token)match(input,94,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getXCatchClauseAccess().getLeftParenthesisKeyword_1());
               		
             }
-            // InternalDataDSL.g:8736:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
-            // InternalDataDSL.g:8737:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalDataDSL.g:9357:3: ( (lv_declaredParam_2_0= ruleFullJvmFormalParameter ) )
+            // InternalDataDSL.g:9358:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
             {
-            // InternalDataDSL.g:8737:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
-            // InternalDataDSL.g:8738:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
+            // InternalDataDSL.g:9358:4: (lv_declaredParam_2_0= ruleFullJvmFormalParameter )
+            // InternalDataDSL.g:9359:5: lv_declaredParam_2_0= ruleFullJvmFormalParameter
             {
             if ( state.backtracking==0 ) {
 
               					newCompositeNode(grammarAccess.getXCatchClauseAccess().getDeclaredParamFullJvmFormalParameterParserRuleCall_2_0());
               				
             }
-            pushFollow(FOLLOW_76);
+            pushFollow(FOLLOW_82);
             lv_declaredParam_2_0=ruleFullJvmFormalParameter();
 
             state._fsp--;
@@ -23724,17 +25435,17 @@
 
             }
 
-            otherlv_3=(Token)match(input,83,FOLLOW_78); if (state.failed) return current;
+            otherlv_3=(Token)match(input,96,FOLLOW_84); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_3, grammarAccess.getXCatchClauseAccess().getRightParenthesisKeyword_3());
               		
             }
-            // InternalDataDSL.g:8759:3: ( (lv_expression_4_0= ruleXExpression ) )
-            // InternalDataDSL.g:8760:4: (lv_expression_4_0= ruleXExpression )
+            // InternalDataDSL.g:9380:3: ( (lv_expression_4_0= ruleXExpression ) )
+            // InternalDataDSL.g:9381:4: (lv_expression_4_0= ruleXExpression )
             {
-            // InternalDataDSL.g:8760:4: (lv_expression_4_0= ruleXExpression )
-            // InternalDataDSL.g:8761:5: lv_expression_4_0= ruleXExpression
+            // InternalDataDSL.g:9381:4: (lv_expression_4_0= ruleXExpression )
+            // InternalDataDSL.g:9382:5: lv_expression_4_0= ruleXExpression
             {
             if ( state.backtracking==0 ) {
 
@@ -23790,7 +25501,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedName"
-    // InternalDataDSL.g:8782:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
+    // InternalDataDSL.g:9403:1: entryRuleQualifiedName returns [String current=null] : iv_ruleQualifiedName= ruleQualifiedName EOF ;
     public final String entryRuleQualifiedName() throws RecognitionException {
         String current = null;
 
@@ -23798,8 +25509,8 @@
 
 
         try {
-            // InternalDataDSL.g:8782:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
-            // InternalDataDSL.g:8783:2: iv_ruleQualifiedName= ruleQualifiedName EOF
+            // InternalDataDSL.g:9403:53: (iv_ruleQualifiedName= ruleQualifiedName EOF )
+            // InternalDataDSL.g:9404:2: iv_ruleQualifiedName= ruleQualifiedName EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameRule()); 
@@ -23830,7 +25541,7 @@
 
 
     // $ANTLR start "ruleQualifiedName"
-    // InternalDataDSL.g:8789:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
+    // InternalDataDSL.g:9410:1: ruleQualifiedName returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) ;
     public final AntlrDatatypeRuleToken ruleQualifiedName() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -23844,18 +25555,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8795:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
-            // InternalDataDSL.g:8796:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalDataDSL.g:9416:2: ( (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* ) )
+            // InternalDataDSL.g:9417:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
             {
-            // InternalDataDSL.g:8796:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
-            // InternalDataDSL.g:8797:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            // InternalDataDSL.g:9417:2: (this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )* )
+            // InternalDataDSL.g:9418:3: this_ValidID_0= ruleValidID ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_68);
+            pushFollow(FOLLOW_74);
             this_ValidID_0=ruleValidID();
 
             state._fsp--;
@@ -23870,20 +25581,20 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            // InternalDataDSL.g:8807:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
-            loop154:
+            // InternalDataDSL.g:9428:3: ( ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID )*
+            loop161:
             do {
-                int alt154=2;
-                int LA154_0 = input.LA(1);
+                int alt161=2;
+                int LA161_0 = input.LA(1);
 
-                if ( (LA154_0==74) ) {
-                    int LA154_2 = input.LA(2);
+                if ( (LA161_0==87) ) {
+                    int LA161_2 = input.LA(2);
 
-                    if ( (LA154_2==RULE_ID) ) {
-                        int LA154_3 = input.LA(3);
+                    if ( (LA161_2==RULE_ID) ) {
+                        int LA161_3 = input.LA(3);
 
                         if ( (synpred48_InternalDataDSL()) ) {
-                            alt154=1;
+                            alt161=1;
                         }
 
 
@@ -23893,14 +25604,14 @@
                 }
 
 
-                switch (alt154) {
+                switch (alt161) {
             	case 1 :
-            	    // InternalDataDSL.g:8808:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
+            	    // InternalDataDSL.g:9429:4: ( ( '.' )=>kw= '.' ) this_ValidID_2= ruleValidID
             	    {
-            	    // InternalDataDSL.g:8808:4: ( ( '.' )=>kw= '.' )
-            	    // InternalDataDSL.g:8809:5: ( '.' )=>kw= '.'
+            	    // InternalDataDSL.g:9429:4: ( ( '.' )=>kw= '.' )
+            	    // InternalDataDSL.g:9430:5: ( '.' )=>kw= '.'
             	    {
-            	    kw=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
+            	    kw=(Token)match(input,87,FOLLOW_4); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      					current.merge(kw);
@@ -23915,7 +25626,7 @@
             	      				newCompositeNode(grammarAccess.getQualifiedNameAccess().getValidIDParserRuleCall_1_1());
             	      			
             	    }
-            	    pushFollow(FOLLOW_68);
+            	    pushFollow(FOLLOW_74);
             	    this_ValidID_2=ruleValidID();
 
             	    state._fsp--;
@@ -23935,7 +25646,7 @@
             	    break;
 
             	default :
-            	    break loop154;
+            	    break loop161;
                 }
             } while (true);
 
@@ -23964,7 +25675,7 @@
 
 
     // $ANTLR start "entryRuleNumber"
-    // InternalDataDSL.g:8831:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
+    // InternalDataDSL.g:9452:1: entryRuleNumber returns [String current=null] : iv_ruleNumber= ruleNumber EOF ;
     public final String entryRuleNumber() throws RecognitionException {
         String current = null;
 
@@ -23975,8 +25686,8 @@
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalDataDSL.g:8833:2: (iv_ruleNumber= ruleNumber EOF )
-            // InternalDataDSL.g:8834:2: iv_ruleNumber= ruleNumber EOF
+            // InternalDataDSL.g:9454:2: (iv_ruleNumber= ruleNumber EOF )
+            // InternalDataDSL.g:9455:2: iv_ruleNumber= ruleNumber EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getNumberRule()); 
@@ -24010,7 +25721,7 @@
 
 
     // $ANTLR start "ruleNumber"
-    // InternalDataDSL.g:8843:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
+    // InternalDataDSL.g:9464:1: ruleNumber returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) ;
     public final AntlrDatatypeRuleToken ruleNumber() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -24026,29 +25737,29 @@
         	HiddenTokens myHiddenTokenState = ((XtextTokenStream)input).setHiddenTokens();
 
         try {
-            // InternalDataDSL.g:8850:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
-            // InternalDataDSL.g:8851:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            // InternalDataDSL.g:9471:2: ( (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) ) )
+            // InternalDataDSL.g:9472:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
             {
-            // InternalDataDSL.g:8851:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
-            int alt158=2;
-            int LA158_0 = input.LA(1);
+            // InternalDataDSL.g:9472:2: (this_HEX_0= RULE_HEX | ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? ) )
+            int alt165=2;
+            int LA165_0 = input.LA(1);
 
-            if ( (LA158_0==RULE_HEX) ) {
-                alt158=1;
+            if ( (LA165_0==RULE_HEX) ) {
+                alt165=1;
             }
-            else if ( (LA158_0==RULE_INT||LA158_0==RULE_DECIMAL) ) {
-                alt158=2;
+            else if ( (LA165_0==RULE_INT||LA165_0==RULE_DECIMAL) ) {
+                alt165=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 158, 0, input);
+                    new NoViableAltException("", 165, 0, input);
 
                 throw nvae;
             }
-            switch (alt158) {
+            switch (alt165) {
                 case 1 :
-                    // InternalDataDSL.g:8852:3: this_HEX_0= RULE_HEX
+                    // InternalDataDSL.g:9473:3: this_HEX_0= RULE_HEX
                     {
                     this_HEX_0=(Token)match(input,RULE_HEX,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
@@ -24065,33 +25776,33 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:8860:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalDataDSL.g:9481:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
                     {
-                    // InternalDataDSL.g:8860:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
-                    // InternalDataDSL.g:8861:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    // InternalDataDSL.g:9481:3: ( (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )? )
+                    // InternalDataDSL.g:9482:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL ) (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
                     {
-                    // InternalDataDSL.g:8861:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
-                    int alt155=2;
-                    int LA155_0 = input.LA(1);
+                    // InternalDataDSL.g:9482:4: (this_INT_1= RULE_INT | this_DECIMAL_2= RULE_DECIMAL )
+                    int alt162=2;
+                    int LA162_0 = input.LA(1);
 
-                    if ( (LA155_0==RULE_INT) ) {
-                        alt155=1;
+                    if ( (LA162_0==RULE_INT) ) {
+                        alt162=1;
                     }
-                    else if ( (LA155_0==RULE_DECIMAL) ) {
-                        alt155=2;
+                    else if ( (LA162_0==RULE_DECIMAL) ) {
+                        alt162=2;
                     }
                     else {
                         if (state.backtracking>0) {state.failed=true; return current;}
                         NoViableAltException nvae =
-                            new NoViableAltException("", 155, 0, input);
+                            new NoViableAltException("", 162, 0, input);
 
                         throw nvae;
                     }
-                    switch (alt155) {
+                    switch (alt162) {
                         case 1 :
-                            // InternalDataDSL.g:8862:5: this_INT_1= RULE_INT
+                            // InternalDataDSL.g:9483:5: this_INT_1= RULE_INT
                             {
-                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_68); if (state.failed) return current;
+                            this_INT_1=(Token)match(input,RULE_INT,FOLLOW_74); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(this_INT_1);
@@ -24106,9 +25817,9 @@
                             }
                             break;
                         case 2 :
-                            // InternalDataDSL.g:8870:5: this_DECIMAL_2= RULE_DECIMAL
+                            // InternalDataDSL.g:9491:5: this_DECIMAL_2= RULE_DECIMAL
                             {
-                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_68); if (state.failed) return current;
+                            this_DECIMAL_2=(Token)match(input,RULE_DECIMAL,FOLLOW_74); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(this_DECIMAL_2);
@@ -24125,48 +25836,48 @@
 
                     }
 
-                    // InternalDataDSL.g:8878:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
-                    int alt157=2;
-                    int LA157_0 = input.LA(1);
+                    // InternalDataDSL.g:9499:4: (kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL ) )?
+                    int alt164=2;
+                    int LA164_0 = input.LA(1);
 
-                    if ( (LA157_0==74) ) {
-                        int LA157_1 = input.LA(2);
+                    if ( (LA164_0==87) ) {
+                        int LA164_1 = input.LA(2);
 
-                        if ( (LA157_1==RULE_INT||LA157_1==RULE_DECIMAL) ) {
-                            alt157=1;
+                        if ( (LA164_1==RULE_INT||LA164_1==RULE_DECIMAL) ) {
+                            alt164=1;
                         }
                     }
-                    switch (alt157) {
+                    switch (alt164) {
                         case 1 :
-                            // InternalDataDSL.g:8879:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            // InternalDataDSL.g:9500:5: kw= '.' (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
                             {
-                            kw=(Token)match(input,74,FOLLOW_139); if (state.failed) return current;
+                            kw=(Token)match(input,87,FOLLOW_145); if (state.failed) return current;
                             if ( state.backtracking==0 ) {
 
                               					current.merge(kw);
                               					newLeafNode(kw, grammarAccess.getNumberAccess().getFullStopKeyword_1_1_0());
                               				
                             }
-                            // InternalDataDSL.g:8884:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
-                            int alt156=2;
-                            int LA156_0 = input.LA(1);
+                            // InternalDataDSL.g:9505:5: (this_INT_4= RULE_INT | this_DECIMAL_5= RULE_DECIMAL )
+                            int alt163=2;
+                            int LA163_0 = input.LA(1);
 
-                            if ( (LA156_0==RULE_INT) ) {
-                                alt156=1;
+                            if ( (LA163_0==RULE_INT) ) {
+                                alt163=1;
                             }
-                            else if ( (LA156_0==RULE_DECIMAL) ) {
-                                alt156=2;
+                            else if ( (LA163_0==RULE_DECIMAL) ) {
+                                alt163=2;
                             }
                             else {
                                 if (state.backtracking>0) {state.failed=true; return current;}
                                 NoViableAltException nvae =
-                                    new NoViableAltException("", 156, 0, input);
+                                    new NoViableAltException("", 163, 0, input);
 
                                 throw nvae;
                             }
-                            switch (alt156) {
+                            switch (alt163) {
                                 case 1 :
-                                    // InternalDataDSL.g:8885:6: this_INT_4= RULE_INT
+                                    // InternalDataDSL.g:9506:6: this_INT_4= RULE_INT
                                     {
                                     this_INT_4=(Token)match(input,RULE_INT,FOLLOW_2); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
@@ -24183,7 +25894,7 @@
                                     }
                                     break;
                                 case 2 :
-                                    // InternalDataDSL.g:8893:6: this_DECIMAL_5= RULE_DECIMAL
+                                    // InternalDataDSL.g:9514:6: this_DECIMAL_5= RULE_DECIMAL
                                     {
                                     this_DECIMAL_5=(Token)match(input,RULE_DECIMAL,FOLLOW_2); if (state.failed) return current;
                                     if ( state.backtracking==0 ) {
@@ -24242,7 +25953,7 @@
 
 
     // $ANTLR start "entryRuleJvmTypeReference"
-    // InternalDataDSL.g:8910:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
+    // InternalDataDSL.g:9531:1: entryRuleJvmTypeReference returns [EObject current=null] : iv_ruleJvmTypeReference= ruleJvmTypeReference EOF ;
     public final EObject entryRuleJvmTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -24250,8 +25961,8 @@
 
 
         try {
-            // InternalDataDSL.g:8910:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
-            // InternalDataDSL.g:8911:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
+            // InternalDataDSL.g:9531:57: (iv_ruleJvmTypeReference= ruleJvmTypeReference EOF )
+            // InternalDataDSL.g:9532:2: iv_ruleJvmTypeReference= ruleJvmTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmTypeReferenceRule()); 
@@ -24282,7 +25993,7 @@
 
 
     // $ANTLR start "ruleJvmTypeReference"
-    // InternalDataDSL.g:8917:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
+    // InternalDataDSL.g:9538:1: ruleJvmTypeReference returns [EObject current=null] : ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) ;
     public final EObject ruleJvmTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -24295,39 +26006,39 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8923:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
-            // InternalDataDSL.g:8924:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            // InternalDataDSL.g:9544:2: ( ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef ) )
+            // InternalDataDSL.g:9545:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
             {
-            // InternalDataDSL.g:8924:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
-            int alt160=2;
-            int LA160_0 = input.LA(1);
+            // InternalDataDSL.g:9545:2: ( (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* ) | this_XFunctionTypeRef_3= ruleXFunctionTypeRef )
+            int alt167=2;
+            int LA167_0 = input.LA(1);
 
-            if ( (LA160_0==RULE_ID) ) {
-                alt160=1;
+            if ( (LA167_0==RULE_ID) ) {
+                alt167=1;
             }
-            else if ( (LA160_0==81||LA160_0==106) ) {
-                alt160=2;
+            else if ( (LA167_0==94||LA167_0==119) ) {
+                alt167=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 160, 0, input);
+                    new NoViableAltException("", 167, 0, input);
 
                 throw nvae;
             }
-            switch (alt160) {
+            switch (alt167) {
                 case 1 :
-                    // InternalDataDSL.g:8925:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalDataDSL.g:9546:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
                     {
-                    // InternalDataDSL.g:8925:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
-                    // InternalDataDSL.g:8926:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    // InternalDataDSL.g:9546:3: (this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )* )
+                    // InternalDataDSL.g:9547:4: this_JvmParameterizedTypeReference_0= ruleJvmParameterizedTypeReference ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
                     {
                     if ( state.backtracking==0 ) {
 
                       				newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getJvmParameterizedTypeReferenceParserRuleCall_0_0());
                       			
                     }
-                    pushFollow(FOLLOW_133);
+                    pushFollow(FOLLOW_139);
                     this_JvmParameterizedTypeReference_0=ruleJvmParameterizedTypeReference();
 
                     state._fsp--;
@@ -24338,20 +26049,20 @@
                       				afterParserOrEnumRuleCall();
                       			
                     }
-                    // InternalDataDSL.g:8934:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
-                    loop159:
+                    // InternalDataDSL.g:9555:4: ( ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets ) )*
+                    loop166:
                     do {
-                        int alt159=2;
-                        int LA159_0 = input.LA(1);
+                        int alt166=2;
+                        int LA166_0 = input.LA(1);
 
-                        if ( (LA159_0==86) ) {
-                            int LA159_2 = input.LA(2);
+                        if ( (LA166_0==99) ) {
+                            int LA166_2 = input.LA(2);
 
-                            if ( (LA159_2==87) ) {
-                                int LA159_3 = input.LA(3);
+                            if ( (LA166_2==100) ) {
+                                int LA166_3 = input.LA(3);
 
                                 if ( (synpred49_InternalDataDSL()) ) {
-                                    alt159=1;
+                                    alt166=1;
                                 }
 
 
@@ -24361,15 +26072,15 @@
                         }
 
 
-                        switch (alt159) {
+                        switch (alt166) {
                     	case 1 :
-                    	    // InternalDataDSL.g:8935:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
+                    	    // InternalDataDSL.g:9556:5: ( ( () ruleArrayBrackets ) )=> ( () ruleArrayBrackets )
                     	    {
-                    	    // InternalDataDSL.g:8941:5: ( () ruleArrayBrackets )
-                    	    // InternalDataDSL.g:8942:6: () ruleArrayBrackets
+                    	    // InternalDataDSL.g:9562:5: ( () ruleArrayBrackets )
+                    	    // InternalDataDSL.g:9563:6: () ruleArrayBrackets
                     	    {
-                    	    // InternalDataDSL.g:8942:6: ()
-                    	    // InternalDataDSL.g:8943:7: 
+                    	    // InternalDataDSL.g:9563:6: ()
+                    	    // InternalDataDSL.g:9564:7: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -24386,7 +26097,7 @@
                     	      						newCompositeNode(grammarAccess.getJvmTypeReferenceAccess().getArrayBracketsParserRuleCall_0_1_0_1());
                     	      					
                     	    }
-                    	    pushFollow(FOLLOW_133);
+                    	    pushFollow(FOLLOW_139);
                     	    ruleArrayBrackets();
 
                     	    state._fsp--;
@@ -24404,7 +26115,7 @@
                     	    break;
 
                     	default :
-                    	    break loop159;
+                    	    break loop166;
                         }
                     } while (true);
 
@@ -24415,7 +26126,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:8960:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
+                    // InternalDataDSL.g:9581:3: this_XFunctionTypeRef_3= ruleXFunctionTypeRef
                     {
                     if ( state.backtracking==0 ) {
 
@@ -24461,7 +26172,7 @@
 
 
     // $ANTLR start "entryRuleArrayBrackets"
-    // InternalDataDSL.g:8972:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
+    // InternalDataDSL.g:9593:1: entryRuleArrayBrackets returns [String current=null] : iv_ruleArrayBrackets= ruleArrayBrackets EOF ;
     public final String entryRuleArrayBrackets() throws RecognitionException {
         String current = null;
 
@@ -24469,8 +26180,8 @@
 
 
         try {
-            // InternalDataDSL.g:8972:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
-            // InternalDataDSL.g:8973:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
+            // InternalDataDSL.g:9593:53: (iv_ruleArrayBrackets= ruleArrayBrackets EOF )
+            // InternalDataDSL.g:9594:2: iv_ruleArrayBrackets= ruleArrayBrackets EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getArrayBracketsRule()); 
@@ -24501,7 +26212,7 @@
 
 
     // $ANTLR start "ruleArrayBrackets"
-    // InternalDataDSL.g:8979:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
+    // InternalDataDSL.g:9600:1: ruleArrayBrackets returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (kw= '[' kw= ']' ) ;
     public final AntlrDatatypeRuleToken ruleArrayBrackets() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -24511,20 +26222,20 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:8985:2: ( (kw= '[' kw= ']' ) )
-            // InternalDataDSL.g:8986:2: (kw= '[' kw= ']' )
+            // InternalDataDSL.g:9606:2: ( (kw= '[' kw= ']' ) )
+            // InternalDataDSL.g:9607:2: (kw= '[' kw= ']' )
             {
-            // InternalDataDSL.g:8986:2: (kw= '[' kw= ']' )
-            // InternalDataDSL.g:8987:3: kw= '[' kw= ']'
+            // InternalDataDSL.g:9607:2: (kw= '[' kw= ']' )
+            // InternalDataDSL.g:9608:3: kw= '[' kw= ']'
             {
-            kw=(Token)match(input,86,FOLLOW_113); if (state.failed) return current;
+            kw=(Token)match(input,99,FOLLOW_119); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			current.merge(kw);
               			newLeafNode(kw, grammarAccess.getArrayBracketsAccess().getLeftSquareBracketKeyword_0());
               		
             }
-            kw=(Token)match(input,87,FOLLOW_2); if (state.failed) return current;
+            kw=(Token)match(input,100,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			current.merge(kw);
@@ -24556,7 +26267,7 @@
 
 
     // $ANTLR start "entryRuleXFunctionTypeRef"
-    // InternalDataDSL.g:9001:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
+    // InternalDataDSL.g:9622:1: entryRuleXFunctionTypeRef returns [EObject current=null] : iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF ;
     public final EObject entryRuleXFunctionTypeRef() throws RecognitionException {
         EObject current = null;
 
@@ -24564,8 +26275,8 @@
 
 
         try {
-            // InternalDataDSL.g:9001:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
-            // InternalDataDSL.g:9002:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
+            // InternalDataDSL.g:9622:57: (iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF )
+            // InternalDataDSL.g:9623:2: iv_ruleXFunctionTypeRef= ruleXFunctionTypeRef EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXFunctionTypeRefRule()); 
@@ -24596,7 +26307,7 @@
 
 
     // $ANTLR start "ruleXFunctionTypeRef"
-    // InternalDataDSL.g:9008:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
+    // InternalDataDSL.g:9629:1: ruleXFunctionTypeRef returns [EObject current=null] : ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleXFunctionTypeRef() throws RecognitionException {
         EObject current = null;
 
@@ -24615,52 +26326,52 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9014:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
-            // InternalDataDSL.g:9015:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:9635:2: ( ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) ) )
+            // InternalDataDSL.g:9636:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
             {
-            // InternalDataDSL.g:9015:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
-            // InternalDataDSL.g:9016:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:9636:2: ( (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:9637:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )? otherlv_5= '=>' ( (lv_returnType_6_0= ruleJvmTypeReference ) )
             {
-            // InternalDataDSL.g:9016:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
-            int alt163=2;
-            int LA163_0 = input.LA(1);
+            // InternalDataDSL.g:9637:3: (otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')' )?
+            int alt170=2;
+            int LA170_0 = input.LA(1);
 
-            if ( (LA163_0==81) ) {
-                alt163=1;
+            if ( (LA170_0==94) ) {
+                alt170=1;
             }
-            switch (alt163) {
+            switch (alt170) {
                 case 1 :
-                    // InternalDataDSL.g:9017:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
+                    // InternalDataDSL.g:9638:4: otherlv_0= '(' ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )? otherlv_4= ')'
                     {
-                    otherlv_0=(Token)match(input,81,FOLLOW_140); if (state.failed) return current;
+                    otherlv_0=(Token)match(input,94,FOLLOW_146); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_0, grammarAccess.getXFunctionTypeRefAccess().getLeftParenthesisKeyword_0_0());
                       			
                     }
-                    // InternalDataDSL.g:9021:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
-                    int alt162=2;
-                    int LA162_0 = input.LA(1);
+                    // InternalDataDSL.g:9642:4: ( ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )* )?
+                    int alt169=2;
+                    int LA169_0 = input.LA(1);
 
-                    if ( (LA162_0==RULE_ID||LA162_0==81||LA162_0==106) ) {
-                        alt162=1;
+                    if ( (LA169_0==RULE_ID||LA169_0==94||LA169_0==119) ) {
+                        alt169=1;
                     }
-                    switch (alt162) {
+                    switch (alt169) {
                         case 1 :
-                            // InternalDataDSL.g:9022:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            // InternalDataDSL.g:9643:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) ) (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
                             {
-                            // InternalDataDSL.g:9022:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
-                            // InternalDataDSL.g:9023:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalDataDSL.g:9643:5: ( (lv_paramTypes_1_0= ruleJvmTypeReference ) )
+                            // InternalDataDSL.g:9644:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
                             {
-                            // InternalDataDSL.g:9023:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
-                            // InternalDataDSL.g:9024:7: lv_paramTypes_1_0= ruleJvmTypeReference
+                            // InternalDataDSL.g:9644:6: (lv_paramTypes_1_0= ruleJvmTypeReference )
+                            // InternalDataDSL.g:9645:7: lv_paramTypes_1_0= ruleJvmTypeReference
                             {
                             if ( state.backtracking==0 ) {
 
                               							newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_0_0());
                               						
                             }
-                            pushFollow(FOLLOW_75);
+                            pushFollow(FOLLOW_81);
                             lv_paramTypes_1_0=ruleJvmTypeReference();
 
                             state._fsp--;
@@ -24684,39 +26395,39 @@
 
                             }
 
-                            // InternalDataDSL.g:9041:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
-                            loop161:
+                            // InternalDataDSL.g:9662:5: (otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) ) )*
+                            loop168:
                             do {
-                                int alt161=2;
-                                int LA161_0 = input.LA(1);
+                                int alt168=2;
+                                int LA168_0 = input.LA(1);
 
-                                if ( (LA161_0==82) ) {
-                                    alt161=1;
+                                if ( (LA168_0==95) ) {
+                                    alt168=1;
                                 }
 
 
-                                switch (alt161) {
+                                switch (alt168) {
                             	case 1 :
-                            	    // InternalDataDSL.g:9042:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalDataDSL.g:9663:6: otherlv_2= ',' ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
                             	    {
-                            	    otherlv_2=(Token)match(input,82,FOLLOW_91); if (state.failed) return current;
+                            	    otherlv_2=(Token)match(input,95,FOLLOW_97); if (state.failed) return current;
                             	    if ( state.backtracking==0 ) {
 
                             	      						newLeafNode(otherlv_2, grammarAccess.getXFunctionTypeRefAccess().getCommaKeyword_0_1_1_0());
                             	      					
                             	    }
-                            	    // InternalDataDSL.g:9046:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
-                            	    // InternalDataDSL.g:9047:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalDataDSL.g:9667:6: ( (lv_paramTypes_3_0= ruleJvmTypeReference ) )
+                            	    // InternalDataDSL.g:9668:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
                             	    {
-                            	    // InternalDataDSL.g:9047:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
-                            	    // InternalDataDSL.g:9048:8: lv_paramTypes_3_0= ruleJvmTypeReference
+                            	    // InternalDataDSL.g:9668:7: (lv_paramTypes_3_0= ruleJvmTypeReference )
+                            	    // InternalDataDSL.g:9669:8: lv_paramTypes_3_0= ruleJvmTypeReference
                             	    {
                             	    if ( state.backtracking==0 ) {
 
                             	      								newCompositeNode(grammarAccess.getXFunctionTypeRefAccess().getParamTypesJvmTypeReferenceParserRuleCall_0_1_1_1_0());
                             	      							
                             	    }
-                            	    pushFollow(FOLLOW_75);
+                            	    pushFollow(FOLLOW_81);
                             	    lv_paramTypes_3_0=ruleJvmTypeReference();
 
                             	    state._fsp--;
@@ -24745,7 +26456,7 @@
                             	    break;
 
                             	default :
-                            	    break loop161;
+                            	    break loop168;
                                 }
                             } while (true);
 
@@ -24755,7 +26466,7 @@
 
                     }
 
-                    otherlv_4=(Token)match(input,83,FOLLOW_141); if (state.failed) return current;
+                    otherlv_4=(Token)match(input,96,FOLLOW_147); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_4, grammarAccess.getXFunctionTypeRefAccess().getRightParenthesisKeyword_0_2());
@@ -24767,17 +26478,17 @@
 
             }
 
-            otherlv_5=(Token)match(input,106,FOLLOW_91); if (state.failed) return current;
+            otherlv_5=(Token)match(input,119,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_5, grammarAccess.getXFunctionTypeRefAccess().getEqualsSignGreaterThanSignKeyword_1());
               		
             }
-            // InternalDataDSL.g:9076:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:9077:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:9697:3: ( (lv_returnType_6_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:9698:4: (lv_returnType_6_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:9077:4: (lv_returnType_6_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:9078:5: lv_returnType_6_0= ruleJvmTypeReference
+            // InternalDataDSL.g:9698:4: (lv_returnType_6_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:9699:5: lv_returnType_6_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -24833,7 +26544,7 @@
 
 
     // $ANTLR start "entryRuleJvmParameterizedTypeReference"
-    // InternalDataDSL.g:9099:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
+    // InternalDataDSL.g:9720:1: entryRuleJvmParameterizedTypeReference returns [EObject current=null] : iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF ;
     public final EObject entryRuleJvmParameterizedTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -24841,8 +26552,8 @@
 
 
         try {
-            // InternalDataDSL.g:9099:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
-            // InternalDataDSL.g:9100:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
+            // InternalDataDSL.g:9720:70: (iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF )
+            // InternalDataDSL.g:9721:2: iv_ruleJvmParameterizedTypeReference= ruleJvmParameterizedTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceRule()); 
@@ -24873,7 +26584,7 @@
 
 
     // $ANTLR start "ruleJvmParameterizedTypeReference"
-    // InternalDataDSL.g:9106:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
+    // InternalDataDSL.g:9727:1: ruleJvmParameterizedTypeReference returns [EObject current=null] : ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) ;
     public final EObject ruleJvmParameterizedTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -24897,17 +26608,17 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9112:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
-            // InternalDataDSL.g:9113:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            // InternalDataDSL.g:9733:2: ( ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? ) )
+            // InternalDataDSL.g:9734:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
             {
-            // InternalDataDSL.g:9113:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
-            // InternalDataDSL.g:9114:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            // InternalDataDSL.g:9734:2: ( ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )? )
+            // InternalDataDSL.g:9735:3: ( ( ruleQualifiedName ) ) ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
             {
-            // InternalDataDSL.g:9114:3: ( ( ruleQualifiedName ) )
-            // InternalDataDSL.g:9115:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:9735:3: ( ( ruleQualifiedName ) )
+            // InternalDataDSL.g:9736:4: ( ruleQualifiedName )
             {
-            // InternalDataDSL.g:9115:4: ( ruleQualifiedName )
-            // InternalDataDSL.g:9116:5: ruleQualifiedName
+            // InternalDataDSL.g:9736:4: ( ruleQualifiedName )
+            // InternalDataDSL.g:9737:5: ruleQualifiedName
             {
             if ( state.backtracking==0 ) {
 
@@ -24921,7 +26632,7 @@
               					newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_0_0());
               				
             }
-            pushFollow(FOLLOW_142);
+            pushFollow(FOLLOW_148);
             ruleQualifiedName();
 
             state._fsp--;
@@ -24937,17 +26648,17 @@
 
             }
 
-            // InternalDataDSL.g:9130:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
-            int alt168=2;
-            alt168 = dfa168.predict(input);
-            switch (alt168) {
+            // InternalDataDSL.g:9751:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?
+            int alt175=2;
+            alt175 = dfa175.predict(input);
+            switch (alt175) {
                 case 1 :
-                    // InternalDataDSL.g:9131:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    // InternalDataDSL.g:9752:4: ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
                     {
-                    // InternalDataDSL.g:9131:4: ( ( '<' )=>otherlv_1= '<' )
-                    // InternalDataDSL.g:9132:5: ( '<' )=>otherlv_1= '<'
+                    // InternalDataDSL.g:9752:4: ( ( '<' )=>otherlv_1= '<' )
+                    // InternalDataDSL.g:9753:5: ( '<' )=>otherlv_1= '<'
                     {
-                    otherlv_1=(Token)match(input,93,FOLLOW_103); if (state.failed) return current;
+                    otherlv_1=(Token)match(input,106,FOLLOW_109); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       					newLeafNode(otherlv_1, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_0());
@@ -24956,18 +26667,18 @@
 
                     }
 
-                    // InternalDataDSL.g:9138:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
-                    // InternalDataDSL.g:9139:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:9759:4: ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) )
+                    // InternalDataDSL.g:9760:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
                     {
-                    // InternalDataDSL.g:9139:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
-                    // InternalDataDSL.g:9140:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
+                    // InternalDataDSL.g:9760:5: (lv_arguments_2_0= ruleJvmArgumentTypeReference )
+                    // InternalDataDSL.g:9761:6: lv_arguments_2_0= ruleJvmArgumentTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
                       						newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_1_0());
                       					
                     }
-                    pushFollow(FOLLOW_104);
+                    pushFollow(FOLLOW_110);
                     lv_arguments_2_0=ruleJvmArgumentTypeReference();
 
                     state._fsp--;
@@ -24991,39 +26702,39 @@
 
                     }
 
-                    // InternalDataDSL.g:9157:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
-                    loop164:
+                    // InternalDataDSL.g:9778:4: (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )*
+                    loop171:
                     do {
-                        int alt164=2;
-                        int LA164_0 = input.LA(1);
+                        int alt171=2;
+                        int LA171_0 = input.LA(1);
 
-                        if ( (LA164_0==82) ) {
-                            alt164=1;
+                        if ( (LA171_0==95) ) {
+                            alt171=1;
                         }
 
 
-                        switch (alt164) {
+                        switch (alt171) {
                     	case 1 :
-                    	    // InternalDataDSL.g:9158:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:9779:5: otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
                     	    {
-                    	    otherlv_3=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
+                    	    otherlv_3=(Token)match(input,95,FOLLOW_109); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      					newLeafNode(otherlv_3, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_2_0());
                     	      				
                     	    }
-                    	    // InternalDataDSL.g:9162:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
-                    	    // InternalDataDSL.g:9163:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:9783:5: ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) )
+                    	    // InternalDataDSL.g:9784:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
                     	    {
-                    	    // InternalDataDSL.g:9163:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
-                    	    // InternalDataDSL.g:9164:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
+                    	    // InternalDataDSL.g:9784:6: (lv_arguments_4_0= ruleJvmArgumentTypeReference )
+                    	    // InternalDataDSL.g:9785:7: lv_arguments_4_0= ruleJvmArgumentTypeReference
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_2_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_104);
+                    	    pushFollow(FOLLOW_110);
                     	    lv_arguments_4_0=ruleJvmArgumentTypeReference();
 
                     	    state._fsp--;
@@ -25052,30 +26763,30 @@
                     	    break;
 
                     	default :
-                    	    break loop164;
+                    	    break loop171;
                         }
                     } while (true);
 
-                    otherlv_5=(Token)match(input,94,FOLLOW_68); if (state.failed) return current;
+                    otherlv_5=(Token)match(input,107,FOLLOW_74); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				newLeafNode(otherlv_5, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_3());
                       			
                     }
-                    // InternalDataDSL.g:9186:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
-                    loop167:
+                    // InternalDataDSL.g:9807:4: ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )*
+                    loop174:
                     do {
-                        int alt167=2;
-                        int LA167_0 = input.LA(1);
+                        int alt174=2;
+                        int LA174_0 = input.LA(1);
 
-                        if ( (LA167_0==74) ) {
-                            int LA167_2 = input.LA(2);
+                        if ( (LA174_0==87) ) {
+                            int LA174_2 = input.LA(2);
 
-                            if ( (LA167_2==RULE_ID) ) {
-                                int LA167_3 = input.LA(3);
+                            if ( (LA174_2==RULE_ID) ) {
+                                int LA174_3 = input.LA(3);
 
                                 if ( (synpred51_InternalDataDSL()) ) {
-                                    alt167=1;
+                                    alt174=1;
                                 }
 
 
@@ -25085,18 +26796,18 @@
                         }
 
 
-                        switch (alt167) {
+                        switch (alt174) {
                     	case 1 :
-                    	    // InternalDataDSL.g:9187:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    // InternalDataDSL.g:9808:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
                     	    {
-                    	    // InternalDataDSL.g:9187:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
-                    	    // InternalDataDSL.g:9188:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
+                    	    // InternalDataDSL.g:9808:5: ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) )
+                    	    // InternalDataDSL.g:9809:6: ( ( () '.' ) )=> ( () otherlv_7= '.' )
                     	    {
-                    	    // InternalDataDSL.g:9194:6: ( () otherlv_7= '.' )
-                    	    // InternalDataDSL.g:9195:7: () otherlv_7= '.'
+                    	    // InternalDataDSL.g:9815:6: ( () otherlv_7= '.' )
+                    	    // InternalDataDSL.g:9816:7: () otherlv_7= '.'
                     	    {
-                    	    // InternalDataDSL.g:9195:7: ()
-                    	    // InternalDataDSL.g:9196:8: 
+                    	    // InternalDataDSL.g:9816:7: ()
+                    	    // InternalDataDSL.g:9817:8: 
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -25108,7 +26819,7 @@
 
                     	    }
 
-                    	    otherlv_7=(Token)match(input,74,FOLLOW_4); if (state.failed) return current;
+                    	    otherlv_7=(Token)match(input,87,FOLLOW_4); if (state.failed) return current;
                     	    if ( state.backtracking==0 ) {
 
                     	      							newLeafNode(otherlv_7, grammarAccess.getJvmParameterizedTypeReferenceAccess().getFullStopKeyword_1_4_0_0_1());
@@ -25120,11 +26831,11 @@
 
                     	    }
 
-                    	    // InternalDataDSL.g:9208:5: ( ( ruleValidID ) )
-                    	    // InternalDataDSL.g:9209:6: ( ruleValidID )
+                    	    // InternalDataDSL.g:9829:5: ( ( ruleValidID ) )
+                    	    // InternalDataDSL.g:9830:6: ( ruleValidID )
                     	    {
-                    	    // InternalDataDSL.g:9209:6: ( ruleValidID )
-                    	    // InternalDataDSL.g:9210:7: ruleValidID
+                    	    // InternalDataDSL.g:9830:6: ( ruleValidID )
+                    	    // InternalDataDSL.g:9831:7: ruleValidID
                     	    {
                     	    if ( state.backtracking==0 ) {
 
@@ -25138,7 +26849,7 @@
                     	      							newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getTypeJvmTypeCrossReference_1_4_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_143);
+                    	    pushFollow(FOLLOW_149);
                     	    ruleValidID();
 
                     	    state._fsp--;
@@ -25154,17 +26865,17 @@
 
                     	    }
 
-                    	    // InternalDataDSL.g:9224:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
-                    	    int alt166=2;
-                    	    alt166 = dfa166.predict(input);
-                    	    switch (alt166) {
+                    	    // InternalDataDSL.g:9845:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?
+                    	    int alt173=2;
+                    	    alt173 = dfa173.predict(input);
+                    	    switch (alt173) {
                     	        case 1 :
-                    	            // InternalDataDSL.g:9225:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
+                    	            // InternalDataDSL.g:9846:6: ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>'
                     	            {
-                    	            // InternalDataDSL.g:9225:6: ( ( '<' )=>otherlv_9= '<' )
-                    	            // InternalDataDSL.g:9226:7: ( '<' )=>otherlv_9= '<'
+                    	            // InternalDataDSL.g:9846:6: ( ( '<' )=>otherlv_9= '<' )
+                    	            // InternalDataDSL.g:9847:7: ( '<' )=>otherlv_9= '<'
                     	            {
-                    	            otherlv_9=(Token)match(input,93,FOLLOW_103); if (state.failed) return current;
+                    	            otherlv_9=(Token)match(input,106,FOLLOW_109); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
                     	              							newLeafNode(otherlv_9, grammarAccess.getJvmParameterizedTypeReferenceAccess().getLessThanSignKeyword_1_4_2_0());
@@ -25173,18 +26884,18 @@
 
                     	            }
 
-                    	            // InternalDataDSL.g:9232:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
-                    	            // InternalDataDSL.g:9233:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalDataDSL.g:9853:6: ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) )
+                    	            // InternalDataDSL.g:9854:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
                     	            {
-                    	            // InternalDataDSL.g:9233:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
-                    	            // InternalDataDSL.g:9234:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
+                    	            // InternalDataDSL.g:9854:7: (lv_arguments_10_0= ruleJvmArgumentTypeReference )
+                    	            // InternalDataDSL.g:9855:8: lv_arguments_10_0= ruleJvmArgumentTypeReference
                     	            {
                     	            if ( state.backtracking==0 ) {
 
                     	              								newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_1_0());
                     	              							
                     	            }
-                    	            pushFollow(FOLLOW_104);
+                    	            pushFollow(FOLLOW_110);
                     	            lv_arguments_10_0=ruleJvmArgumentTypeReference();
 
                     	            state._fsp--;
@@ -25208,39 +26919,39 @@
 
                     	            }
 
-                    	            // InternalDataDSL.g:9251:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
-                    	            loop165:
+                    	            // InternalDataDSL.g:9872:6: (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )*
+                    	            loop172:
                     	            do {
-                    	                int alt165=2;
-                    	                int LA165_0 = input.LA(1);
+                    	                int alt172=2;
+                    	                int LA172_0 = input.LA(1);
 
-                    	                if ( (LA165_0==82) ) {
-                    	                    alt165=1;
+                    	                if ( (LA172_0==95) ) {
+                    	                    alt172=1;
                     	                }
 
 
-                    	                switch (alt165) {
+                    	                switch (alt172) {
                     	            	case 1 :
-                    	            	    // InternalDataDSL.g:9252:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalDataDSL.g:9873:7: otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
                     	            	    {
-                    	            	    otherlv_11=(Token)match(input,82,FOLLOW_103); if (state.failed) return current;
+                    	            	    otherlv_11=(Token)match(input,95,FOLLOW_109); if (state.failed) return current;
                     	            	    if ( state.backtracking==0 ) {
 
                     	            	      							newLeafNode(otherlv_11, grammarAccess.getJvmParameterizedTypeReferenceAccess().getCommaKeyword_1_4_2_2_0());
                     	            	      						
                     	            	    }
-                    	            	    // InternalDataDSL.g:9256:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
-                    	            	    // InternalDataDSL.g:9257:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalDataDSL.g:9877:7: ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) )
+                    	            	    // InternalDataDSL.g:9878:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
                     	            	    {
-                    	            	    // InternalDataDSL.g:9257:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
-                    	            	    // InternalDataDSL.g:9258:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
+                    	            	    // InternalDataDSL.g:9878:8: (lv_arguments_12_0= ruleJvmArgumentTypeReference )
+                    	            	    // InternalDataDSL.g:9879:9: lv_arguments_12_0= ruleJvmArgumentTypeReference
                     	            	    {
                     	            	    if ( state.backtracking==0 ) {
 
                     	            	      									newCompositeNode(grammarAccess.getJvmParameterizedTypeReferenceAccess().getArgumentsJvmArgumentTypeReferenceParserRuleCall_1_4_2_2_1_0());
                     	            	      								
                     	            	    }
-                    	            	    pushFollow(FOLLOW_104);
+                    	            	    pushFollow(FOLLOW_110);
                     	            	    lv_arguments_12_0=ruleJvmArgumentTypeReference();
 
                     	            	    state._fsp--;
@@ -25269,11 +26980,11 @@
                     	            	    break;
 
                     	            	default :
-                    	            	    break loop165;
+                    	            	    break loop172;
                     	                }
                     	            } while (true);
 
-                    	            otherlv_13=(Token)match(input,94,FOLLOW_68); if (state.failed) return current;
+                    	            otherlv_13=(Token)match(input,107,FOLLOW_74); if (state.failed) return current;
                     	            if ( state.backtracking==0 ) {
 
                     	              						newLeafNode(otherlv_13, grammarAccess.getJvmParameterizedTypeReferenceAccess().getGreaterThanSignKeyword_1_4_2_3());
@@ -25290,7 +27001,7 @@
                     	    break;
 
                     	default :
-                    	    break loop167;
+                    	    break loop174;
                         }
                     } while (true);
 
@@ -25325,7 +27036,7 @@
 
 
     // $ANTLR start "entryRuleJvmArgumentTypeReference"
-    // InternalDataDSL.g:9287:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
+    // InternalDataDSL.g:9908:1: entryRuleJvmArgumentTypeReference returns [EObject current=null] : iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF ;
     public final EObject entryRuleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -25333,8 +27044,8 @@
 
 
         try {
-            // InternalDataDSL.g:9287:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
-            // InternalDataDSL.g:9288:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
+            // InternalDataDSL.g:9908:65: (iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF )
+            // InternalDataDSL.g:9909:2: iv_ruleJvmArgumentTypeReference= ruleJvmArgumentTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmArgumentTypeReferenceRule()); 
@@ -25365,7 +27076,7 @@
 
 
     // $ANTLR start "ruleJvmArgumentTypeReference"
-    // InternalDataDSL.g:9294:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
+    // InternalDataDSL.g:9915:1: ruleJvmArgumentTypeReference returns [EObject current=null] : (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) ;
     public final EObject ruleJvmArgumentTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -25378,29 +27089,29 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9300:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
-            // InternalDataDSL.g:9301:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            // InternalDataDSL.g:9921:2: ( (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference ) )
+            // InternalDataDSL.g:9922:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
             {
-            // InternalDataDSL.g:9301:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
-            int alt169=2;
-            int LA169_0 = input.LA(1);
+            // InternalDataDSL.g:9922:2: (this_JvmTypeReference_0= ruleJvmTypeReference | this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference )
+            int alt176=2;
+            int LA176_0 = input.LA(1);
 
-            if ( (LA169_0==RULE_ID||LA169_0==81||LA169_0==106) ) {
-                alt169=1;
+            if ( (LA176_0==RULE_ID||LA176_0==94||LA176_0==119) ) {
+                alt176=1;
             }
-            else if ( (LA169_0==143) ) {
-                alt169=2;
+            else if ( (LA176_0==156) ) {
+                alt176=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 169, 0, input);
+                    new NoViableAltException("", 176, 0, input);
 
                 throw nvae;
             }
-            switch (alt169) {
+            switch (alt176) {
                 case 1 :
-                    // InternalDataDSL.g:9302:3: this_JvmTypeReference_0= ruleJvmTypeReference
+                    // InternalDataDSL.g:9923:3: this_JvmTypeReference_0= ruleJvmTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -25422,7 +27133,7 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9311:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
+                    // InternalDataDSL.g:9932:3: this_JvmWildcardTypeReference_1= ruleJvmWildcardTypeReference
                     {
                     if ( state.backtracking==0 ) {
 
@@ -25468,7 +27179,7 @@
 
 
     // $ANTLR start "entryRuleJvmWildcardTypeReference"
-    // InternalDataDSL.g:9323:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
+    // InternalDataDSL.g:9944:1: entryRuleJvmWildcardTypeReference returns [EObject current=null] : iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF ;
     public final EObject entryRuleJvmWildcardTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -25476,8 +27187,8 @@
 
 
         try {
-            // InternalDataDSL.g:9323:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
-            // InternalDataDSL.g:9324:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
+            // InternalDataDSL.g:9944:65: (iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF )
+            // InternalDataDSL.g:9945:2: iv_ruleJvmWildcardTypeReference= ruleJvmWildcardTypeReference EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceRule()); 
@@ -25508,7 +27219,7 @@
 
 
     // $ANTLR start "ruleJvmWildcardTypeReference"
-    // InternalDataDSL.g:9330:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
+    // InternalDataDSL.g:9951:1: ruleJvmWildcardTypeReference returns [EObject current=null] : ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) ;
     public final EObject ruleJvmWildcardTypeReference() throws RecognitionException {
         EObject current = null;
 
@@ -25526,14 +27237,14 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9336:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
-            // InternalDataDSL.g:9337:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalDataDSL.g:9957:2: ( ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? ) )
+            // InternalDataDSL.g:9958:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
             {
-            // InternalDataDSL.g:9337:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
-            // InternalDataDSL.g:9338:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            // InternalDataDSL.g:9958:2: ( () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )? )
+            // InternalDataDSL.g:9959:3: () otherlv_1= '?' ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
             {
-            // InternalDataDSL.g:9338:3: ()
-            // InternalDataDSL.g:9339:4: 
+            // InternalDataDSL.g:9959:3: ()
+            // InternalDataDSL.g:9960:4: 
             {
             if ( state.backtracking==0 ) {
 
@@ -25545,41 +27256,41 @@
 
             }
 
-            otherlv_1=(Token)match(input,143,FOLLOW_144); if (state.failed) return current;
+            otherlv_1=(Token)match(input,156,FOLLOW_150); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_1, grammarAccess.getJvmWildcardTypeReferenceAccess().getQuestionMarkKeyword_1());
               		
             }
-            // InternalDataDSL.g:9349:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
-            int alt172=3;
-            int LA172_0 = input.LA(1);
+            // InternalDataDSL.g:9970:3: ( ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* ) | ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* ) )?
+            int alt179=3;
+            int LA179_0 = input.LA(1);
 
-            if ( (LA172_0==130) ) {
-                alt172=1;
+            if ( (LA179_0==143) ) {
+                alt179=1;
             }
-            else if ( (LA172_0==131) ) {
-                alt172=2;
+            else if ( (LA179_0==144) ) {
+                alt179=2;
             }
-            switch (alt172) {
+            switch (alt179) {
                 case 1 :
-                    // InternalDataDSL.g:9350:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalDataDSL.g:9971:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
                     {
-                    // InternalDataDSL.g:9350:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
-                    // InternalDataDSL.g:9351:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    // InternalDataDSL.g:9971:4: ( ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )* )
+                    // InternalDataDSL.g:9972:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) ) ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
                     {
-                    // InternalDataDSL.g:9351:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
-                    // InternalDataDSL.g:9352:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalDataDSL.g:9972:5: ( (lv_constraints_2_0= ruleJvmUpperBound ) )
+                    // InternalDataDSL.g:9973:6: (lv_constraints_2_0= ruleJvmUpperBound )
                     {
-                    // InternalDataDSL.g:9352:6: (lv_constraints_2_0= ruleJvmUpperBound )
-                    // InternalDataDSL.g:9353:7: lv_constraints_2_0= ruleJvmUpperBound
+                    // InternalDataDSL.g:9973:6: (lv_constraints_2_0= ruleJvmUpperBound )
+                    // InternalDataDSL.g:9974:7: lv_constraints_2_0= ruleJvmUpperBound
                     {
                     if ( state.backtracking==0 ) {
 
                       							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundParserRuleCall_2_0_0_0());
                       						
                     }
-                    pushFollow(FOLLOW_145);
+                    pushFollow(FOLLOW_151);
                     lv_constraints_2_0=ruleJvmUpperBound();
 
                     state._fsp--;
@@ -25603,30 +27314,30 @@
 
                     }
 
-                    // InternalDataDSL.g:9370:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
-                    loop170:
+                    // InternalDataDSL.g:9991:5: ( (lv_constraints_3_0= ruleJvmUpperBoundAnded ) )*
+                    loop177:
                     do {
-                        int alt170=2;
-                        int LA170_0 = input.LA(1);
+                        int alt177=2;
+                        int LA177_0 = input.LA(1);
 
-                        if ( (LA170_0==144) ) {
-                            alt170=1;
+                        if ( (LA177_0==157) ) {
+                            alt177=1;
                         }
 
 
-                        switch (alt170) {
+                        switch (alt177) {
                     	case 1 :
-                    	    // InternalDataDSL.g:9371:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalDataDSL.g:9992:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
                     	    {
-                    	    // InternalDataDSL.g:9371:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
-                    	    // InternalDataDSL.g:9372:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
+                    	    // InternalDataDSL.g:9992:6: (lv_constraints_3_0= ruleJvmUpperBoundAnded )
+                    	    // InternalDataDSL.g:9993:7: lv_constraints_3_0= ruleJvmUpperBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmUpperBoundAndedParserRuleCall_2_0_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_145);
+                    	    pushFollow(FOLLOW_151);
                     	    lv_constraints_3_0=ruleJvmUpperBoundAnded();
 
                     	    state._fsp--;
@@ -25652,7 +27363,7 @@
                     	    break;
 
                     	default :
-                    	    break loop170;
+                    	    break loop177;
                         }
                     } while (true);
 
@@ -25663,23 +27374,23 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9391:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalDataDSL.g:10012:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
                     {
-                    // InternalDataDSL.g:9391:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
-                    // InternalDataDSL.g:9392:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    // InternalDataDSL.g:10012:4: ( ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )* )
+                    // InternalDataDSL.g:10013:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) ) ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
                     {
-                    // InternalDataDSL.g:9392:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
-                    // InternalDataDSL.g:9393:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalDataDSL.g:10013:5: ( (lv_constraints_4_0= ruleJvmLowerBound ) )
+                    // InternalDataDSL.g:10014:6: (lv_constraints_4_0= ruleJvmLowerBound )
                     {
-                    // InternalDataDSL.g:9393:6: (lv_constraints_4_0= ruleJvmLowerBound )
-                    // InternalDataDSL.g:9394:7: lv_constraints_4_0= ruleJvmLowerBound
+                    // InternalDataDSL.g:10014:6: (lv_constraints_4_0= ruleJvmLowerBound )
+                    // InternalDataDSL.g:10015:7: lv_constraints_4_0= ruleJvmLowerBound
                     {
                     if ( state.backtracking==0 ) {
 
                       							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundParserRuleCall_2_1_0_0());
                       						
                     }
-                    pushFollow(FOLLOW_145);
+                    pushFollow(FOLLOW_151);
                     lv_constraints_4_0=ruleJvmLowerBound();
 
                     state._fsp--;
@@ -25703,30 +27414,30 @@
 
                     }
 
-                    // InternalDataDSL.g:9411:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
-                    loop171:
+                    // InternalDataDSL.g:10032:5: ( (lv_constraints_5_0= ruleJvmLowerBoundAnded ) )*
+                    loop178:
                     do {
-                        int alt171=2;
-                        int LA171_0 = input.LA(1);
+                        int alt178=2;
+                        int LA178_0 = input.LA(1);
 
-                        if ( (LA171_0==144) ) {
-                            alt171=1;
+                        if ( (LA178_0==157) ) {
+                            alt178=1;
                         }
 
 
-                        switch (alt171) {
+                        switch (alt178) {
                     	case 1 :
-                    	    // InternalDataDSL.g:9412:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalDataDSL.g:10033:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
                     	    {
-                    	    // InternalDataDSL.g:9412:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
-                    	    // InternalDataDSL.g:9413:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
+                    	    // InternalDataDSL.g:10033:6: (lv_constraints_5_0= ruleJvmLowerBoundAnded )
+                    	    // InternalDataDSL.g:10034:7: lv_constraints_5_0= ruleJvmLowerBoundAnded
                     	    {
                     	    if ( state.backtracking==0 ) {
 
                     	      							newCompositeNode(grammarAccess.getJvmWildcardTypeReferenceAccess().getConstraintsJvmLowerBoundAndedParserRuleCall_2_1_1_0());
                     	      						
                     	    }
-                    	    pushFollow(FOLLOW_145);
+                    	    pushFollow(FOLLOW_151);
                     	    lv_constraints_5_0=ruleJvmLowerBoundAnded();
 
                     	    state._fsp--;
@@ -25752,7 +27463,7 @@
                     	    break;
 
                     	default :
-                    	    break loop171;
+                    	    break loop178;
                         }
                     } while (true);
 
@@ -25790,7 +27501,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBound"
-    // InternalDataDSL.g:9436:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
+    // InternalDataDSL.g:10057:1: entryRuleJvmUpperBound returns [EObject current=null] : iv_ruleJvmUpperBound= ruleJvmUpperBound EOF ;
     public final EObject entryRuleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -25798,8 +27509,8 @@
 
 
         try {
-            // InternalDataDSL.g:9436:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
-            // InternalDataDSL.g:9437:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
+            // InternalDataDSL.g:10057:54: (iv_ruleJvmUpperBound= ruleJvmUpperBound EOF )
+            // InternalDataDSL.g:10058:2: iv_ruleJvmUpperBound= ruleJvmUpperBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundRule()); 
@@ -25830,7 +27541,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBound"
-    // InternalDataDSL.g:9443:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalDataDSL.g:10064:1: ruleJvmUpperBound returns [EObject current=null] : (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBound() throws RecognitionException {
         EObject current = null;
 
@@ -25842,23 +27553,23 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9449:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalDataDSL.g:9450:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10070:2: ( (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalDataDSL.g:10071:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalDataDSL.g:9450:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalDataDSL.g:9451:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10071:2: (otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10072:3: otherlv_0= 'extends' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,130,FOLLOW_91); if (state.failed) return current;
+            otherlv_0=(Token)match(input,143,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAccess().getExtendsKeyword_0());
               		
             }
-            // InternalDataDSL.g:9455:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:9456:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10076:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10077:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:9456:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:9457:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalDataDSL.g:10077:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10078:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -25914,7 +27625,7 @@
 
 
     // $ANTLR start "entryRuleJvmUpperBoundAnded"
-    // InternalDataDSL.g:9478:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
+    // InternalDataDSL.g:10099:1: entryRuleJvmUpperBoundAnded returns [EObject current=null] : iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF ;
     public final EObject entryRuleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -25922,8 +27633,8 @@
 
 
         try {
-            // InternalDataDSL.g:9478:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
-            // InternalDataDSL.g:9479:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
+            // InternalDataDSL.g:10099:59: (iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF )
+            // InternalDataDSL.g:10100:2: iv_ruleJvmUpperBoundAnded= ruleJvmUpperBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmUpperBoundAndedRule()); 
@@ -25954,7 +27665,7 @@
 
 
     // $ANTLR start "ruleJvmUpperBoundAnded"
-    // InternalDataDSL.g:9485:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalDataDSL.g:10106:1: ruleJvmUpperBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmUpperBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -25966,23 +27677,23 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9491:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalDataDSL.g:9492:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10112:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalDataDSL.g:10113:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalDataDSL.g:9492:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalDataDSL.g:9493:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10113:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10114:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,144,FOLLOW_91); if (state.failed) return current;
+            otherlv_0=(Token)match(input,157,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_0, grammarAccess.getJvmUpperBoundAndedAccess().getAmpersandKeyword_0());
               		
             }
-            // InternalDataDSL.g:9497:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:9498:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10118:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10119:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:9498:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:9499:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalDataDSL.g:10119:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10120:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -26038,7 +27749,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBound"
-    // InternalDataDSL.g:9520:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
+    // InternalDataDSL.g:10141:1: entryRuleJvmLowerBound returns [EObject current=null] : iv_ruleJvmLowerBound= ruleJvmLowerBound EOF ;
     public final EObject entryRuleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -26046,8 +27757,8 @@
 
 
         try {
-            // InternalDataDSL.g:9520:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
-            // InternalDataDSL.g:9521:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
+            // InternalDataDSL.g:10141:54: (iv_ruleJvmLowerBound= ruleJvmLowerBound EOF )
+            // InternalDataDSL.g:10142:2: iv_ruleJvmLowerBound= ruleJvmLowerBound EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundRule()); 
@@ -26078,7 +27789,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBound"
-    // InternalDataDSL.g:9527:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalDataDSL.g:10148:1: ruleJvmLowerBound returns [EObject current=null] : (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBound() throws RecognitionException {
         EObject current = null;
 
@@ -26090,23 +27801,23 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9533:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalDataDSL.g:9534:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10154:2: ( (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalDataDSL.g:10155:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalDataDSL.g:9534:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalDataDSL.g:9535:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10155:2: (otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10156:3: otherlv_0= 'super' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,131,FOLLOW_91); if (state.failed) return current;
+            otherlv_0=(Token)match(input,144,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAccess().getSuperKeyword_0());
               		
             }
-            // InternalDataDSL.g:9539:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:9540:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10160:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10161:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:9540:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:9541:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalDataDSL.g:10161:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10162:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -26162,7 +27873,7 @@
 
 
     // $ANTLR start "entryRuleJvmLowerBoundAnded"
-    // InternalDataDSL.g:9562:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
+    // InternalDataDSL.g:10183:1: entryRuleJvmLowerBoundAnded returns [EObject current=null] : iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF ;
     public final EObject entryRuleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -26170,8 +27881,8 @@
 
 
         try {
-            // InternalDataDSL.g:9562:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
-            // InternalDataDSL.g:9563:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
+            // InternalDataDSL.g:10183:59: (iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF )
+            // InternalDataDSL.g:10184:2: iv_ruleJvmLowerBoundAnded= ruleJvmLowerBoundAnded EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getJvmLowerBoundAndedRule()); 
@@ -26202,7 +27913,7 @@
 
 
     // $ANTLR start "ruleJvmLowerBoundAnded"
-    // InternalDataDSL.g:9569:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
+    // InternalDataDSL.g:10190:1: ruleJvmLowerBoundAnded returns [EObject current=null] : (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) ;
     public final EObject ruleJvmLowerBoundAnded() throws RecognitionException {
         EObject current = null;
 
@@ -26214,23 +27925,23 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9575:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
-            // InternalDataDSL.g:9576:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10196:2: ( (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) ) )
+            // InternalDataDSL.g:10197:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
             {
-            // InternalDataDSL.g:9576:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
-            // InternalDataDSL.g:9577:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10197:2: (otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) ) )
+            // InternalDataDSL.g:10198:3: otherlv_0= '&' ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
             {
-            otherlv_0=(Token)match(input,144,FOLLOW_91); if (state.failed) return current;
+            otherlv_0=(Token)match(input,157,FOLLOW_97); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			newLeafNode(otherlv_0, grammarAccess.getJvmLowerBoundAndedAccess().getAmpersandKeyword_0());
               		
             }
-            // InternalDataDSL.g:9581:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
-            // InternalDataDSL.g:9582:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10202:3: ( (lv_typeReference_1_0= ruleJvmTypeReference ) )
+            // InternalDataDSL.g:10203:4: (lv_typeReference_1_0= ruleJvmTypeReference )
             {
-            // InternalDataDSL.g:9582:4: (lv_typeReference_1_0= ruleJvmTypeReference )
-            // InternalDataDSL.g:9583:5: lv_typeReference_1_0= ruleJvmTypeReference
+            // InternalDataDSL.g:10203:4: (lv_typeReference_1_0= ruleJvmTypeReference )
+            // InternalDataDSL.g:10204:5: lv_typeReference_1_0= ruleJvmTypeReference
             {
             if ( state.backtracking==0 ) {
 
@@ -26286,7 +27997,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameWithWildcard"
-    // InternalDataDSL.g:9604:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
+    // InternalDataDSL.g:10225:1: entryRuleQualifiedNameWithWildcard returns [String current=null] : iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF ;
     public final String entryRuleQualifiedNameWithWildcard() throws RecognitionException {
         String current = null;
 
@@ -26294,8 +28005,8 @@
 
 
         try {
-            // InternalDataDSL.g:9604:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
-            // InternalDataDSL.g:9605:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
+            // InternalDataDSL.g:10225:65: (iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF )
+            // InternalDataDSL.g:10226:2: iv_ruleQualifiedNameWithWildcard= ruleQualifiedNameWithWildcard EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameWithWildcardRule()); 
@@ -26326,7 +28037,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameWithWildcard"
-    // InternalDataDSL.g:9611:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
+    // InternalDataDSL.g:10232:1: ruleQualifiedNameWithWildcard returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameWithWildcard() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26338,18 +28049,18 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9617:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
-            // InternalDataDSL.g:9618:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalDataDSL.g:10238:2: ( (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' ) )
+            // InternalDataDSL.g:10239:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
             {
-            // InternalDataDSL.g:9618:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
-            // InternalDataDSL.g:9619:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
+            // InternalDataDSL.g:10239:2: (this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*' )
+            // InternalDataDSL.g:10240:3: this_QualifiedName_0= ruleQualifiedName kw= '.' kw= '*'
             {
             if ( state.backtracking==0 ) {
 
               			newCompositeNode(grammarAccess.getQualifiedNameWithWildcardAccess().getQualifiedNameParserRuleCall_0());
               		
             }
-            pushFollow(FOLLOW_146);
+            pushFollow(FOLLOW_152);
             this_QualifiedName_0=ruleQualifiedName();
 
             state._fsp--;
@@ -26364,14 +28075,14 @@
               			afterParserOrEnumRuleCall();
               		
             }
-            kw=(Token)match(input,74,FOLLOW_147); if (state.failed) return current;
+            kw=(Token)match(input,87,FOLLOW_153); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			current.merge(kw);
               			newLeafNode(kw, grammarAccess.getQualifiedNameWithWildcardAccess().getFullStopKeyword_1());
               		
             }
-            kw=(Token)match(input,77,FOLLOW_2); if (state.failed) return current;
+            kw=(Token)match(input,90,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
 
               			current.merge(kw);
@@ -26403,7 +28114,7 @@
 
 
     // $ANTLR start "entryRuleValidID"
-    // InternalDataDSL.g:9643:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
+    // InternalDataDSL.g:10264:1: entryRuleValidID returns [String current=null] : iv_ruleValidID= ruleValidID EOF ;
     public final String entryRuleValidID() throws RecognitionException {
         String current = null;
 
@@ -26411,8 +28122,8 @@
 
 
         try {
-            // InternalDataDSL.g:9643:47: (iv_ruleValidID= ruleValidID EOF )
-            // InternalDataDSL.g:9644:2: iv_ruleValidID= ruleValidID EOF
+            // InternalDataDSL.g:10264:47: (iv_ruleValidID= ruleValidID EOF )
+            // InternalDataDSL.g:10265:2: iv_ruleValidID= ruleValidID EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getValidIDRule()); 
@@ -26443,7 +28154,7 @@
 
 
     // $ANTLR start "ruleValidID"
-    // InternalDataDSL.g:9650:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
+    // InternalDataDSL.g:10271:1: ruleValidID returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : this_ID_0= RULE_ID ;
     public final AntlrDatatypeRuleToken ruleValidID() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26453,8 +28164,8 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9656:2: (this_ID_0= RULE_ID )
-            // InternalDataDSL.g:9657:2: this_ID_0= RULE_ID
+            // InternalDataDSL.g:10277:2: (this_ID_0= RULE_ID )
+            // InternalDataDSL.g:10278:2: this_ID_0= RULE_ID
             {
             this_ID_0=(Token)match(input,RULE_ID,FOLLOW_2); if (state.failed) return current;
             if ( state.backtracking==0 ) {
@@ -26489,7 +28200,7 @@
 
 
     // $ANTLR start "entryRuleXImportSection"
-    // InternalDataDSL.g:9667:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
+    // InternalDataDSL.g:10288:1: entryRuleXImportSection returns [EObject current=null] : iv_ruleXImportSection= ruleXImportSection EOF ;
     public final EObject entryRuleXImportSection() throws RecognitionException {
         EObject current = null;
 
@@ -26497,8 +28208,8 @@
 
 
         try {
-            // InternalDataDSL.g:9667:55: (iv_ruleXImportSection= ruleXImportSection EOF )
-            // InternalDataDSL.g:9668:2: iv_ruleXImportSection= ruleXImportSection EOF
+            // InternalDataDSL.g:10288:55: (iv_ruleXImportSection= ruleXImportSection EOF )
+            // InternalDataDSL.g:10289:2: iv_ruleXImportSection= ruleXImportSection EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getXImportSectionRule()); 
@@ -26529,7 +28240,7 @@
 
 
     // $ANTLR start "ruleXImportSection"
-    // InternalDataDSL.g:9674:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
+    // InternalDataDSL.g:10295:1: ruleXImportSection returns [EObject current=null] : ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ ;
     public final EObject ruleXImportSection() throws RecognitionException {
         EObject current = null;
 
@@ -26540,34 +28251,34 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9680:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
-            // InternalDataDSL.g:9681:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            // InternalDataDSL.g:10301:2: ( ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+ )
+            // InternalDataDSL.g:10302:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
             {
-            // InternalDataDSL.g:9681:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
-            int cnt173=0;
-            loop173:
+            // InternalDataDSL.g:10302:2: ( (lv_importDeclarations_0_0= ruleXImportDeclaration ) )+
+            int cnt180=0;
+            loop180:
             do {
-                int alt173=2;
-                int LA173_0 = input.LA(1);
+                int alt180=2;
+                int LA180_0 = input.LA(1);
 
-                if ( (LA173_0==75) ) {
-                    alt173=1;
+                if ( (LA180_0==88) ) {
+                    alt180=1;
                 }
 
 
-                switch (alt173) {
+                switch (alt180) {
             	case 1 :
-            	    // InternalDataDSL.g:9682:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalDataDSL.g:10303:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
             	    {
-            	    // InternalDataDSL.g:9682:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
-            	    // InternalDataDSL.g:9683:4: lv_importDeclarations_0_0= ruleXImportDeclaration
+            	    // InternalDataDSL.g:10303:3: (lv_importDeclarations_0_0= ruleXImportDeclaration )
+            	    // InternalDataDSL.g:10304:4: lv_importDeclarations_0_0= ruleXImportDeclaration
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      				newCompositeNode(grammarAccess.getXImportSectionAccess().getImportDeclarationsXImportDeclarationParserRuleCall_0());
             	      			
             	    }
-            	    pushFollow(FOLLOW_148);
+            	    pushFollow(FOLLOW_154);
             	    lv_importDeclarations_0_0=ruleXImportDeclaration();
 
             	    state._fsp--;
@@ -26593,13 +28304,13 @@
             	    break;
 
             	default :
-            	    if ( cnt173 >= 1 ) break loop173;
+            	    if ( cnt180 >= 1 ) break loop180;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(173, input);
+                            new EarlyExitException(180, input);
                         throw eee;
                 }
-                cnt173++;
+                cnt180++;
             } while (true);
 
 
@@ -26624,7 +28335,7 @@
 
 
     // $ANTLR start "entryRuleQualifiedNameInStaticImport"
-    // InternalDataDSL.g:9703:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
+    // InternalDataDSL.g:10324:1: entryRuleQualifiedNameInStaticImport returns [String current=null] : iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF ;
     public final String entryRuleQualifiedNameInStaticImport() throws RecognitionException {
         String current = null;
 
@@ -26632,8 +28343,8 @@
 
 
         try {
-            // InternalDataDSL.g:9703:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
-            // InternalDataDSL.g:9704:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
+            // InternalDataDSL.g:10324:67: (iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF )
+            // InternalDataDSL.g:10325:2: iv_ruleQualifiedNameInStaticImport= ruleQualifiedNameInStaticImport EOF
             {
             if ( state.backtracking==0 ) {
                newCompositeNode(grammarAccess.getQualifiedNameInStaticImportRule()); 
@@ -26664,7 +28375,7 @@
 
 
     // $ANTLR start "ruleQualifiedNameInStaticImport"
-    // InternalDataDSL.g:9710:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
+    // InternalDataDSL.g:10331:1: ruleQualifiedNameInStaticImport returns [AntlrDatatypeRuleToken current=new AntlrDatatypeRuleToken()] : (this_ValidID_0= ruleValidID kw= '.' )+ ;
     public final AntlrDatatypeRuleToken ruleQualifiedNameInStaticImport() throws RecognitionException {
         AntlrDatatypeRuleToken current = new AntlrDatatypeRuleToken();
 
@@ -26676,37 +28387,37 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9716:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
-            // InternalDataDSL.g:9717:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            // InternalDataDSL.g:10337:2: ( (this_ValidID_0= ruleValidID kw= '.' )+ )
+            // InternalDataDSL.g:10338:2: (this_ValidID_0= ruleValidID kw= '.' )+
             {
-            // InternalDataDSL.g:9717:2: (this_ValidID_0= ruleValidID kw= '.' )+
-            int cnt174=0;
-            loop174:
+            // InternalDataDSL.g:10338:2: (this_ValidID_0= ruleValidID kw= '.' )+
+            int cnt181=0;
+            loop181:
             do {
-                int alt174=2;
-                int LA174_0 = input.LA(1);
+                int alt181=2;
+                int LA181_0 = input.LA(1);
 
-                if ( (LA174_0==RULE_ID) ) {
-                    int LA174_2 = input.LA(2);
+                if ( (LA181_0==RULE_ID) ) {
+                    int LA181_2 = input.LA(2);
 
-                    if ( (LA174_2==74) ) {
-                        alt174=1;
+                    if ( (LA181_2==87) ) {
+                        alt181=1;
                     }
 
 
                 }
 
 
-                switch (alt174) {
+                switch (alt181) {
             	case 1 :
-            	    // InternalDataDSL.g:9718:3: this_ValidID_0= ruleValidID kw= '.'
+            	    // InternalDataDSL.g:10339:3: this_ValidID_0= ruleValidID kw= '.'
             	    {
             	    if ( state.backtracking==0 ) {
 
             	      			newCompositeNode(grammarAccess.getQualifiedNameInStaticImportAccess().getValidIDParserRuleCall_0());
             	      		
             	    }
-            	    pushFollow(FOLLOW_146);
+            	    pushFollow(FOLLOW_152);
             	    this_ValidID_0=ruleValidID();
 
             	    state._fsp--;
@@ -26721,7 +28432,7 @@
             	      			afterParserOrEnumRuleCall();
             	      		
             	    }
-            	    kw=(Token)match(input,74,FOLLOW_56); if (state.failed) return current;
+            	    kw=(Token)match(input,87,FOLLOW_58); if (state.failed) return current;
             	    if ( state.backtracking==0 ) {
 
             	      			current.merge(kw);
@@ -26733,13 +28444,13 @@
             	    break;
 
             	default :
-            	    if ( cnt174 >= 1 ) break loop174;
+            	    if ( cnt181 >= 1 ) break loop181;
             	    if (state.backtracking>0) {state.failed=true; return current;}
                         EarlyExitException eee =
-                            new EarlyExitException(174, input);
+                            new EarlyExitException(181, input);
                         throw eee;
                 }
-                cnt174++;
+                cnt181++;
             } while (true);
 
 
@@ -26764,7 +28475,7 @@
 
 
     // $ANTLR start "rulePredefinedBlobMimeTypeEnum"
-    // InternalDataDSL.g:9737:1: rulePredefinedBlobMimeTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) ) ;
+    // InternalDataDSL.g:10358:1: rulePredefinedBlobMimeTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) ) ;
     public final Enumerator rulePredefinedBlobMimeTypeEnum() throws RecognitionException {
         Enumerator current = null;
 
@@ -26779,58 +28490,58 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9743:2: ( ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) ) )
-            // InternalDataDSL.g:9744:2: ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) )
+            // InternalDataDSL.g:10364:2: ( ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) ) )
+            // InternalDataDSL.g:10365:2: ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) )
             {
-            // InternalDataDSL.g:9744:2: ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) )
-            int alt175=6;
+            // InternalDataDSL.g:10365:2: ( (enumLiteral_0= 'plain' ) | (enumLiteral_1= 'jpg' ) | (enumLiteral_2= 'png' ) | (enumLiteral_3= 'mpeg' ) | (enumLiteral_4= 'octet-stream' ) | (enumLiteral_5= 'pdf' ) )
+            int alt182=6;
             switch ( input.LA(1) ) {
-            case 145:
+            case 158:
                 {
-                alt175=1;
+                alt182=1;
                 }
                 break;
-            case 146:
+            case 159:
                 {
-                alt175=2;
+                alt182=2;
                 }
                 break;
-            case 147:
+            case 160:
                 {
-                alt175=3;
+                alt182=3;
                 }
                 break;
-            case 148:
+            case 161:
                 {
-                alt175=4;
+                alt182=4;
                 }
                 break;
-            case 149:
+            case 162:
                 {
-                alt175=5;
+                alt182=5;
                 }
                 break;
-            case 150:
+            case 163:
                 {
-                alt175=6;
+                alt182=6;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 175, 0, input);
+                    new NoViableAltException("", 182, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt175) {
+            switch (alt182) {
                 case 1 :
-                    // InternalDataDSL.g:9745:3: (enumLiteral_0= 'plain' )
+                    // InternalDataDSL.g:10366:3: (enumLiteral_0= 'plain' )
                     {
-                    // InternalDataDSL.g:9745:3: (enumLiteral_0= 'plain' )
-                    // InternalDataDSL.g:9746:4: enumLiteral_0= 'plain'
+                    // InternalDataDSL.g:10366:3: (enumLiteral_0= 'plain' )
+                    // InternalDataDSL.g:10367:4: enumLiteral_0= 'plain'
                     {
-                    enumLiteral_0=(Token)match(input,145,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,158,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPlainEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
@@ -26844,12 +28555,12 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9753:3: (enumLiteral_1= 'jpg' )
+                    // InternalDataDSL.g:10374:3: (enumLiteral_1= 'jpg' )
                     {
-                    // InternalDataDSL.g:9753:3: (enumLiteral_1= 'jpg' )
-                    // InternalDataDSL.g:9754:4: enumLiteral_1= 'jpg'
+                    // InternalDataDSL.g:10374:3: (enumLiteral_1= 'jpg' )
+                    // InternalDataDSL.g:10375:4: enumLiteral_1= 'jpg'
                     {
-                    enumLiteral_1=(Token)match(input,146,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,159,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getJpgEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
@@ -26863,12 +28574,12 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:9761:3: (enumLiteral_2= 'png' )
+                    // InternalDataDSL.g:10382:3: (enumLiteral_2= 'png' )
                     {
-                    // InternalDataDSL.g:9761:3: (enumLiteral_2= 'png' )
-                    // InternalDataDSL.g:9762:4: enumLiteral_2= 'png'
+                    // InternalDataDSL.g:10382:3: (enumLiteral_2= 'png' )
+                    // InternalDataDSL.g:10383:4: enumLiteral_2= 'png'
                     {
-                    enumLiteral_2=(Token)match(input,147,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,160,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPngEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
@@ -26882,12 +28593,12 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:9769:3: (enumLiteral_3= 'mpeg' )
+                    // InternalDataDSL.g:10390:3: (enumLiteral_3= 'mpeg' )
                     {
-                    // InternalDataDSL.g:9769:3: (enumLiteral_3= 'mpeg' )
-                    // InternalDataDSL.g:9770:4: enumLiteral_3= 'mpeg'
+                    // InternalDataDSL.g:10390:3: (enumLiteral_3= 'mpeg' )
+                    // InternalDataDSL.g:10391:4: enumLiteral_3= 'mpeg'
                     {
-                    enumLiteral_3=(Token)match(input,148,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_3=(Token)match(input,161,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getMpegEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
@@ -26901,12 +28612,12 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:9777:3: (enumLiteral_4= 'octet-stream' )
+                    // InternalDataDSL.g:10398:3: (enumLiteral_4= 'octet-stream' )
                     {
-                    // InternalDataDSL.g:9777:3: (enumLiteral_4= 'octet-stream' )
-                    // InternalDataDSL.g:9778:4: enumLiteral_4= 'octet-stream'
+                    // InternalDataDSL.g:10398:3: (enumLiteral_4= 'octet-stream' )
+                    // InternalDataDSL.g:10399:4: enumLiteral_4= 'octet-stream'
                     {
-                    enumLiteral_4=(Token)match(input,149,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_4=(Token)match(input,162,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getOctetstreamEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
@@ -26920,12 +28631,12 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:9785:3: (enumLiteral_5= 'pdf' )
+                    // InternalDataDSL.g:10406:3: (enumLiteral_5= 'pdf' )
                     {
-                    // InternalDataDSL.g:9785:3: (enumLiteral_5= 'pdf' )
-                    // InternalDataDSL.g:9786:4: enumLiteral_5= 'pdf'
+                    // InternalDataDSL.g:10406:3: (enumLiteral_5= 'pdf' )
+                    // InternalDataDSL.g:10407:4: enumLiteral_5= 'pdf'
                     {
-                    enumLiteral_5=(Token)match(input,150,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_5=(Token)match(input,163,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBlobMimeTypeEnumAccess().getPdfEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
@@ -26963,7 +28674,7 @@
 
 
     // $ANTLR start "rulePredefinedBeanEnum"
-    // InternalDataDSL.g:9796:1: rulePredefinedBeanEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) ) ;
+    // InternalDataDSL.g:10417:1: rulePredefinedBeanEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) ) ;
     public final Enumerator rulePredefinedBeanEnum() throws RecognitionException {
         Enumerator current = null;
 
@@ -26975,43 +28686,43 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9802:2: ( ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) ) )
-            // InternalDataDSL.g:9803:2: ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) )
+            // InternalDataDSL.g:10423:2: ( ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) ) )
+            // InternalDataDSL.g:10424:2: ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) )
             {
-            // InternalDataDSL.g:9803:2: ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) )
-            int alt176=3;
+            // InternalDataDSL.g:10424:2: ( (enumLiteral_0= 'NowDate' ) | (enumLiteral_1= 'StartDate' ) | (enumLiteral_2= 'UniversallyUniqueIdentifier' ) )
+            int alt183=3;
             switch ( input.LA(1) ) {
-            case 151:
+            case 164:
                 {
-                alt176=1;
+                alt183=1;
                 }
                 break;
-            case 152:
+            case 165:
                 {
-                alt176=2;
+                alt183=2;
                 }
                 break;
-            case 153:
+            case 166:
                 {
-                alt176=3;
+                alt183=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 176, 0, input);
+                    new NoViableAltException("", 183, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt176) {
+            switch (alt183) {
                 case 1 :
-                    // InternalDataDSL.g:9804:3: (enumLiteral_0= 'NowDate' )
+                    // InternalDataDSL.g:10425:3: (enumLiteral_0= 'NowDate' )
                     {
-                    // InternalDataDSL.g:9804:3: (enumLiteral_0= 'NowDate' )
-                    // InternalDataDSL.g:9805:4: enumLiteral_0= 'NowDate'
+                    // InternalDataDSL.g:10425:3: (enumLiteral_0= 'NowDate' )
+                    // InternalDataDSL.g:10426:4: enumLiteral_0= 'NowDate'
                     {
-                    enumLiteral_0=(Token)match(input,151,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,164,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanEnumAccess().getNowEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
@@ -27025,12 +28736,12 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9812:3: (enumLiteral_1= 'StartDate' )
+                    // InternalDataDSL.g:10433:3: (enumLiteral_1= 'StartDate' )
                     {
-                    // InternalDataDSL.g:9812:3: (enumLiteral_1= 'StartDate' )
-                    // InternalDataDSL.g:9813:4: enumLiteral_1= 'StartDate'
+                    // InternalDataDSL.g:10433:3: (enumLiteral_1= 'StartDate' )
+                    // InternalDataDSL.g:10434:4: enumLiteral_1= 'StartDate'
                     {
-                    enumLiteral_1=(Token)match(input,152,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,165,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanEnumAccess().getStartEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
@@ -27044,12 +28755,12 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:9820:3: (enumLiteral_2= 'UniversallyUniqueIdentifier' )
+                    // InternalDataDSL.g:10441:3: (enumLiteral_2= 'UniversallyUniqueIdentifier' )
                     {
-                    // InternalDataDSL.g:9820:3: (enumLiteral_2= 'UniversallyUniqueIdentifier' )
-                    // InternalDataDSL.g:9821:4: enumLiteral_2= 'UniversallyUniqueIdentifier'
+                    // InternalDataDSL.g:10441:3: (enumLiteral_2= 'UniversallyUniqueIdentifier' )
+                    // InternalDataDSL.g:10442:4: enumLiteral_2= 'UniversallyUniqueIdentifier'
                     {
-                    enumLiteral_2=(Token)match(input,153,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,166,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanEnumAccess().getUUIDEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
@@ -27087,7 +28798,7 @@
 
 
     // $ANTLR start "rulePredefinedBeanTypeEnum"
-    // InternalDataDSL.g:9831:1: rulePredefinedBeanTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) ) ;
+    // InternalDataDSL.g:10452:1: rulePredefinedBeanTypeEnum returns [Enumerator current=null] : ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) ) ;
     public final Enumerator rulePredefinedBeanTypeEnum() throws RecognitionException {
         Enumerator current = null;
 
@@ -27101,53 +28812,53 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9837:2: ( ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) ) )
-            // InternalDataDSL.g:9838:2: ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) )
+            // InternalDataDSL.g:10458:2: ( ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) ) )
+            // InternalDataDSL.g:10459:2: ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) )
             {
-            // InternalDataDSL.g:9838:2: ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) )
-            int alt177=5;
+            // InternalDataDSL.g:10459:2: ( (enumLiteral_0= 'Date' ) | (enumLiteral_1= 'Milliseconds' ) | (enumLiteral_2= 'Nanoseconds' ) | (enumLiteral_3= 'Random' ) | (enumLiteral_4= 'ExecuteContext' ) )
+            int alt184=5;
             switch ( input.LA(1) ) {
-            case 154:
+            case 167:
                 {
-                alt177=1;
+                alt184=1;
                 }
                 break;
-            case 155:
+            case 168:
                 {
-                alt177=2;
+                alt184=2;
                 }
                 break;
-            case 156:
+            case 169:
                 {
-                alt177=3;
+                alt184=3;
                 }
                 break;
-            case 157:
+            case 170:
                 {
-                alt177=4;
+                alt184=4;
                 }
                 break;
-            case 158:
+            case 171:
                 {
-                alt177=5;
+                alt184=5;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 177, 0, input);
+                    new NoViableAltException("", 184, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt177) {
+            switch (alt184) {
                 case 1 :
-                    // InternalDataDSL.g:9839:3: (enumLiteral_0= 'Date' )
+                    // InternalDataDSL.g:10460:3: (enumLiteral_0= 'Date' )
                     {
-                    // InternalDataDSL.g:9839:3: (enumLiteral_0= 'Date' )
-                    // InternalDataDSL.g:9840:4: enumLiteral_0= 'Date'
+                    // InternalDataDSL.g:10460:3: (enumLiteral_0= 'Date' )
+                    // InternalDataDSL.g:10461:4: enumLiteral_0= 'Date'
                     {
-                    enumLiteral_0=(Token)match(input,154,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,167,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanTypeEnumAccess().getDateEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
@@ -27161,12 +28872,12 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9847:3: (enumLiteral_1= 'Milliseconds' )
+                    // InternalDataDSL.g:10468:3: (enumLiteral_1= 'Milliseconds' )
                     {
-                    // InternalDataDSL.g:9847:3: (enumLiteral_1= 'Milliseconds' )
-                    // InternalDataDSL.g:9848:4: enumLiteral_1= 'Milliseconds'
+                    // InternalDataDSL.g:10468:3: (enumLiteral_1= 'Milliseconds' )
+                    // InternalDataDSL.g:10469:4: enumLiteral_1= 'Milliseconds'
                     {
-                    enumLiteral_1=(Token)match(input,155,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,168,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanTypeEnumAccess().getMillisEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
@@ -27180,12 +28891,12 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:9855:3: (enumLiteral_2= 'Nanoseconds' )
+                    // InternalDataDSL.g:10476:3: (enumLiteral_2= 'Nanoseconds' )
                     {
-                    // InternalDataDSL.g:9855:3: (enumLiteral_2= 'Nanoseconds' )
-                    // InternalDataDSL.g:9856:4: enumLiteral_2= 'Nanoseconds'
+                    // InternalDataDSL.g:10476:3: (enumLiteral_2= 'Nanoseconds' )
+                    // InternalDataDSL.g:10477:4: enumLiteral_2= 'Nanoseconds'
                     {
-                    enumLiteral_2=(Token)match(input,156,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,169,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanTypeEnumAccess().getNanosEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
@@ -27199,12 +28910,12 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:9863:3: (enumLiteral_3= 'Random' )
+                    // InternalDataDSL.g:10484:3: (enumLiteral_3= 'Random' )
                     {
-                    // InternalDataDSL.g:9863:3: (enumLiteral_3= 'Random' )
-                    // InternalDataDSL.g:9864:4: enumLiteral_3= 'Random'
+                    // InternalDataDSL.g:10484:3: (enumLiteral_3= 'Random' )
+                    // InternalDataDSL.g:10485:4: enumLiteral_3= 'Random'
                     {
-                    enumLiteral_3=(Token)match(input,157,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_3=(Token)match(input,170,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanTypeEnumAccess().getRandomEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
@@ -27218,12 +28929,12 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:9871:3: (enumLiteral_4= 'ExecuteContext' )
+                    // InternalDataDSL.g:10492:3: (enumLiteral_4= 'ExecuteContext' )
                     {
-                    // InternalDataDSL.g:9871:3: (enumLiteral_4= 'ExecuteContext' )
-                    // InternalDataDSL.g:9872:4: enumLiteral_4= 'ExecuteContext'
+                    // InternalDataDSL.g:10492:3: (enumLiteral_4= 'ExecuteContext' )
+                    // InternalDataDSL.g:10493:4: enumLiteral_4= 'ExecuteContext'
                     {
-                    enumLiteral_4=(Token)match(input,158,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_4=(Token)match(input,171,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getPredefinedBeanTypeEnumAccess().getExecContextEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
@@ -27261,7 +28972,7 @@
 
 
     // $ANTLR start "ruleEntityManagerMode"
-    // InternalDataDSL.g:9882:1: ruleEntityManagerMode returns [Enumerator current=null] : ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) ) ;
+    // InternalDataDSL.g:10503:1: ruleEntityManagerMode returns [Enumerator current=null] : ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) ) ;
     public final Enumerator ruleEntityManagerMode() throws RecognitionException {
         Enumerator current = null;
 
@@ -27273,43 +28984,43 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9888:2: ( ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) ) )
-            // InternalDataDSL.g:9889:2: ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) )
+            // InternalDataDSL.g:10509:2: ( ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) ) )
+            // InternalDataDSL.g:10510:2: ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) )
             {
-            // InternalDataDSL.g:9889:2: ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) )
-            int alt178=3;
+            // InternalDataDSL.g:10510:2: ( (enumLiteral_0= 'persist' ) | (enumLiteral_1= 'merge' ) | (enumLiteral_2= 'remove' ) )
+            int alt185=3;
             switch ( input.LA(1) ) {
-            case 159:
+            case 172:
                 {
-                alt178=1;
+                alt185=1;
                 }
                 break;
-            case 160:
+            case 173:
                 {
-                alt178=2;
+                alt185=2;
                 }
                 break;
-            case 161:
+            case 174:
                 {
-                alt178=3;
+                alt185=3;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 178, 0, input);
+                    new NoViableAltException("", 185, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt178) {
+            switch (alt185) {
                 case 1 :
-                    // InternalDataDSL.g:9890:3: (enumLiteral_0= 'persist' )
+                    // InternalDataDSL.g:10511:3: (enumLiteral_0= 'persist' )
                     {
-                    // InternalDataDSL.g:9890:3: (enumLiteral_0= 'persist' )
-                    // InternalDataDSL.g:9891:4: enumLiteral_0= 'persist'
+                    // InternalDataDSL.g:10511:3: (enumLiteral_0= 'persist' )
+                    // InternalDataDSL.g:10512:4: enumLiteral_0= 'persist'
                     {
-                    enumLiteral_0=(Token)match(input,159,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,172,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getEntityManagerModeAccess().getPersistEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
@@ -27323,12 +29034,12 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9898:3: (enumLiteral_1= 'merge' )
+                    // InternalDataDSL.g:10519:3: (enumLiteral_1= 'merge' )
                     {
-                    // InternalDataDSL.g:9898:3: (enumLiteral_1= 'merge' )
-                    // InternalDataDSL.g:9899:4: enumLiteral_1= 'merge'
+                    // InternalDataDSL.g:10519:3: (enumLiteral_1= 'merge' )
+                    // InternalDataDSL.g:10520:4: enumLiteral_1= 'merge'
                     {
-                    enumLiteral_1=(Token)match(input,160,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,173,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getEntityManagerModeAccess().getMergeEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
@@ -27342,12 +29053,12 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:9906:3: (enumLiteral_2= 'remove' )
+                    // InternalDataDSL.g:10527:3: (enumLiteral_2= 'remove' )
                     {
-                    // InternalDataDSL.g:9906:3: (enumLiteral_2= 'remove' )
-                    // InternalDataDSL.g:9907:4: enumLiteral_2= 'remove'
+                    // InternalDataDSL.g:10527:3: (enumLiteral_2= 'remove' )
+                    // InternalDataDSL.g:10528:4: enumLiteral_2= 'remove'
                     {
-                    enumLiteral_2=(Token)match(input,161,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,174,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
                       				current = grammarAccess.getEntityManagerModeAccess().getRemoveEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
@@ -27384,9 +29095,9 @@
     // $ANTLR end "ruleEntityManagerMode"
 
 
-    // $ANTLR start "ruleConditionAndOperator1"
-    // InternalDataDSL.g:9917:1: ruleConditionAndOperator1 returns [Enumerator current=null] : ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) ) ;
-    public final Enumerator ruleConditionAndOperator1() throws RecognitionException {
+    // $ANTLR start "ruleOperator"
+    // InternalDataDSL.g:10538:1: ruleOperator returns [Enumerator current=null] : ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) ) ;
+    public final Enumerator ruleOperator() throws RecognitionException {
         Enumerator current = null;
 
         Token enumLiteral_0=null;
@@ -27402,72 +29113,72 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9923:2: ( ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) ) )
-            // InternalDataDSL.g:9924:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) )
+            // InternalDataDSL.g:10544:2: ( ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) ) )
+            // InternalDataDSL.g:10545:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) )
             {
-            // InternalDataDSL.g:9924:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) )
-            int alt179=8;
+            // InternalDataDSL.g:10545:2: ( (enumLiteral_0= '=' ) | (enumLiteral_1= '!=' ) | (enumLiteral_2= '>' ) | (enumLiteral_3= '>=' ) | (enumLiteral_4= '<' ) | (enumLiteral_5= '<=' ) | (enumLiteral_6= 'isnull' ) | (enumLiteral_7= 'isnotnull' ) )
+            int alt186=8;
             switch ( input.LA(1) ) {
-            case 84:
+            case 97:
                 {
-                alt179=1;
+                alt186=1;
                 }
                 break;
-            case 99:
+            case 112:
                 {
-                alt179=2;
+                alt186=2;
                 }
                 break;
-            case 94:
+            case 107:
                 {
-                alt179=3;
+                alt186=3;
                 }
                 break;
-            case 95:
+            case 108:
                 {
-                alt179=4;
+                alt186=4;
                 }
                 break;
-            case 93:
+            case 106:
                 {
-                alt179=5;
+                alt186=5;
                 }
                 break;
-            case 162:
+            case 175:
                 {
-                alt179=6;
+                alt186=6;
                 }
                 break;
-            case 163:
+            case 176:
                 {
-                alt179=7;
+                alt186=7;
                 }
                 break;
-            case 164:
+            case 177:
                 {
-                alt179=8;
+                alt186=8;
                 }
                 break;
             default:
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 179, 0, input);
+                    new NoViableAltException("", 186, 0, input);
 
                 throw nvae;
             }
 
-            switch (alt179) {
+            switch (alt186) {
                 case 1 :
-                    // InternalDataDSL.g:9925:3: (enumLiteral_0= '=' )
+                    // InternalDataDSL.g:10546:3: (enumLiteral_0= '=' )
                     {
-                    // InternalDataDSL.g:9925:3: (enumLiteral_0= '=' )
-                    // InternalDataDSL.g:9926:4: enumLiteral_0= '='
+                    // InternalDataDSL.g:10546:3: (enumLiteral_0= '=' )
+                    // InternalDataDSL.g:10547:4: enumLiteral_0= '='
                     {
-                    enumLiteral_0=(Token)match(input,84,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,97,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_0, grammarAccess.getConditionAndOperator1Access().getEqualsEnumLiteralDeclaration_0());
+                      				current = grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getOperatorAccess().getEqualsEnumLiteralDeclaration_0());
                       			
                     }
 
@@ -27477,16 +29188,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:9933:3: (enumLiteral_1= '!=' )
+                    // InternalDataDSL.g:10554:3: (enumLiteral_1= '!=' )
                     {
-                    // InternalDataDSL.g:9933:3: (enumLiteral_1= '!=' )
-                    // InternalDataDSL.g:9934:4: enumLiteral_1= '!='
+                    // InternalDataDSL.g:10554:3: (enumLiteral_1= '!=' )
+                    // InternalDataDSL.g:10555:4: enumLiteral_1= '!='
                     {
-                    enumLiteral_1=(Token)match(input,99,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,112,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_1, grammarAccess.getConditionAndOperator1Access().getNotequalsEnumLiteralDeclaration_1());
+                      				current = grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getOperatorAccess().getNotequalsEnumLiteralDeclaration_1());
                       			
                     }
 
@@ -27496,16 +29207,16 @@
                     }
                     break;
                 case 3 :
-                    // InternalDataDSL.g:9941:3: (enumLiteral_2= '>' )
+                    // InternalDataDSL.g:10562:3: (enumLiteral_2= '>' )
                     {
-                    // InternalDataDSL.g:9941:3: (enumLiteral_2= '>' )
-                    // InternalDataDSL.g:9942:4: enumLiteral_2= '>'
+                    // InternalDataDSL.g:10562:3: (enumLiteral_2= '>' )
+                    // InternalDataDSL.g:10563:4: enumLiteral_2= '>'
                     {
-                    enumLiteral_2=(Token)match(input,94,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_2=(Token)match(input,107,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_2, grammarAccess.getConditionAndOperator1Access().getGreaterthenEnumLiteralDeclaration_2());
+                      				current = grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_2, grammarAccess.getOperatorAccess().getGreaterthenEnumLiteralDeclaration_2());
                       			
                     }
 
@@ -27515,16 +29226,16 @@
                     }
                     break;
                 case 4 :
-                    // InternalDataDSL.g:9949:3: (enumLiteral_3= '>=' )
+                    // InternalDataDSL.g:10570:3: (enumLiteral_3= '>=' )
                     {
-                    // InternalDataDSL.g:9949:3: (enumLiteral_3= '>=' )
-                    // InternalDataDSL.g:9950:4: enumLiteral_3= '>='
+                    // InternalDataDSL.g:10570:3: (enumLiteral_3= '>=' )
+                    // InternalDataDSL.g:10571:4: enumLiteral_3= '>='
                     {
-                    enumLiteral_3=(Token)match(input,95,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_3=(Token)match(input,108,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_3, grammarAccess.getConditionAndOperator1Access().getGreaterthenorequaltoEnumLiteralDeclaration_3());
+                      				current = grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_3, grammarAccess.getOperatorAccess().getGreaterthenorequaltoEnumLiteralDeclaration_3());
                       			
                     }
 
@@ -27534,16 +29245,16 @@
                     }
                     break;
                 case 5 :
-                    // InternalDataDSL.g:9957:3: (enumLiteral_4= '<' )
+                    // InternalDataDSL.g:10578:3: (enumLiteral_4= '<' )
                     {
-                    // InternalDataDSL.g:9957:3: (enumLiteral_4= '<' )
-                    // InternalDataDSL.g:9958:4: enumLiteral_4= '<'
+                    // InternalDataDSL.g:10578:3: (enumLiteral_4= '<' )
+                    // InternalDataDSL.g:10579:4: enumLiteral_4= '<'
                     {
-                    enumLiteral_4=(Token)match(input,93,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_4=(Token)match(input,106,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_4, grammarAccess.getConditionAndOperator1Access().getLessthenEnumLiteralDeclaration_4());
+                      				current = grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_4, grammarAccess.getOperatorAccess().getLessthenEnumLiteralDeclaration_4());
                       			
                     }
 
@@ -27553,16 +29264,16 @@
                     }
                     break;
                 case 6 :
-                    // InternalDataDSL.g:9965:3: (enumLiteral_5= '<=' )
+                    // InternalDataDSL.g:10586:3: (enumLiteral_5= '<=' )
                     {
-                    // InternalDataDSL.g:9965:3: (enumLiteral_5= '<=' )
-                    // InternalDataDSL.g:9966:4: enumLiteral_5= '<='
+                    // InternalDataDSL.g:10586:3: (enumLiteral_5= '<=' )
+                    // InternalDataDSL.g:10587:4: enumLiteral_5= '<='
                     {
-                    enumLiteral_5=(Token)match(input,162,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_5=(Token)match(input,175,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_5, grammarAccess.getConditionAndOperator1Access().getLessthenorequaltoEnumLiteralDeclaration_5());
+                      				current = grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_5, grammarAccess.getOperatorAccess().getLessthenorequaltoEnumLiteralDeclaration_5());
                       			
                     }
 
@@ -27572,16 +29283,16 @@
                     }
                     break;
                 case 7 :
-                    // InternalDataDSL.g:9973:3: (enumLiteral_6= 'isnull' )
+                    // InternalDataDSL.g:10594:3: (enumLiteral_6= 'isnull' )
                     {
-                    // InternalDataDSL.g:9973:3: (enumLiteral_6= 'isnull' )
-                    // InternalDataDSL.g:9974:4: enumLiteral_6= 'isnull'
+                    // InternalDataDSL.g:10594:3: (enumLiteral_6= 'isnull' )
+                    // InternalDataDSL.g:10595:4: enumLiteral_6= 'isnull'
                     {
-                    enumLiteral_6=(Token)match(input,163,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_6=(Token)match(input,176,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_6, grammarAccess.getConditionAndOperator1Access().getIsnullEnumLiteralDeclaration_6());
+                      				current = grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_6, grammarAccess.getOperatorAccess().getIsnullEnumLiteralDeclaration_6());
                       			
                     }
 
@@ -27591,16 +29302,16 @@
                     }
                     break;
                 case 8 :
-                    // InternalDataDSL.g:9981:3: (enumLiteral_7= 'isnotnull' )
+                    // InternalDataDSL.g:10602:3: (enumLiteral_7= 'isnotnull' )
                     {
-                    // InternalDataDSL.g:9981:3: (enumLiteral_7= 'isnotnull' )
-                    // InternalDataDSL.g:9982:4: enumLiteral_7= 'isnotnull'
+                    // InternalDataDSL.g:10602:3: (enumLiteral_7= 'isnotnull' )
+                    // InternalDataDSL.g:10603:4: enumLiteral_7= 'isnotnull'
                     {
-                    enumLiteral_7=(Token)match(input,164,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_7=(Token)match(input,177,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_7, grammarAccess.getConditionAndOperator1Access().getIsnotnullEnumLiteralDeclaration_7());
+                      				current = grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_7, grammarAccess.getOperatorAccess().getIsnotnullEnumLiteralDeclaration_7());
                       			
                     }
 
@@ -27630,12 +29341,12 @@
         }
         return current;
     }
-    // $ANTLR end "ruleConditionAndOperator1"
+    // $ANTLR end "ruleOperator"
 
 
-    // $ANTLR start "ruleConditionAndOperator2"
-    // InternalDataDSL.g:9992:1: ruleConditionAndOperator2 returns [Enumerator current=null] : ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) ) ;
-    public final Enumerator ruleConditionAndOperator2() throws RecognitionException {
+    // $ANTLR start "ruleJunction"
+    // InternalDataDSL.g:10613:1: ruleJunction returns [Enumerator current=null] : ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) ) ;
+    public final Enumerator ruleJunction() throws RecognitionException {
         Enumerator current = null;
 
         Token enumLiteral_0=null;
@@ -27645,38 +29356,38 @@
         	enterRule();
 
         try {
-            // InternalDataDSL.g:9998:2: ( ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) ) )
-            // InternalDataDSL.g:9999:2: ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) )
+            // InternalDataDSL.g:10619:2: ( ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) ) )
+            // InternalDataDSL.g:10620:2: ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) )
             {
-            // InternalDataDSL.g:9999:2: ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) )
-            int alt180=2;
-            int LA180_0 = input.LA(1);
+            // InternalDataDSL.g:10620:2: ( (enumLiteral_0= 'and' ) | (enumLiteral_1= 'or' ) )
+            int alt187=2;
+            int LA187_0 = input.LA(1);
 
-            if ( (LA180_0==165) ) {
-                alt180=1;
+            if ( (LA187_0==178) ) {
+                alt187=1;
             }
-            else if ( (LA180_0==166) ) {
-                alt180=2;
+            else if ( (LA187_0==179) ) {
+                alt187=2;
             }
             else {
                 if (state.backtracking>0) {state.failed=true; return current;}
                 NoViableAltException nvae =
-                    new NoViableAltException("", 180, 0, input);
+                    new NoViableAltException("", 187, 0, input);
 
                 throw nvae;
             }
-            switch (alt180) {
+            switch (alt187) {
                 case 1 :
-                    // InternalDataDSL.g:10000:3: (enumLiteral_0= 'and' )
+                    // InternalDataDSL.g:10621:3: (enumLiteral_0= 'and' )
                     {
-                    // InternalDataDSL.g:10000:3: (enumLiteral_0= 'and' )
-                    // InternalDataDSL.g:10001:4: enumLiteral_0= 'and'
+                    // InternalDataDSL.g:10621:3: (enumLiteral_0= 'and' )
+                    // InternalDataDSL.g:10622:4: enumLiteral_0= 'and'
                     {
-                    enumLiteral_0=(Token)match(input,165,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_0=(Token)match(input,178,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_0, grammarAccess.getConditionAndOperator2Access().getAndEnumLiteralDeclaration_0());
+                      				current = grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_0, grammarAccess.getJunctionAccess().getAndEnumLiteralDeclaration_0());
                       			
                     }
 
@@ -27686,16 +29397,16 @@
                     }
                     break;
                 case 2 :
-                    // InternalDataDSL.g:10008:3: (enumLiteral_1= 'or' )
+                    // InternalDataDSL.g:10629:3: (enumLiteral_1= 'or' )
                     {
-                    // InternalDataDSL.g:10008:3: (enumLiteral_1= 'or' )
-                    // InternalDataDSL.g:10009:4: enumLiteral_1= 'or'
+                    // InternalDataDSL.g:10629:3: (enumLiteral_1= 'or' )
+                    // InternalDataDSL.g:10630:4: enumLiteral_1= 'or'
                     {
-                    enumLiteral_1=(Token)match(input,166,FOLLOW_2); if (state.failed) return current;
+                    enumLiteral_1=(Token)match(input,179,FOLLOW_2); if (state.failed) return current;
                     if ( state.backtracking==0 ) {
 
-                      				current = grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
-                      				newLeafNode(enumLiteral_1, grammarAccess.getConditionAndOperator2Access().getOrEnumLiteralDeclaration_1());
+                      				current = grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1().getEnumLiteral().getInstance();
+                      				newLeafNode(enumLiteral_1, grammarAccess.getJunctionAccess().getOrEnumLiteralDeclaration_1());
                       			
                     }
 
@@ -27725,14 +29436,14 @@
         }
         return current;
     }
-    // $ANTLR end "ruleConditionAndOperator2"
+    // $ANTLR end "ruleJunction"
 
     // $ANTLR start synpred1_InternalDataDSL
     public final void synpred1_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3113:5: ( '(' )
-        // InternalDataDSL.g:3113:6: '('
+        // InternalDataDSL.g:3734:5: ( '(' )
+        // InternalDataDSL.g:3734:6: '('
         {
-        match(input,81,FOLLOW_2); if (state.failed) return ;
+        match(input,94,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -27740,19 +29451,19 @@
 
     // $ANTLR start synpred2_InternalDataDSL
     public final void synpred2_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3122:7: ( ( ( ( ruleValidID ) ) '=' ) )
-        // InternalDataDSL.g:3122:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalDataDSL.g:3743:7: ( ( ( ( ruleValidID ) ) '=' ) )
+        // InternalDataDSL.g:3743:8: ( ( ( ruleValidID ) ) '=' )
         {
-        // InternalDataDSL.g:3122:8: ( ( ( ruleValidID ) ) '=' )
-        // InternalDataDSL.g:3123:8: ( ( ruleValidID ) ) '='
+        // InternalDataDSL.g:3743:8: ( ( ( ruleValidID ) ) '=' )
+        // InternalDataDSL.g:3744:8: ( ( ruleValidID ) ) '='
         {
-        // InternalDataDSL.g:3123:8: ( ( ruleValidID ) )
-        // InternalDataDSL.g:3124:9: ( ruleValidID )
+        // InternalDataDSL.g:3744:8: ( ( ruleValidID ) )
+        // InternalDataDSL.g:3745:9: ( ruleValidID )
         {
-        // InternalDataDSL.g:3124:9: ( ruleValidID )
-        // InternalDataDSL.g:3125:10: ruleValidID
+        // InternalDataDSL.g:3745:9: ( ruleValidID )
+        // InternalDataDSL.g:3746:10: ruleValidID
         {
-        pushFollow(FOLLOW_77);
+        pushFollow(FOLLOW_83);
         ruleValidID();
 
         state._fsp--;
@@ -27763,7 +29474,7 @@
 
         }
 
-        match(input,84,FOLLOW_2); if (state.failed) return ;
+        match(input,97,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -27774,19 +29485,19 @@
 
     // $ANTLR start synpred5_InternalDataDSL
     public final void synpred5_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3302:5: ( ( () '#' '[' ) )
-        // InternalDataDSL.g:3302:6: ( () '#' '[' )
+        // InternalDataDSL.g:3923:5: ( ( () '#' '[' ) )
+        // InternalDataDSL.g:3923:6: ( () '#' '[' )
         {
-        // InternalDataDSL.g:3302:6: ( () '#' '[' )
-        // InternalDataDSL.g:3303:6: () '#' '['
+        // InternalDataDSL.g:3923:6: ( () '#' '[' )
+        // InternalDataDSL.g:3924:6: () '#' '['
         {
-        // InternalDataDSL.g:3303:6: ()
-        // InternalDataDSL.g:3304:6: 
+        // InternalDataDSL.g:3924:6: ()
+        // InternalDataDSL.g:3925:6: 
         {
         }
 
-        match(input,85,FOLLOW_79); if (state.failed) return ;
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,98,FOLLOW_85); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -27797,19 +29508,19 @@
 
     // $ANTLR start synpred6_InternalDataDSL
     public final void synpred6_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3444:5: ( ( () '#' '[' ) )
-        // InternalDataDSL.g:3444:6: ( () '#' '[' )
+        // InternalDataDSL.g:4065:5: ( ( () '#' '[' ) )
+        // InternalDataDSL.g:4065:6: ( () '#' '[' )
         {
-        // InternalDataDSL.g:3444:6: ( () '#' '[' )
-        // InternalDataDSL.g:3445:6: () '#' '['
+        // InternalDataDSL.g:4065:6: ( () '#' '[' )
+        // InternalDataDSL.g:4066:6: () '#' '['
         {
-        // InternalDataDSL.g:3445:6: ()
-        // InternalDataDSL.g:3446:6: 
+        // InternalDataDSL.g:4066:6: ()
+        // InternalDataDSL.g:4067:6: 
         {
         }
 
-        match(input,85,FOLLOW_79); if (state.failed) return ;
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,98,FOLLOW_85); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -27820,22 +29531,22 @@
 
     // $ANTLR start synpred7_InternalDataDSL
     public final void synpred7_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3672:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
-        // InternalDataDSL.g:3672:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalDataDSL.g:4293:6: ( ( () ( ( ruleOpMultiAssign ) ) ) )
+        // InternalDataDSL.g:4293:7: ( () ( ( ruleOpMultiAssign ) ) )
         {
-        // InternalDataDSL.g:3672:7: ( () ( ( ruleOpMultiAssign ) ) )
-        // InternalDataDSL.g:3673:7: () ( ( ruleOpMultiAssign ) )
+        // InternalDataDSL.g:4293:7: ( () ( ( ruleOpMultiAssign ) ) )
+        // InternalDataDSL.g:4294:7: () ( ( ruleOpMultiAssign ) )
         {
-        // InternalDataDSL.g:3673:7: ()
-        // InternalDataDSL.g:3674:7: 
+        // InternalDataDSL.g:4294:7: ()
+        // InternalDataDSL.g:4295:7: 
         {
         }
 
-        // InternalDataDSL.g:3675:7: ( ( ruleOpMultiAssign ) )
-        // InternalDataDSL.g:3676:8: ( ruleOpMultiAssign )
+        // InternalDataDSL.g:4296:7: ( ( ruleOpMultiAssign ) )
+        // InternalDataDSL.g:4297:8: ( ruleOpMultiAssign )
         {
-        // InternalDataDSL.g:3676:8: ( ruleOpMultiAssign )
-        // InternalDataDSL.g:3677:9: ruleOpMultiAssign
+        // InternalDataDSL.g:4297:8: ( ruleOpMultiAssign )
+        // InternalDataDSL.g:4298:9: ruleOpMultiAssign
         {
         pushFollow(FOLLOW_2);
         ruleOpMultiAssign();
@@ -27858,22 +29569,22 @@
 
     // $ANTLR start synpred8_InternalDataDSL
     public final void synpred8_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3866:5: ( ( () ( ( ruleOpOr ) ) ) )
-        // InternalDataDSL.g:3866:6: ( () ( ( ruleOpOr ) ) )
+        // InternalDataDSL.g:4487:5: ( ( () ( ( ruleOpOr ) ) ) )
+        // InternalDataDSL.g:4487:6: ( () ( ( ruleOpOr ) ) )
         {
-        // InternalDataDSL.g:3866:6: ( () ( ( ruleOpOr ) ) )
-        // InternalDataDSL.g:3867:6: () ( ( ruleOpOr ) )
+        // InternalDataDSL.g:4487:6: ( () ( ( ruleOpOr ) ) )
+        // InternalDataDSL.g:4488:6: () ( ( ruleOpOr ) )
         {
-        // InternalDataDSL.g:3867:6: ()
-        // InternalDataDSL.g:3868:6: 
+        // InternalDataDSL.g:4488:6: ()
+        // InternalDataDSL.g:4489:6: 
         {
         }
 
-        // InternalDataDSL.g:3869:6: ( ( ruleOpOr ) )
-        // InternalDataDSL.g:3870:7: ( ruleOpOr )
+        // InternalDataDSL.g:4490:6: ( ( ruleOpOr ) )
+        // InternalDataDSL.g:4491:7: ( ruleOpOr )
         {
-        // InternalDataDSL.g:3870:7: ( ruleOpOr )
-        // InternalDataDSL.g:3871:8: ruleOpOr
+        // InternalDataDSL.g:4491:7: ( ruleOpOr )
+        // InternalDataDSL.g:4492:8: ruleOpOr
         {
         pushFollow(FOLLOW_2);
         ruleOpOr();
@@ -27896,22 +29607,22 @@
 
     // $ANTLR start synpred9_InternalDataDSL
     public final void synpred9_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:3973:5: ( ( () ( ( ruleOpAnd ) ) ) )
-        // InternalDataDSL.g:3973:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalDataDSL.g:4594:5: ( ( () ( ( ruleOpAnd ) ) ) )
+        // InternalDataDSL.g:4594:6: ( () ( ( ruleOpAnd ) ) )
         {
-        // InternalDataDSL.g:3973:6: ( () ( ( ruleOpAnd ) ) )
-        // InternalDataDSL.g:3974:6: () ( ( ruleOpAnd ) )
+        // InternalDataDSL.g:4594:6: ( () ( ( ruleOpAnd ) ) )
+        // InternalDataDSL.g:4595:6: () ( ( ruleOpAnd ) )
         {
-        // InternalDataDSL.g:3974:6: ()
-        // InternalDataDSL.g:3975:6: 
+        // InternalDataDSL.g:4595:6: ()
+        // InternalDataDSL.g:4596:6: 
         {
         }
 
-        // InternalDataDSL.g:3976:6: ( ( ruleOpAnd ) )
-        // InternalDataDSL.g:3977:7: ( ruleOpAnd )
+        // InternalDataDSL.g:4597:6: ( ( ruleOpAnd ) )
+        // InternalDataDSL.g:4598:7: ( ruleOpAnd )
         {
-        // InternalDataDSL.g:3977:7: ( ruleOpAnd )
-        // InternalDataDSL.g:3978:8: ruleOpAnd
+        // InternalDataDSL.g:4598:7: ( ruleOpAnd )
+        // InternalDataDSL.g:4599:8: ruleOpAnd
         {
         pushFollow(FOLLOW_2);
         ruleOpAnd();
@@ -27934,22 +29645,22 @@
 
     // $ANTLR start synpred10_InternalDataDSL
     public final void synpred10_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4080:5: ( ( () ( ( ruleOpEquality ) ) ) )
-        // InternalDataDSL.g:4080:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalDataDSL.g:4701:5: ( ( () ( ( ruleOpEquality ) ) ) )
+        // InternalDataDSL.g:4701:6: ( () ( ( ruleOpEquality ) ) )
         {
-        // InternalDataDSL.g:4080:6: ( () ( ( ruleOpEquality ) ) )
-        // InternalDataDSL.g:4081:6: () ( ( ruleOpEquality ) )
+        // InternalDataDSL.g:4701:6: ( () ( ( ruleOpEquality ) ) )
+        // InternalDataDSL.g:4702:6: () ( ( ruleOpEquality ) )
         {
-        // InternalDataDSL.g:4081:6: ()
-        // InternalDataDSL.g:4082:6: 
+        // InternalDataDSL.g:4702:6: ()
+        // InternalDataDSL.g:4703:6: 
         {
         }
 
-        // InternalDataDSL.g:4083:6: ( ( ruleOpEquality ) )
-        // InternalDataDSL.g:4084:7: ( ruleOpEquality )
+        // InternalDataDSL.g:4704:6: ( ( ruleOpEquality ) )
+        // InternalDataDSL.g:4705:7: ( ruleOpEquality )
         {
-        // InternalDataDSL.g:4084:7: ( ruleOpEquality )
-        // InternalDataDSL.g:4085:8: ruleOpEquality
+        // InternalDataDSL.g:4705:7: ( ruleOpEquality )
+        // InternalDataDSL.g:4706:8: ruleOpEquality
         {
         pushFollow(FOLLOW_2);
         ruleOpEquality();
@@ -27972,18 +29683,18 @@
 
     // $ANTLR start synpred11_InternalDataDSL
     public final void synpred11_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4208:6: ( ( () 'instanceof' ) )
-        // InternalDataDSL.g:4208:7: ( () 'instanceof' )
+        // InternalDataDSL.g:4829:6: ( ( () 'instanceof' ) )
+        // InternalDataDSL.g:4829:7: ( () 'instanceof' )
         {
-        // InternalDataDSL.g:4208:7: ( () 'instanceof' )
-        // InternalDataDSL.g:4209:7: () 'instanceof'
+        // InternalDataDSL.g:4829:7: ( () 'instanceof' )
+        // InternalDataDSL.g:4830:7: () 'instanceof'
         {
-        // InternalDataDSL.g:4209:7: ()
-        // InternalDataDSL.g:4210:7: 
+        // InternalDataDSL.g:4830:7: ()
+        // InternalDataDSL.g:4831:7: 
         {
         }
 
-        match(input,102,FOLLOW_2); if (state.failed) return ;
+        match(input,115,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -27994,22 +29705,22 @@
 
     // $ANTLR start synpred12_InternalDataDSL
     public final void synpred12_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4251:6: ( ( () ( ( ruleOpCompare ) ) ) )
-        // InternalDataDSL.g:4251:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalDataDSL.g:4872:6: ( ( () ( ( ruleOpCompare ) ) ) )
+        // InternalDataDSL.g:4872:7: ( () ( ( ruleOpCompare ) ) )
         {
-        // InternalDataDSL.g:4251:7: ( () ( ( ruleOpCompare ) ) )
-        // InternalDataDSL.g:4252:7: () ( ( ruleOpCompare ) )
+        // InternalDataDSL.g:4872:7: ( () ( ( ruleOpCompare ) ) )
+        // InternalDataDSL.g:4873:7: () ( ( ruleOpCompare ) )
         {
-        // InternalDataDSL.g:4252:7: ()
-        // InternalDataDSL.g:4253:7: 
+        // InternalDataDSL.g:4873:7: ()
+        // InternalDataDSL.g:4874:7: 
         {
         }
 
-        // InternalDataDSL.g:4254:7: ( ( ruleOpCompare ) )
-        // InternalDataDSL.g:4255:8: ( ruleOpCompare )
+        // InternalDataDSL.g:4875:7: ( ( ruleOpCompare ) )
+        // InternalDataDSL.g:4876:8: ( ruleOpCompare )
         {
-        // InternalDataDSL.g:4255:8: ( ruleOpCompare )
-        // InternalDataDSL.g:4256:9: ruleOpCompare
+        // InternalDataDSL.g:4876:8: ( ruleOpCompare )
+        // InternalDataDSL.g:4877:9: ruleOpCompare
         {
         pushFollow(FOLLOW_2);
         ruleOpCompare();
@@ -28032,22 +29743,22 @@
 
     // $ANTLR start synpred13_InternalDataDSL
     public final void synpred13_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4386:5: ( ( () ( ( ruleOpOther ) ) ) )
-        // InternalDataDSL.g:4386:6: ( () ( ( ruleOpOther ) ) )
+        // InternalDataDSL.g:5007:5: ( ( () ( ( ruleOpOther ) ) ) )
+        // InternalDataDSL.g:5007:6: ( () ( ( ruleOpOther ) ) )
         {
-        // InternalDataDSL.g:4386:6: ( () ( ( ruleOpOther ) ) )
-        // InternalDataDSL.g:4387:6: () ( ( ruleOpOther ) )
+        // InternalDataDSL.g:5007:6: ( () ( ( ruleOpOther ) ) )
+        // InternalDataDSL.g:5008:6: () ( ( ruleOpOther ) )
         {
-        // InternalDataDSL.g:4387:6: ()
-        // InternalDataDSL.g:4388:6: 
+        // InternalDataDSL.g:5008:6: ()
+        // InternalDataDSL.g:5009:6: 
         {
         }
 
-        // InternalDataDSL.g:4389:6: ( ( ruleOpOther ) )
-        // InternalDataDSL.g:4390:7: ( ruleOpOther )
+        // InternalDataDSL.g:5010:6: ( ( ruleOpOther ) )
+        // InternalDataDSL.g:5011:7: ( ruleOpOther )
         {
-        // InternalDataDSL.g:4390:7: ( ruleOpOther )
-        // InternalDataDSL.g:4391:8: ruleOpOther
+        // InternalDataDSL.g:5011:7: ( ruleOpOther )
+        // InternalDataDSL.g:5012:8: ruleOpOther
         {
         pushFollow(FOLLOW_2);
         ruleOpOther();
@@ -28070,14 +29781,14 @@
 
     // $ANTLR start synpred14_InternalDataDSL
     public final void synpred14_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4506:6: ( ( '>' '>' ) )
-        // InternalDataDSL.g:4506:7: ( '>' '>' )
+        // InternalDataDSL.g:5127:6: ( ( '>' '>' ) )
+        // InternalDataDSL.g:5127:7: ( '>' '>' )
         {
-        // InternalDataDSL.g:4506:7: ( '>' '>' )
-        // InternalDataDSL.g:4507:7: '>' '>'
+        // InternalDataDSL.g:5127:7: ( '>' '>' )
+        // InternalDataDSL.g:5128:7: '>' '>'
         {
-        match(input,94,FOLLOW_94); if (state.failed) return ;
-        match(input,94,FOLLOW_2); if (state.failed) return ;
+        match(input,107,FOLLOW_100); if (state.failed) return ;
+        match(input,107,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28088,14 +29799,14 @@
 
     // $ANTLR start synpred15_InternalDataDSL
     public final void synpred15_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4541:6: ( ( '<' '<' ) )
-        // InternalDataDSL.g:4541:7: ( '<' '<' )
+        // InternalDataDSL.g:5162:6: ( ( '<' '<' ) )
+        // InternalDataDSL.g:5162:7: ( '<' '<' )
         {
-        // InternalDataDSL.g:4541:7: ( '<' '<' )
-        // InternalDataDSL.g:4542:7: '<' '<'
+        // InternalDataDSL.g:5162:7: ( '<' '<' )
+        // InternalDataDSL.g:5163:7: '<' '<'
         {
-        match(input,93,FOLLOW_84); if (state.failed) return ;
-        match(input,93,FOLLOW_2); if (state.failed) return ;
+        match(input,106,FOLLOW_90); if (state.failed) return ;
+        match(input,106,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28106,22 +29817,22 @@
 
     // $ANTLR start synpred16_InternalDataDSL
     public final void synpred16_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4614:5: ( ( () ( ( ruleOpAdd ) ) ) )
-        // InternalDataDSL.g:4614:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalDataDSL.g:5235:5: ( ( () ( ( ruleOpAdd ) ) ) )
+        // InternalDataDSL.g:5235:6: ( () ( ( ruleOpAdd ) ) )
         {
-        // InternalDataDSL.g:4614:6: ( () ( ( ruleOpAdd ) ) )
-        // InternalDataDSL.g:4615:6: () ( ( ruleOpAdd ) )
+        // InternalDataDSL.g:5235:6: ( () ( ( ruleOpAdd ) ) )
+        // InternalDataDSL.g:5236:6: () ( ( ruleOpAdd ) )
         {
-        // InternalDataDSL.g:4615:6: ()
-        // InternalDataDSL.g:4616:6: 
+        // InternalDataDSL.g:5236:6: ()
+        // InternalDataDSL.g:5237:6: 
         {
         }
 
-        // InternalDataDSL.g:4617:6: ( ( ruleOpAdd ) )
-        // InternalDataDSL.g:4618:7: ( ruleOpAdd )
+        // InternalDataDSL.g:5238:6: ( ( ruleOpAdd ) )
+        // InternalDataDSL.g:5239:7: ( ruleOpAdd )
         {
-        // InternalDataDSL.g:4618:7: ( ruleOpAdd )
-        // InternalDataDSL.g:4619:8: ruleOpAdd
+        // InternalDataDSL.g:5239:7: ( ruleOpAdd )
+        // InternalDataDSL.g:5240:8: ruleOpAdd
         {
         pushFollow(FOLLOW_2);
         ruleOpAdd();
@@ -28144,22 +29855,22 @@
 
     // $ANTLR start synpred17_InternalDataDSL
     public final void synpred17_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4729:5: ( ( () ( ( ruleOpMulti ) ) ) )
-        // InternalDataDSL.g:4729:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalDataDSL.g:5350:5: ( ( () ( ( ruleOpMulti ) ) ) )
+        // InternalDataDSL.g:5350:6: ( () ( ( ruleOpMulti ) ) )
         {
-        // InternalDataDSL.g:4729:6: ( () ( ( ruleOpMulti ) ) )
-        // InternalDataDSL.g:4730:6: () ( ( ruleOpMulti ) )
+        // InternalDataDSL.g:5350:6: ( () ( ( ruleOpMulti ) ) )
+        // InternalDataDSL.g:5351:6: () ( ( ruleOpMulti ) )
         {
-        // InternalDataDSL.g:4730:6: ()
-        // InternalDataDSL.g:4731:6: 
+        // InternalDataDSL.g:5351:6: ()
+        // InternalDataDSL.g:5352:6: 
         {
         }
 
-        // InternalDataDSL.g:4732:6: ( ( ruleOpMulti ) )
-        // InternalDataDSL.g:4733:7: ( ruleOpMulti )
+        // InternalDataDSL.g:5353:6: ( ( ruleOpMulti ) )
+        // InternalDataDSL.g:5354:7: ( ruleOpMulti )
         {
-        // InternalDataDSL.g:4733:7: ( ruleOpMulti )
-        // InternalDataDSL.g:4734:8: ruleOpMulti
+        // InternalDataDSL.g:5354:7: ( ruleOpMulti )
+        // InternalDataDSL.g:5355:8: ruleOpMulti
         {
         pushFollow(FOLLOW_2);
         ruleOpMulti();
@@ -28182,18 +29893,18 @@
 
     // $ANTLR start synpred18_InternalDataDSL
     public final void synpred18_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:4964:5: ( ( () 'as' ) )
-        // InternalDataDSL.g:4964:6: ( () 'as' )
+        // InternalDataDSL.g:5585:5: ( ( () 'as' ) )
+        // InternalDataDSL.g:5585:6: ( () 'as' )
         {
-        // InternalDataDSL.g:4964:6: ( () 'as' )
-        // InternalDataDSL.g:4965:6: () 'as'
+        // InternalDataDSL.g:5585:6: ( () 'as' )
+        // InternalDataDSL.g:5586:6: () 'as'
         {
-        // InternalDataDSL.g:4965:6: ()
-        // InternalDataDSL.g:4966:6: 
+        // InternalDataDSL.g:5586:6: ()
+        // InternalDataDSL.g:5587:6: 
         {
         }
 
-        match(input,68,FOLLOW_2); if (state.failed) return ;
+        match(input,71,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28204,22 +29915,22 @@
 
     // $ANTLR start synpred19_InternalDataDSL
     public final void synpred19_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5032:4: ( ( () ( ( ruleOpPostfix ) ) ) )
-        // InternalDataDSL.g:5032:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalDataDSL.g:5653:4: ( ( () ( ( ruleOpPostfix ) ) ) )
+        // InternalDataDSL.g:5653:5: ( () ( ( ruleOpPostfix ) ) )
         {
-        // InternalDataDSL.g:5032:5: ( () ( ( ruleOpPostfix ) ) )
-        // InternalDataDSL.g:5033:5: () ( ( ruleOpPostfix ) )
+        // InternalDataDSL.g:5653:5: ( () ( ( ruleOpPostfix ) ) )
+        // InternalDataDSL.g:5654:5: () ( ( ruleOpPostfix ) )
         {
-        // InternalDataDSL.g:5033:5: ()
-        // InternalDataDSL.g:5034:5: 
+        // InternalDataDSL.g:5654:5: ()
+        // InternalDataDSL.g:5655:5: 
         {
         }
 
-        // InternalDataDSL.g:5035:5: ( ( ruleOpPostfix ) )
-        // InternalDataDSL.g:5036:6: ( ruleOpPostfix )
+        // InternalDataDSL.g:5656:5: ( ( ruleOpPostfix ) )
+        // InternalDataDSL.g:5657:6: ( ruleOpPostfix )
         {
-        // InternalDataDSL.g:5036:6: ( ruleOpPostfix )
-        // InternalDataDSL.g:5037:7: ruleOpPostfix
+        // InternalDataDSL.g:5657:6: ( ruleOpPostfix )
+        // InternalDataDSL.g:5658:7: ruleOpPostfix
         {
         pushFollow(FOLLOW_2);
         ruleOpPostfix();
@@ -28242,52 +29953,52 @@
 
     // $ANTLR start synpred20_InternalDataDSL
     public final void synpred20_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5128:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
-        // InternalDataDSL.g:5128:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalDataDSL.g:5749:6: ( ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign ) )
+        // InternalDataDSL.g:5749:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
         {
-        // InternalDataDSL.g:5128:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
-        // InternalDataDSL.g:5129:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
+        // InternalDataDSL.g:5749:7: ( () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign )
+        // InternalDataDSL.g:5750:7: () ( '.' | ( ( '::' ) ) ) ( ( ruleFeatureCallID ) ) ruleOpSingleAssign
         {
-        // InternalDataDSL.g:5129:7: ()
-        // InternalDataDSL.g:5130:7: 
+        // InternalDataDSL.g:5750:7: ()
+        // InternalDataDSL.g:5751:7: 
         {
         }
 
-        // InternalDataDSL.g:5131:7: ( '.' | ( ( '::' ) ) )
-        int alt181=2;
-        int LA181_0 = input.LA(1);
+        // InternalDataDSL.g:5752:7: ( '.' | ( ( '::' ) ) )
+        int alt188=2;
+        int LA188_0 = input.LA(1);
 
-        if ( (LA181_0==74) ) {
-            alt181=1;
+        if ( (LA188_0==87) ) {
+            alt188=1;
         }
-        else if ( (LA181_0==117) ) {
-            alt181=2;
+        else if ( (LA188_0==130) ) {
+            alt188=2;
         }
         else {
             if (state.backtracking>0) {state.failed=true; return ;}
             NoViableAltException nvae =
-                new NoViableAltException("", 181, 0, input);
+                new NoViableAltException("", 188, 0, input);
 
             throw nvae;
         }
-        switch (alt181) {
+        switch (alt188) {
             case 1 :
-                // InternalDataDSL.g:5132:8: '.'
+                // InternalDataDSL.g:5753:8: '.'
                 {
-                match(input,74,FOLLOW_101); if (state.failed) return ;
+                match(input,87,FOLLOW_107); if (state.failed) return ;
 
                 }
                 break;
             case 2 :
-                // InternalDataDSL.g:5134:8: ( ( '::' ) )
+                // InternalDataDSL.g:5755:8: ( ( '::' ) )
                 {
-                // InternalDataDSL.g:5134:8: ( ( '::' ) )
-                // InternalDataDSL.g:5135:9: ( '::' )
+                // InternalDataDSL.g:5755:8: ( ( '::' ) )
+                // InternalDataDSL.g:5756:9: ( '::' )
                 {
-                // InternalDataDSL.g:5135:9: ( '::' )
-                // InternalDataDSL.g:5136:10: '::'
+                // InternalDataDSL.g:5756:9: ( '::' )
+                // InternalDataDSL.g:5757:10: '::'
                 {
-                match(input,117,FOLLOW_101); if (state.failed) return ;
+                match(input,130,FOLLOW_107); if (state.failed) return ;
 
                 }
 
@@ -28300,13 +30011,13 @@
 
         }
 
-        // InternalDataDSL.g:5140:7: ( ( ruleFeatureCallID ) )
-        // InternalDataDSL.g:5141:8: ( ruleFeatureCallID )
+        // InternalDataDSL.g:5761:7: ( ( ruleFeatureCallID ) )
+        // InternalDataDSL.g:5762:8: ( ruleFeatureCallID )
         {
-        // InternalDataDSL.g:5141:8: ( ruleFeatureCallID )
-        // InternalDataDSL.g:5142:9: ruleFeatureCallID
+        // InternalDataDSL.g:5762:8: ( ruleFeatureCallID )
+        // InternalDataDSL.g:5763:9: ruleFeatureCallID
         {
-        pushFollow(FOLLOW_77);
+        pushFollow(FOLLOW_83);
         ruleFeatureCallID();
 
         state._fsp--;
@@ -28332,61 +30043,61 @@
 
     // $ANTLR start synpred21_InternalDataDSL
     public final void synpred21_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5225:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
-        // InternalDataDSL.g:5225:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalDataDSL.g:5846:6: ( ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) ) )
+        // InternalDataDSL.g:5846:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
         {
-        // InternalDataDSL.g:5225:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
-        // InternalDataDSL.g:5226:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        // InternalDataDSL.g:5846:7: ( () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) ) )
+        // InternalDataDSL.g:5847:7: () ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
         {
-        // InternalDataDSL.g:5226:7: ()
-        // InternalDataDSL.g:5227:7: 
+        // InternalDataDSL.g:5847:7: ()
+        // InternalDataDSL.g:5848:7: 
         {
         }
 
-        // InternalDataDSL.g:5228:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
-        int alt182=3;
+        // InternalDataDSL.g:5849:7: ( '.' | ( ( '?.' ) ) | ( ( '::' ) ) )
+        int alt189=3;
         switch ( input.LA(1) ) {
-        case 74:
+        case 87:
             {
-            alt182=1;
+            alt189=1;
             }
             break;
-        case 118:
+        case 131:
             {
-            alt182=2;
+            alt189=2;
             }
             break;
-        case 117:
+        case 130:
             {
-            alt182=3;
+            alt189=3;
             }
             break;
         default:
             if (state.backtracking>0) {state.failed=true; return ;}
             NoViableAltException nvae =
-                new NoViableAltException("", 182, 0, input);
+                new NoViableAltException("", 189, 0, input);
 
             throw nvae;
         }
 
-        switch (alt182) {
+        switch (alt189) {
             case 1 :
-                // InternalDataDSL.g:5229:8: '.'
+                // InternalDataDSL.g:5850:8: '.'
                 {
-                match(input,74,FOLLOW_2); if (state.failed) return ;
+                match(input,87,FOLLOW_2); if (state.failed) return ;
 
                 }
                 break;
             case 2 :
-                // InternalDataDSL.g:5231:8: ( ( '?.' ) )
+                // InternalDataDSL.g:5852:8: ( ( '?.' ) )
                 {
-                // InternalDataDSL.g:5231:8: ( ( '?.' ) )
-                // InternalDataDSL.g:5232:9: ( '?.' )
+                // InternalDataDSL.g:5852:8: ( ( '?.' ) )
+                // InternalDataDSL.g:5853:9: ( '?.' )
                 {
-                // InternalDataDSL.g:5232:9: ( '?.' )
-                // InternalDataDSL.g:5233:10: '?.'
+                // InternalDataDSL.g:5853:9: ( '?.' )
+                // InternalDataDSL.g:5854:10: '?.'
                 {
-                match(input,118,FOLLOW_2); if (state.failed) return ;
+                match(input,131,FOLLOW_2); if (state.failed) return ;
 
                 }
 
@@ -28397,15 +30108,15 @@
                 }
                 break;
             case 3 :
-                // InternalDataDSL.g:5237:8: ( ( '::' ) )
+                // InternalDataDSL.g:5858:8: ( ( '::' ) )
                 {
-                // InternalDataDSL.g:5237:8: ( ( '::' ) )
-                // InternalDataDSL.g:5238:9: ( '::' )
+                // InternalDataDSL.g:5858:8: ( ( '::' ) )
+                // InternalDataDSL.g:5859:9: ( '::' )
                 {
-                // InternalDataDSL.g:5238:9: ( '::' )
-                // InternalDataDSL.g:5239:10: '::'
+                // InternalDataDSL.g:5859:9: ( '::' )
+                // InternalDataDSL.g:5860:10: '::'
                 {
-                match(input,117,FOLLOW_2); if (state.failed) return ;
+                match(input,130,FOLLOW_2); if (state.failed) return ;
 
                 }
 
@@ -28428,13 +30139,13 @@
 
     // $ANTLR start synpred22_InternalDataDSL
     public final void synpred22_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5363:7: ( ( '(' ) )
-        // InternalDataDSL.g:5363:8: ( '(' )
+        // InternalDataDSL.g:5984:7: ( ( '(' ) )
+        // InternalDataDSL.g:5984:8: ( '(' )
         {
-        // InternalDataDSL.g:5363:8: ( '(' )
-        // InternalDataDSL.g:5364:8: '('
+        // InternalDataDSL.g:5984:8: ( '(' )
+        // InternalDataDSL.g:5985:8: '('
         {
-        match(input,81,FOLLOW_2); if (state.failed) return ;
+        match(input,94,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28445,35 +30156,35 @@
 
     // $ANTLR start synpred23_InternalDataDSL
     public final void synpred23_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5382:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalDataDSL.g:5382:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:6003:8: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalDataDSL.g:6003:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalDataDSL.g:5382:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalDataDSL.g:5383:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalDataDSL.g:6003:9: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:6004:9: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalDataDSL.g:5383:9: ()
-        // InternalDataDSL.g:5384:9: 
+        // InternalDataDSL.g:6004:9: ()
+        // InternalDataDSL.g:6005:9: 
         {
         }
 
-        // InternalDataDSL.g:5385:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
-        int alt184=2;
-        int LA184_0 = input.LA(1);
+        // InternalDataDSL.g:6006:9: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt191=2;
+        int LA191_0 = input.LA(1);
 
-        if ( (LA184_0==RULE_ID||LA184_0==81||LA184_0==106) ) {
-            alt184=1;
+        if ( (LA191_0==RULE_ID||LA191_0==94||LA191_0==119) ) {
+            alt191=1;
         }
-        switch (alt184) {
+        switch (alt191) {
             case 1 :
-                // InternalDataDSL.g:5386:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalDataDSL.g:6007:10: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalDataDSL.g:5386:10: ( ( ruleJvmFormalParameter ) )
-                // InternalDataDSL.g:5387:11: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:6007:10: ( ( ruleJvmFormalParameter ) )
+                // InternalDataDSL.g:6008:11: ( ruleJvmFormalParameter )
                 {
-                // InternalDataDSL.g:5387:11: ( ruleJvmFormalParameter )
-                // InternalDataDSL.g:5388:12: ruleJvmFormalParameter
+                // InternalDataDSL.g:6008:11: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:6009:12: ruleJvmFormalParameter
                 {
-                pushFollow(FOLLOW_111);
+                pushFollow(FOLLOW_117);
                 ruleJvmFormalParameter();
 
                 state._fsp--;
@@ -28484,29 +30195,29 @@
 
                 }
 
-                // InternalDataDSL.g:5391:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
-                loop183:
+                // InternalDataDSL.g:6012:10: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop190:
                 do {
-                    int alt183=2;
-                    int LA183_0 = input.LA(1);
+                    int alt190=2;
+                    int LA190_0 = input.LA(1);
 
-                    if ( (LA183_0==82) ) {
-                        alt183=1;
+                    if ( (LA190_0==95) ) {
+                        alt190=1;
                     }
 
 
-                    switch (alt183) {
+                    switch (alt190) {
                 	case 1 :
-                	    // InternalDataDSL.g:5392:11: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:6013:11: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
-                	    match(input,82,FOLLOW_91); if (state.failed) return ;
-                	    // InternalDataDSL.g:5393:11: ( ( ruleJvmFormalParameter ) )
-                	    // InternalDataDSL.g:5394:12: ( ruleJvmFormalParameter )
+                	    match(input,95,FOLLOW_97); if (state.failed) return ;
+                	    // InternalDataDSL.g:6014:11: ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:6015:12: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalDataDSL.g:5394:12: ( ruleJvmFormalParameter )
-                	    // InternalDataDSL.g:5395:13: ruleJvmFormalParameter
+                	    // InternalDataDSL.g:6015:12: ( ruleJvmFormalParameter )
+                	    // InternalDataDSL.g:6016:13: ruleJvmFormalParameter
                 	    {
-                	    pushFollow(FOLLOW_111);
+                	    pushFollow(FOLLOW_117);
                 	    ruleJvmFormalParameter();
 
                 	    state._fsp--;
@@ -28522,7 +30233,7 @@
                 	    break;
 
                 	default :
-                	    break loop183;
+                	    break loop190;
                     }
                 } while (true);
 
@@ -28532,13 +30243,13 @@
 
         }
 
-        // InternalDataDSL.g:5400:9: ( ( '|' ) )
-        // InternalDataDSL.g:5401:10: ( '|' )
+        // InternalDataDSL.g:6021:9: ( ( '|' ) )
+        // InternalDataDSL.g:6022:10: ( '|' )
         {
-        // InternalDataDSL.g:5401:10: ( '|' )
-        // InternalDataDSL.g:5402:11: '|'
+        // InternalDataDSL.g:6022:10: ( '|' )
+        // InternalDataDSL.g:6023:11: '|'
         {
-        match(input,119,FOLLOW_2); if (state.failed) return ;
+        match(input,132,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28555,18 +30266,18 @@
 
     // $ANTLR start synpred24_InternalDataDSL
     public final void synpred24_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5479:6: ( ( () '[' ) )
-        // InternalDataDSL.g:5479:7: ( () '[' )
+        // InternalDataDSL.g:6100:6: ( ( () '[' ) )
+        // InternalDataDSL.g:6100:7: ( () '[' )
         {
-        // InternalDataDSL.g:5479:7: ( () '[' )
-        // InternalDataDSL.g:5480:7: () '['
+        // InternalDataDSL.g:6100:7: ( () '[' )
+        // InternalDataDSL.g:6101:7: () '['
         {
-        // InternalDataDSL.g:5480:7: ()
-        // InternalDataDSL.g:5481:7: 
+        // InternalDataDSL.g:6101:7: ()
+        // InternalDataDSL.g:6102:7: 
         {
         }
 
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28577,19 +30288,19 @@
 
     // $ANTLR start synpred25_InternalDataDSL
     public final void synpred25_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5552:4: ( ( () 'synchronized' '(' ) )
-        // InternalDataDSL.g:5552:5: ( () 'synchronized' '(' )
+        // InternalDataDSL.g:6173:4: ( ( () 'synchronized' '(' ) )
+        // InternalDataDSL.g:6173:5: ( () 'synchronized' '(' )
         {
-        // InternalDataDSL.g:5552:5: ( () 'synchronized' '(' )
-        // InternalDataDSL.g:5553:5: () 'synchronized' '('
+        // InternalDataDSL.g:6173:5: ( () 'synchronized' '(' )
+        // InternalDataDSL.g:6174:5: () 'synchronized' '('
         {
-        // InternalDataDSL.g:5553:5: ()
-        // InternalDataDSL.g:5554:5: 
+        // InternalDataDSL.g:6174:5: ()
+        // InternalDataDSL.g:6175:5: 
         {
         }
 
-        match(input,141,FOLLOW_116); if (state.failed) return ;
-        match(input,81,FOLLOW_2); if (state.failed) return ;
+        match(input,154,FOLLOW_122); if (state.failed) return ;
+        match(input,94,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28600,26 +30311,26 @@
 
     // $ANTLR start synpred26_InternalDataDSL
     public final void synpred26_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5597:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalDataDSL.g:5597:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:6218:4: ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalDataDSL.g:6218:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalDataDSL.g:5597:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalDataDSL.g:5598:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalDataDSL.g:6218:5: ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:6219:5: () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':'
         {
-        // InternalDataDSL.g:5598:5: ()
-        // InternalDataDSL.g:5599:5: 
+        // InternalDataDSL.g:6219:5: ()
+        // InternalDataDSL.g:6220:5: 
         {
         }
 
-        match(input,50,FOLLOW_116); if (state.failed) return ;
-        match(input,81,FOLLOW_91); if (state.failed) return ;
-        // InternalDataDSL.g:5602:5: ( ( ruleJvmFormalParameter ) )
-        // InternalDataDSL.g:5603:6: ( ruleJvmFormalParameter )
+        match(input,52,FOLLOW_122); if (state.failed) return ;
+        match(input,94,FOLLOW_97); if (state.failed) return ;
+        // InternalDataDSL.g:6223:5: ( ( ruleJvmFormalParameter ) )
+        // InternalDataDSL.g:6224:6: ( ruleJvmFormalParameter )
         {
-        // InternalDataDSL.g:5603:6: ( ruleJvmFormalParameter )
-        // InternalDataDSL.g:5604:7: ruleJvmFormalParameter
+        // InternalDataDSL.g:6224:6: ( ruleJvmFormalParameter )
+        // InternalDataDSL.g:6225:7: ruleJvmFormalParameter
         {
-        pushFollow(FOLLOW_119);
+        pushFollow(FOLLOW_125);
         ruleJvmFormalParameter();
 
         state._fsp--;
@@ -28630,7 +30341,7 @@
 
         }
 
-        match(input,123,FOLLOW_2); if (state.failed) return ;
+        match(input,136,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28641,18 +30352,18 @@
 
     // $ANTLR start synpred27_InternalDataDSL
     public final void synpred27_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:5711:4: ( ( () '[' ) )
-        // InternalDataDSL.g:5711:5: ( () '[' )
+        // InternalDataDSL.g:6332:4: ( ( () '[' ) )
+        // InternalDataDSL.g:6332:5: ( () '[' )
         {
-        // InternalDataDSL.g:5711:5: ( () '[' )
-        // InternalDataDSL.g:5712:5: () '['
+        // InternalDataDSL.g:6332:5: ( () '[' )
+        // InternalDataDSL.g:6333:5: () '['
         {
-        // InternalDataDSL.g:5712:5: ()
-        // InternalDataDSL.g:5713:5: 
+        // InternalDataDSL.g:6333:5: ()
+        // InternalDataDSL.g:6334:5: 
         {
         }
 
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28663,30 +30374,30 @@
 
     // $ANTLR start synpred29_InternalDataDSL
     public final void synpred29_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:6016:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalDataDSL.g:6016:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:6637:4: ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalDataDSL.g:6637:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalDataDSL.g:6016:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalDataDSL.g:6017:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalDataDSL.g:6637:5: ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:6638:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalDataDSL.g:6017:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
-        int alt186=2;
-        int LA186_0 = input.LA(1);
+        // InternalDataDSL.g:6638:5: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt193=2;
+        int LA193_0 = input.LA(1);
 
-        if ( (LA186_0==RULE_ID||LA186_0==81||LA186_0==106) ) {
-            alt186=1;
+        if ( (LA193_0==RULE_ID||LA193_0==94||LA193_0==119) ) {
+            alt193=1;
         }
-        switch (alt186) {
+        switch (alt193) {
             case 1 :
-                // InternalDataDSL.g:6018:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalDataDSL.g:6639:6: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalDataDSL.g:6018:6: ( ( ruleJvmFormalParameter ) )
-                // InternalDataDSL.g:6019:7: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:6639:6: ( ( ruleJvmFormalParameter ) )
+                // InternalDataDSL.g:6640:7: ( ruleJvmFormalParameter )
                 {
-                // InternalDataDSL.g:6019:7: ( ruleJvmFormalParameter )
-                // InternalDataDSL.g:6020:8: ruleJvmFormalParameter
+                // InternalDataDSL.g:6640:7: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:6641:8: ruleJvmFormalParameter
                 {
-                pushFollow(FOLLOW_111);
+                pushFollow(FOLLOW_117);
                 ruleJvmFormalParameter();
 
                 state._fsp--;
@@ -28697,29 +30408,29 @@
 
                 }
 
-                // InternalDataDSL.g:6023:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
-                loop185:
+                // InternalDataDSL.g:6644:6: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop192:
                 do {
-                    int alt185=2;
-                    int LA185_0 = input.LA(1);
+                    int alt192=2;
+                    int LA192_0 = input.LA(1);
 
-                    if ( (LA185_0==82) ) {
-                        alt185=1;
+                    if ( (LA192_0==95) ) {
+                        alt192=1;
                     }
 
 
-                    switch (alt185) {
+                    switch (alt192) {
                 	case 1 :
-                	    // InternalDataDSL.g:6024:7: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:6645:7: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
-                	    match(input,82,FOLLOW_91); if (state.failed) return ;
-                	    // InternalDataDSL.g:6025:7: ( ( ruleJvmFormalParameter ) )
-                	    // InternalDataDSL.g:6026:8: ( ruleJvmFormalParameter )
+                	    match(input,95,FOLLOW_97); if (state.failed) return ;
+                	    // InternalDataDSL.g:6646:7: ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:6647:8: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalDataDSL.g:6026:8: ( ruleJvmFormalParameter )
-                	    // InternalDataDSL.g:6027:9: ruleJvmFormalParameter
+                	    // InternalDataDSL.g:6647:8: ( ruleJvmFormalParameter )
+                	    // InternalDataDSL.g:6648:9: ruleJvmFormalParameter
                 	    {
-                	    pushFollow(FOLLOW_111);
+                	    pushFollow(FOLLOW_117);
                 	    ruleJvmFormalParameter();
 
                 	    state._fsp--;
@@ -28735,7 +30446,7 @@
                 	    break;
 
                 	default :
-                	    break loop185;
+                	    break loop192;
                     }
                 } while (true);
 
@@ -28745,13 +30456,13 @@
 
         }
 
-        // InternalDataDSL.g:6032:5: ( ( '|' ) )
-        // InternalDataDSL.g:6033:6: ( '|' )
+        // InternalDataDSL.g:6653:5: ( ( '|' ) )
+        // InternalDataDSL.g:6654:6: ( '|' )
         {
-        // InternalDataDSL.g:6033:6: ( '|' )
-        // InternalDataDSL.g:6034:7: '|'
+        // InternalDataDSL.g:6654:6: ( '|' )
+        // InternalDataDSL.g:6655:7: '|'
         {
-        match(input,119,FOLLOW_2); if (state.failed) return ;
+        match(input,132,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28768,10 +30479,10 @@
 
     // $ANTLR start synpred31_InternalDataDSL
     public final void synpred31_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:6425:5: ( 'else' )
-        // InternalDataDSL.g:6425:6: 'else'
+        // InternalDataDSL.g:7046:5: ( 'else' )
+        // InternalDataDSL.g:7046:6: 'else'
         {
-        match(input,121,FOLLOW_2); if (state.failed) return ;
+        match(input,134,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -28779,20 +30490,20 @@
 
     // $ANTLR start synpred32_InternalDataDSL
     public final void synpred32_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:6484:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalDataDSL.g:6484:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:7105:6: ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalDataDSL.g:7105:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalDataDSL.g:6484:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalDataDSL.g:6485:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalDataDSL.g:7105:7: ( '(' ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:7106:7: '(' ( ( ruleJvmFormalParameter ) ) ':'
         {
-        match(input,81,FOLLOW_91); if (state.failed) return ;
-        // InternalDataDSL.g:6486:7: ( ( ruleJvmFormalParameter ) )
-        // InternalDataDSL.g:6487:8: ( ruleJvmFormalParameter )
+        match(input,94,FOLLOW_97); if (state.failed) return ;
+        // InternalDataDSL.g:7107:7: ( ( ruleJvmFormalParameter ) )
+        // InternalDataDSL.g:7108:8: ( ruleJvmFormalParameter )
         {
-        // InternalDataDSL.g:6487:8: ( ruleJvmFormalParameter )
-        // InternalDataDSL.g:6488:9: ruleJvmFormalParameter
+        // InternalDataDSL.g:7108:8: ( ruleJvmFormalParameter )
+        // InternalDataDSL.g:7109:9: ruleJvmFormalParameter
         {
-        pushFollow(FOLLOW_119);
+        pushFollow(FOLLOW_125);
         ruleJvmFormalParameter();
 
         state._fsp--;
@@ -28803,7 +30514,7 @@
 
         }
 
-        match(input,123,FOLLOW_2); if (state.failed) return ;
+        match(input,136,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28814,19 +30525,19 @@
 
     // $ANTLR start synpred33_InternalDataDSL
     public final void synpred33_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:6551:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
-        // InternalDataDSL.g:6551:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:7172:6: ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )
+        // InternalDataDSL.g:7172:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
         {
-        // InternalDataDSL.g:6551:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
-        // InternalDataDSL.g:6552:7: ( ( ruleJvmFormalParameter ) ) ':'
+        // InternalDataDSL.g:7172:7: ( ( ( ruleJvmFormalParameter ) ) ':' )
+        // InternalDataDSL.g:7173:7: ( ( ruleJvmFormalParameter ) ) ':'
         {
-        // InternalDataDSL.g:6552:7: ( ( ruleJvmFormalParameter ) )
-        // InternalDataDSL.g:6553:8: ( ruleJvmFormalParameter )
+        // InternalDataDSL.g:7173:7: ( ( ruleJvmFormalParameter ) )
+        // InternalDataDSL.g:7174:8: ( ruleJvmFormalParameter )
         {
-        // InternalDataDSL.g:6553:8: ( ruleJvmFormalParameter )
-        // InternalDataDSL.g:6554:9: ruleJvmFormalParameter
+        // InternalDataDSL.g:7174:8: ( ruleJvmFormalParameter )
+        // InternalDataDSL.g:7175:9: ruleJvmFormalParameter
         {
-        pushFollow(FOLLOW_119);
+        pushFollow(FOLLOW_125);
         ruleJvmFormalParameter();
 
         state._fsp--;
@@ -28837,7 +30548,7 @@
 
         }
 
-        match(input,123,FOLLOW_2); if (state.failed) return ;
+        match(input,136,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28848,17 +30559,17 @@
 
     // $ANTLR start synpred35_InternalDataDSL
     public final void synpred35_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:7369:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
-        // InternalDataDSL.g:7369:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalDataDSL.g:7990:5: ( ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) ) )
+        // InternalDataDSL.g:7990:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
         {
-        // InternalDataDSL.g:7369:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
-        // InternalDataDSL.g:7370:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
+        // InternalDataDSL.g:7990:6: ( ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) ) )
+        // InternalDataDSL.g:7991:6: ( ( ruleJvmTypeReference ) ) ( ( ruleValidID ) )
         {
-        // InternalDataDSL.g:7370:6: ( ( ruleJvmTypeReference ) )
-        // InternalDataDSL.g:7371:7: ( ruleJvmTypeReference )
+        // InternalDataDSL.g:7991:6: ( ( ruleJvmTypeReference ) )
+        // InternalDataDSL.g:7992:7: ( ruleJvmTypeReference )
         {
-        // InternalDataDSL.g:7371:7: ( ruleJvmTypeReference )
-        // InternalDataDSL.g:7372:8: ruleJvmTypeReference
+        // InternalDataDSL.g:7992:7: ( ruleJvmTypeReference )
+        // InternalDataDSL.g:7993:8: ruleJvmTypeReference
         {
         pushFollow(FOLLOW_4);
         ruleJvmTypeReference();
@@ -28871,11 +30582,11 @@
 
         }
 
-        // InternalDataDSL.g:7375:6: ( ( ruleValidID ) )
-        // InternalDataDSL.g:7376:7: ( ruleValidID )
+        // InternalDataDSL.g:7996:6: ( ( ruleValidID ) )
+        // InternalDataDSL.g:7997:7: ( ruleValidID )
         {
-        // InternalDataDSL.g:7376:7: ( ruleValidID )
-        // InternalDataDSL.g:7377:8: ruleValidID
+        // InternalDataDSL.g:7997:7: ( ruleValidID )
+        // InternalDataDSL.g:7998:8: ruleValidID
         {
         pushFollow(FOLLOW_2);
         ruleValidID();
@@ -28898,13 +30609,13 @@
 
     // $ANTLR start synpred36_InternalDataDSL
     public final void synpred36_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:7681:5: ( ( '(' ) )
-        // InternalDataDSL.g:7681:6: ( '(' )
+        // InternalDataDSL.g:8302:5: ( ( '(' ) )
+        // InternalDataDSL.g:8302:6: ( '(' )
         {
-        // InternalDataDSL.g:7681:6: ( '(' )
-        // InternalDataDSL.g:7682:6: '('
+        // InternalDataDSL.g:8302:6: ( '(' )
+        // InternalDataDSL.g:8303:6: '('
         {
-        match(input,81,FOLLOW_2); if (state.failed) return ;
+        match(input,94,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -28915,35 +30626,35 @@
 
     // $ANTLR start synpred37_InternalDataDSL
     public final void synpred37_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:7700:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalDataDSL.g:7700:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:8321:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalDataDSL.g:8321:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalDataDSL.g:7700:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalDataDSL.g:7701:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalDataDSL.g:8321:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:8322:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalDataDSL.g:7701:7: ()
-        // InternalDataDSL.g:7702:7: 
+        // InternalDataDSL.g:8322:7: ()
+        // InternalDataDSL.g:8323:7: 
         {
         }
 
-        // InternalDataDSL.g:7703:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
-        int alt190=2;
-        int LA190_0 = input.LA(1);
+        // InternalDataDSL.g:8324:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt197=2;
+        int LA197_0 = input.LA(1);
 
-        if ( (LA190_0==RULE_ID||LA190_0==81||LA190_0==106) ) {
-            alt190=1;
+        if ( (LA197_0==RULE_ID||LA197_0==94||LA197_0==119) ) {
+            alt197=1;
         }
-        switch (alt190) {
+        switch (alt197) {
             case 1 :
-                // InternalDataDSL.g:7704:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalDataDSL.g:8325:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalDataDSL.g:7704:8: ( ( ruleJvmFormalParameter ) )
-                // InternalDataDSL.g:7705:9: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:8325:8: ( ( ruleJvmFormalParameter ) )
+                // InternalDataDSL.g:8326:9: ( ruleJvmFormalParameter )
                 {
-                // InternalDataDSL.g:7705:9: ( ruleJvmFormalParameter )
-                // InternalDataDSL.g:7706:10: ruleJvmFormalParameter
+                // InternalDataDSL.g:8326:9: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:8327:10: ruleJvmFormalParameter
                 {
-                pushFollow(FOLLOW_111);
+                pushFollow(FOLLOW_117);
                 ruleJvmFormalParameter();
 
                 state._fsp--;
@@ -28954,29 +30665,29 @@
 
                 }
 
-                // InternalDataDSL.g:7709:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
-                loop189:
+                // InternalDataDSL.g:8330:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop196:
                 do {
-                    int alt189=2;
-                    int LA189_0 = input.LA(1);
+                    int alt196=2;
+                    int LA196_0 = input.LA(1);
 
-                    if ( (LA189_0==82) ) {
-                        alt189=1;
+                    if ( (LA196_0==95) ) {
+                        alt196=1;
                     }
 
 
-                    switch (alt189) {
+                    switch (alt196) {
                 	case 1 :
-                	    // InternalDataDSL.g:7710:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:8331:9: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
-                	    match(input,82,FOLLOW_91); if (state.failed) return ;
-                	    // InternalDataDSL.g:7711:9: ( ( ruleJvmFormalParameter ) )
-                	    // InternalDataDSL.g:7712:10: ( ruleJvmFormalParameter )
+                	    match(input,95,FOLLOW_97); if (state.failed) return ;
+                	    // InternalDataDSL.g:8332:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:8333:10: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalDataDSL.g:7712:10: ( ruleJvmFormalParameter )
-                	    // InternalDataDSL.g:7713:11: ruleJvmFormalParameter
+                	    // InternalDataDSL.g:8333:10: ( ruleJvmFormalParameter )
+                	    // InternalDataDSL.g:8334:11: ruleJvmFormalParameter
                 	    {
-                	    pushFollow(FOLLOW_111);
+                	    pushFollow(FOLLOW_117);
                 	    ruleJvmFormalParameter();
 
                 	    state._fsp--;
@@ -28992,7 +30703,7 @@
                 	    break;
 
                 	default :
-                	    break loop189;
+                	    break loop196;
                     }
                 } while (true);
 
@@ -29002,13 +30713,13 @@
 
         }
 
-        // InternalDataDSL.g:7718:7: ( ( '|' ) )
-        // InternalDataDSL.g:7719:8: ( '|' )
+        // InternalDataDSL.g:8339:7: ( ( '|' ) )
+        // InternalDataDSL.g:8340:8: ( '|' )
         {
-        // InternalDataDSL.g:7719:8: ( '|' )
-        // InternalDataDSL.g:7720:9: '|'
+        // InternalDataDSL.g:8340:8: ( '|' )
+        // InternalDataDSL.g:8341:9: '|'
         {
-        match(input,119,FOLLOW_2); if (state.failed) return ;
+        match(input,132,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29025,18 +30736,18 @@
 
     // $ANTLR start synpred38_InternalDataDSL
     public final void synpred38_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:7797:4: ( ( () '[' ) )
-        // InternalDataDSL.g:7797:5: ( () '[' )
+        // InternalDataDSL.g:8418:4: ( ( () '[' ) )
+        // InternalDataDSL.g:8418:5: ( () '[' )
         {
-        // InternalDataDSL.g:7797:5: ( () '[' )
-        // InternalDataDSL.g:7798:5: () '['
+        // InternalDataDSL.g:8418:5: ( () '[' )
+        // InternalDataDSL.g:8419:5: () '['
         {
-        // InternalDataDSL.g:7798:5: ()
-        // InternalDataDSL.g:7799:5: 
+        // InternalDataDSL.g:8419:5: ()
+        // InternalDataDSL.g:8420:5: 
         {
         }
 
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29047,10 +30758,10 @@
 
     // $ANTLR start synpred39_InternalDataDSL
     public final void synpred39_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:7957:5: ( '<' )
-        // InternalDataDSL.g:7957:6: '<'
+        // InternalDataDSL.g:8578:5: ( '<' )
+        // InternalDataDSL.g:8578:6: '<'
         {
-        match(input,93,FOLLOW_2); if (state.failed) return ;
+        match(input,106,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29058,13 +30769,13 @@
 
     // $ANTLR start synpred40_InternalDataDSL
     public final void synpred40_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8014:5: ( ( '(' ) )
-        // InternalDataDSL.g:8014:6: ( '(' )
+        // InternalDataDSL.g:8635:5: ( ( '(' ) )
+        // InternalDataDSL.g:8635:6: ( '(' )
         {
-        // InternalDataDSL.g:8014:6: ( '(' )
-        // InternalDataDSL.g:8015:6: '('
+        // InternalDataDSL.g:8635:6: ( '(' )
+        // InternalDataDSL.g:8636:6: '('
         {
-        match(input,81,FOLLOW_2); if (state.failed) return ;
+        match(input,94,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29075,35 +30786,35 @@
 
     // $ANTLR start synpred41_InternalDataDSL
     public final void synpred41_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8033:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
-        // InternalDataDSL.g:8033:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:8654:6: ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )
+        // InternalDataDSL.g:8654:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
         {
-        // InternalDataDSL.g:8033:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
-        // InternalDataDSL.g:8034:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
+        // InternalDataDSL.g:8654:7: ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) )
+        // InternalDataDSL.g:8655:7: () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) )
         {
-        // InternalDataDSL.g:8034:7: ()
-        // InternalDataDSL.g:8035:7: 
+        // InternalDataDSL.g:8655:7: ()
+        // InternalDataDSL.g:8656:7: 
         {
         }
 
-        // InternalDataDSL.g:8036:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
-        int alt192=2;
-        int LA192_0 = input.LA(1);
+        // InternalDataDSL.g:8657:7: ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )?
+        int alt199=2;
+        int LA199_0 = input.LA(1);
 
-        if ( (LA192_0==RULE_ID||LA192_0==81||LA192_0==106) ) {
-            alt192=1;
+        if ( (LA199_0==RULE_ID||LA199_0==94||LA199_0==119) ) {
+            alt199=1;
         }
-        switch (alt192) {
+        switch (alt199) {
             case 1 :
-                // InternalDataDSL.g:8037:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                // InternalDataDSL.g:8658:8: ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )*
                 {
-                // InternalDataDSL.g:8037:8: ( ( ruleJvmFormalParameter ) )
-                // InternalDataDSL.g:8038:9: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:8658:8: ( ( ruleJvmFormalParameter ) )
+                // InternalDataDSL.g:8659:9: ( ruleJvmFormalParameter )
                 {
-                // InternalDataDSL.g:8038:9: ( ruleJvmFormalParameter )
-                // InternalDataDSL.g:8039:10: ruleJvmFormalParameter
+                // InternalDataDSL.g:8659:9: ( ruleJvmFormalParameter )
+                // InternalDataDSL.g:8660:10: ruleJvmFormalParameter
                 {
-                pushFollow(FOLLOW_111);
+                pushFollow(FOLLOW_117);
                 ruleJvmFormalParameter();
 
                 state._fsp--;
@@ -29114,29 +30825,29 @@
 
                 }
 
-                // InternalDataDSL.g:8042:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
-                loop191:
+                // InternalDataDSL.g:8663:8: ( ',' ( ( ruleJvmFormalParameter ) ) )*
+                loop198:
                 do {
-                    int alt191=2;
-                    int LA191_0 = input.LA(1);
+                    int alt198=2;
+                    int LA198_0 = input.LA(1);
 
-                    if ( (LA191_0==82) ) {
-                        alt191=1;
+                    if ( (LA198_0==95) ) {
+                        alt198=1;
                     }
 
 
-                    switch (alt191) {
+                    switch (alt198) {
                 	case 1 :
-                	    // InternalDataDSL.g:8043:9: ',' ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:8664:9: ',' ( ( ruleJvmFormalParameter ) )
                 	    {
-                	    match(input,82,FOLLOW_91); if (state.failed) return ;
-                	    // InternalDataDSL.g:8044:9: ( ( ruleJvmFormalParameter ) )
-                	    // InternalDataDSL.g:8045:10: ( ruleJvmFormalParameter )
+                	    match(input,95,FOLLOW_97); if (state.failed) return ;
+                	    // InternalDataDSL.g:8665:9: ( ( ruleJvmFormalParameter ) )
+                	    // InternalDataDSL.g:8666:10: ( ruleJvmFormalParameter )
                 	    {
-                	    // InternalDataDSL.g:8045:10: ( ruleJvmFormalParameter )
-                	    // InternalDataDSL.g:8046:11: ruleJvmFormalParameter
+                	    // InternalDataDSL.g:8666:10: ( ruleJvmFormalParameter )
+                	    // InternalDataDSL.g:8667:11: ruleJvmFormalParameter
                 	    {
-                	    pushFollow(FOLLOW_111);
+                	    pushFollow(FOLLOW_117);
                 	    ruleJvmFormalParameter();
 
                 	    state._fsp--;
@@ -29152,7 +30863,7 @@
                 	    break;
 
                 	default :
-                	    break loop191;
+                	    break loop198;
                     }
                 } while (true);
 
@@ -29162,13 +30873,13 @@
 
         }
 
-        // InternalDataDSL.g:8051:7: ( ( '|' ) )
-        // InternalDataDSL.g:8052:8: ( '|' )
+        // InternalDataDSL.g:8672:7: ( ( '|' ) )
+        // InternalDataDSL.g:8673:8: ( '|' )
         {
-        // InternalDataDSL.g:8052:8: ( '|' )
-        // InternalDataDSL.g:8053:9: '|'
+        // InternalDataDSL.g:8673:8: ( '|' )
+        // InternalDataDSL.g:8674:9: '|'
         {
-        match(input,119,FOLLOW_2); if (state.failed) return ;
+        match(input,132,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29185,18 +30896,18 @@
 
     // $ANTLR start synpred42_InternalDataDSL
     public final void synpred42_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8130:4: ( ( () '[' ) )
-        // InternalDataDSL.g:8130:5: ( () '[' )
+        // InternalDataDSL.g:8751:4: ( ( () '[' ) )
+        // InternalDataDSL.g:8751:5: ( () '[' )
         {
-        // InternalDataDSL.g:8130:5: ( () '[' )
-        // InternalDataDSL.g:8131:5: () '['
+        // InternalDataDSL.g:8751:5: ( () '[' )
+        // InternalDataDSL.g:8752:5: () '['
         {
-        // InternalDataDSL.g:8131:5: ()
-        // InternalDataDSL.g:8132:5: 
+        // InternalDataDSL.g:8752:5: ()
+        // InternalDataDSL.g:8753:5: 
         {
         }
 
-        match(input,86,FOLLOW_2); if (state.failed) return ;
+        match(input,99,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29207,10 +30918,10 @@
 
     // $ANTLR start synpred43_InternalDataDSL
     public final void synpred43_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8473:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
+        // InternalDataDSL.g:9094:4: ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )
         // InternalDataDSL.g:
         {
-        if ( (input.LA(1)>=RULE_STRING && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||input.LA(1)==50||input.LA(1)==72||(input.LA(1)>=75 && input.LA(1)<=76)||input.LA(1)==81||(input.LA(1)>=85 && input.LA(1)<=86)||input.LA(1)==93||(input.LA(1)>=109 && input.LA(1)<=110)||input.LA(1)==114||input.LA(1)==120||input.LA(1)==122||(input.LA(1)>=126 && input.LA(1)<=127)||(input.LA(1)>=130 && input.LA(1)<=139)||input.LA(1)==141 ) {
+        if ( (input.LA(1)>=RULE_STRING && input.LA(1)<=RULE_DECIMAL)||input.LA(1)==14||input.LA(1)==52||input.LA(1)==75||(input.LA(1)>=88 && input.LA(1)<=89)||input.LA(1)==94||(input.LA(1)>=98 && input.LA(1)<=99)||input.LA(1)==106||(input.LA(1)>=122 && input.LA(1)<=123)||input.LA(1)==127||input.LA(1)==133||input.LA(1)==135||(input.LA(1)>=139 && input.LA(1)<=140)||(input.LA(1)>=143 && input.LA(1)<=152)||input.LA(1)==154 ) {
             input.consume();
             state.errorRecovery=false;state.failed=false;
         }
@@ -29227,10 +30938,10 @@
 
     // $ANTLR start synpred44_InternalDataDSL
     public final void synpred44_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8544:6: ( 'catch' )
-        // InternalDataDSL.g:8544:7: 'catch'
+        // InternalDataDSL.g:9165:6: ( 'catch' )
+        // InternalDataDSL.g:9165:7: 'catch'
         {
-        match(input,142,FOLLOW_2); if (state.failed) return ;
+        match(input,155,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29238,10 +30949,10 @@
 
     // $ANTLR start synpred45_InternalDataDSL
     public final void synpred45_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8565:7: ( 'finally' )
-        // InternalDataDSL.g:8565:8: 'finally'
+        // InternalDataDSL.g:9186:7: ( 'finally' )
+        // InternalDataDSL.g:9186:8: 'finally'
         {
-        match(input,140,FOLLOW_2); if (state.failed) return ;
+        match(input,153,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29249,10 +30960,10 @@
 
     // $ANTLR start synpred48_InternalDataDSL
     public final void synpred48_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8809:5: ( '.' )
-        // InternalDataDSL.g:8809:6: '.'
+        // InternalDataDSL.g:9430:5: ( '.' )
+        // InternalDataDSL.g:9430:6: '.'
         {
-        match(input,74,FOLLOW_2); if (state.failed) return ;
+        match(input,87,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29260,14 +30971,14 @@
 
     // $ANTLR start synpred49_InternalDataDSL
     public final void synpred49_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:8935:5: ( ( () ruleArrayBrackets ) )
-        // InternalDataDSL.g:8935:6: ( () ruleArrayBrackets )
+        // InternalDataDSL.g:9556:5: ( ( () ruleArrayBrackets ) )
+        // InternalDataDSL.g:9556:6: ( () ruleArrayBrackets )
         {
-        // InternalDataDSL.g:8935:6: ( () ruleArrayBrackets )
-        // InternalDataDSL.g:8936:6: () ruleArrayBrackets
+        // InternalDataDSL.g:9556:6: ( () ruleArrayBrackets )
+        // InternalDataDSL.g:9557:6: () ruleArrayBrackets
         {
-        // InternalDataDSL.g:8936:6: ()
-        // InternalDataDSL.g:8937:6: 
+        // InternalDataDSL.g:9557:6: ()
+        // InternalDataDSL.g:9558:6: 
         {
         }
 
@@ -29286,10 +30997,10 @@
 
     // $ANTLR start synpred50_InternalDataDSL
     public final void synpred50_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:9132:5: ( '<' )
-        // InternalDataDSL.g:9132:6: '<'
+        // InternalDataDSL.g:9753:5: ( '<' )
+        // InternalDataDSL.g:9753:6: '<'
         {
-        match(input,93,FOLLOW_2); if (state.failed) return ;
+        match(input,106,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29297,18 +31008,18 @@
 
     // $ANTLR start synpred51_InternalDataDSL
     public final void synpred51_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:9188:6: ( ( () '.' ) )
-        // InternalDataDSL.g:9188:7: ( () '.' )
+        // InternalDataDSL.g:9809:6: ( ( () '.' ) )
+        // InternalDataDSL.g:9809:7: ( () '.' )
         {
-        // InternalDataDSL.g:9188:7: ( () '.' )
-        // InternalDataDSL.g:9189:7: () '.'
+        // InternalDataDSL.g:9809:7: ( () '.' )
+        // InternalDataDSL.g:9810:7: () '.'
         {
-        // InternalDataDSL.g:9189:7: ()
-        // InternalDataDSL.g:9190:7: 
+        // InternalDataDSL.g:9810:7: ()
+        // InternalDataDSL.g:9811:7: 
         {
         }
 
-        match(input,74,FOLLOW_2); if (state.failed) return ;
+        match(input,87,FOLLOW_2); if (state.failed) return ;
 
         }
 
@@ -29319,10 +31030,10 @@
 
     // $ANTLR start synpred52_InternalDataDSL
     public final void synpred52_InternalDataDSL_fragment() throws RecognitionException {   
-        // InternalDataDSL.g:9226:7: ( '<' )
-        // InternalDataDSL.g:9226:8: '<'
+        // InternalDataDSL.g:9847:7: ( '<' )
+        // InternalDataDSL.g:9847:8: '<'
         {
-        match(input,93,FOLLOW_2); if (state.failed) return ;
+        match(input,106,FOLLOW_2); if (state.failed) return ;
 
         }
     }
@@ -29962,45 +31673,45 @@
     }
 
 
-    protected DFA54 dfa54 = new DFA54(this);
-    protected DFA57 dfa57 = new DFA57(this);
-    protected DFA63 dfa63 = new DFA63(this);
-    protected DFA66 dfa66 = new DFA66(this);
-    protected DFA68 dfa68 = new DFA68(this);
-    protected DFA78 dfa78 = new DFA78(this);
-    protected DFA81 dfa81 = new DFA81(this);
-    protected DFA97 dfa97 = new DFA97(this);
-    protected DFA96 dfa96 = new DFA96(this);
-    protected DFA98 dfa98 = new DFA98(this);
-    protected DFA100 dfa100 = new DFA100(this);
-    protected DFA109 dfa109 = new DFA109(this);
+    protected DFA61 dfa61 = new DFA61(this);
+    protected DFA64 dfa64 = new DFA64(this);
+    protected DFA70 dfa70 = new DFA70(this);
+    protected DFA73 dfa73 = new DFA73(this);
+    protected DFA75 dfa75 = new DFA75(this);
+    protected DFA85 dfa85 = new DFA85(this);
+    protected DFA88 dfa88 = new DFA88(this);
+    protected DFA104 dfa104 = new DFA104(this);
+    protected DFA103 dfa103 = new DFA103(this);
+    protected DFA105 dfa105 = new DFA105(this);
+    protected DFA107 dfa107 = new DFA107(this);
     protected DFA116 dfa116 = new DFA116(this);
-    protected DFA115 dfa115 = new DFA115(this);
-    protected DFA138 dfa138 = new DFA138(this);
-    protected DFA137 dfa137 = new DFA137(this);
-    protected DFA139 dfa139 = new DFA139(this);
-    protected DFA143 dfa143 = new DFA143(this);
-    protected DFA146 dfa146 = new DFA146(this);
+    protected DFA123 dfa123 = new DFA123(this);
+    protected DFA122 dfa122 = new DFA122(this);
     protected DFA145 dfa145 = new DFA145(this);
-    protected DFA147 dfa147 = new DFA147(this);
+    protected DFA144 dfa144 = new DFA144(this);
+    protected DFA146 dfa146 = new DFA146(this);
     protected DFA150 dfa150 = new DFA150(this);
-    protected DFA168 dfa168 = new DFA168(this);
-    protected DFA166 dfa166 = new DFA166(this);
+    protected DFA153 dfa153 = new DFA153(this);
+    protected DFA152 dfa152 = new DFA152(this);
+    protected DFA154 dfa154 = new DFA154(this);
+    protected DFA157 dfa157 = new DFA157(this);
+    protected DFA175 dfa175 = new DFA175(this);
+    protected DFA173 dfa173 = new DFA173(this);
     static final String dfa_1s = "\10\uffff";
     static final String dfa_2s = "\2\uffff\1\5\4\uffff\1\5";
     static final String dfa_3s = "\1\6\1\uffff\1\15\1\uffff\1\6\2\uffff\1\15";
-    static final String dfa_4s = "\1\116\1\uffff\1\117\1\uffff\1\115\2\uffff\1\117";
+    static final String dfa_4s = "\1\133\1\uffff\1\134\1\uffff\1\132\2\uffff\1\134";
     static final String dfa_5s = "\1\uffff\1\1\1\uffff\1\4\1\uffff\1\2\1\3\1\uffff";
     static final String dfa_6s = "\10\uffff}>";
     static final String[] dfa_7s = {
-            "\1\2\105\uffff\1\1\1\uffff\1\3",
+            "\1\2\122\uffff\1\1\1\uffff\1\3",
             "",
-            "\1\5\74\uffff\1\4\1\5\3\uffff\1\5",
+            "\1\5\111\uffff\1\4\1\5\3\uffff\1\5",
             "",
-            "\1\7\106\uffff\1\6",
+            "\1\7\123\uffff\1\6",
             "",
             "",
-            "\1\5\74\uffff\1\4\1\5\3\uffff\1\5"
+            "\1\5\111\uffff\1\4\1\5\3\uffff\1\5"
     };
 
     static final short[] dfa_1 = DFA.unpackEncodedString(dfa_1s);
@@ -30011,11 +31722,11 @@
     static final short[] dfa_6 = DFA.unpackEncodedString(dfa_6s);
     static final short[][] dfa_7 = unpackEncodedStringArray(dfa_7s);
 
-    class DFA54 extends DFA {
+    class DFA61 extends DFA {
 
-        public DFA54(BaseRecognizer recognizer) {
+        public DFA61(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 54;
+            this.decisionNumber = 61;
             this.eot = dfa_1;
             this.eof = dfa_2;
             this.min = dfa_3;
@@ -30025,16 +31736,16 @@
             this.transition = dfa_7;
         }
         public String getDescription() {
-            return "2902:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
+            return "3523:3: ( ( ( (lv_static_2_0= 'static' ) ) ( (lv_extension_3_0= 'extension' ) )? ( ( ruleQualifiedNameInStaticImport ) ) ( ( (lv_wildcard_5_0= '*' ) ) | ( (lv_memberName_6_0= ruleValidID ) ) ) ) | ( ( ruleQualifiedName ) ) | ( (lv_importedNamespace_8_0= ruleQualifiedNameWithWildcard ) ) | ( ( (lv_fqnImport_9_0= 'ns' ) ) ( (lv_importedFullyQualifiedName_10_0= ruleQualifiedName ) ) ) )";
         }
     }
     static final String dfa_8s = "\44\uffff";
     static final String dfa_9s = "\1\4\1\0\42\uffff";
-    static final String dfa_10s = "\1\u008d\1\0\42\uffff";
+    static final String dfa_10s = "\1\u009a\1\0\42\uffff";
     static final String dfa_11s = "\2\uffff\1\2\37\uffff\1\3\1\1";
     static final String dfa_12s = "\1\uffff\1\0\42\uffff}>";
     static final String[] dfa_13s = {
-            "\2\2\1\1\2\2\5\uffff\1\2\43\uffff\1\2\25\uffff\1\2\2\uffff\2\2\3\uffff\2\2\1\uffff\1\42\1\uffff\2\2\6\uffff\1\2\17\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
+            "\2\2\1\1\2\2\5\uffff\1\2\45\uffff\1\2\26\uffff\1\2\14\uffff\2\2\3\uffff\2\2\1\uffff\1\42\1\uffff\2\2\6\uffff\1\2\17\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -30079,11 +31790,11 @@
     static final short[] dfa_12 = DFA.unpackEncodedString(dfa_12s);
     static final short[][] dfa_13 = unpackEncodedStringArray(dfa_13s);
 
-    class DFA57 extends DFA {
+    class DFA64 extends DFA {
 
-        public DFA57(BaseRecognizer recognizer) {
+        public DFA64(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 57;
+            this.decisionNumber = 64;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_9;
@@ -30093,17 +31804,17 @@
             this.transition = dfa_13;
         }
         public String getDescription() {
-            return "3119:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
+            return "3740:4: ( ( ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_4_0= ruleXAnnotationElementValuePair ) ) (otherlv_5= ',' ( ( ( ( ( ruleValidID ) ) '=' ) )=> (lv_elementValuePairs_6_0= ruleXAnnotationElementValuePair ) ) )* ) | ( (lv_value_7_0= ruleXAnnotationElementValueOrCommaList ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA57_1 = input.LA(1);
+                        int LA64_1 = input.LA(1);
 
                          
-                        int index57_1 = input.index();
+                        int index64_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred2_InternalDataDSL()) ) {s = 35;}
@@ -30111,24 +31822,24 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index57_1);
+                        input.seek(index64_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 57, _s, input);
+                new NoViableAltException(getDescription(), 64, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_14s = "\43\uffff";
     static final String dfa_15s = "\1\4\1\0\41\uffff";
-    static final String dfa_16s = "\1\u008d\1\0\41\uffff";
+    static final String dfa_16s = "\1\u009a\1\0\41\uffff";
     static final String dfa_17s = "\2\uffff\1\2\37\uffff\1\1";
     static final String dfa_18s = "\1\uffff\1\0\41\uffff}>";
     static final String[] dfa_19s = {
-            "\5\2\5\uffff\1\2\43\uffff\1\2\25\uffff\1\2\2\uffff\2\2\3\uffff\2\2\3\uffff\1\1\1\2\6\uffff\1\2\17\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
+            "\5\2\5\uffff\1\2\45\uffff\1\2\26\uffff\1\2\14\uffff\2\2\3\uffff\2\2\3\uffff\1\1\1\2\6\uffff\1\2\17\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -30172,11 +31883,11 @@
     static final short[] dfa_18 = DFA.unpackEncodedString(dfa_18s);
     static final short[][] dfa_19 = unpackEncodedStringArray(dfa_19s);
 
-    class DFA63 extends DFA {
+    class DFA70 extends DFA {
 
-        public DFA63(BaseRecognizer recognizer) {
+        public DFA70(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 63;
+            this.decisionNumber = 70;
             this.eot = dfa_14;
             this.eof = dfa_14;
             this.min = dfa_15;
@@ -30186,17 +31897,17 @@
             this.transition = dfa_19;
         }
         public String getDescription() {
-            return "3299:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
+            return "3920:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | (this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression ( () (otherlv_9= ',' ( (lv_elements_10_0= ruleXAnnotationOrExpression ) ) )+ )? ) )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA63_1 = input.LA(1);
+                        int LA70_1 = input.LA(1);
 
                          
-                        int index63_1 = input.index();
+                        int index70_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred5_InternalDataDSL()) ) {s = 34;}
@@ -30204,23 +31915,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index63_1);
+                        input.seek(index70_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 63, _s, input);
+                new NoViableAltException(getDescription(), 70, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA66 extends DFA {
+    class DFA73 extends DFA {
 
-        public DFA66(BaseRecognizer recognizer) {
+        public DFA73(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 66;
+            this.decisionNumber = 73;
             this.eot = dfa_14;
             this.eof = dfa_14;
             this.min = dfa_15;
@@ -30230,17 +31941,17 @@
             this.transition = dfa_19;
         }
         public String getDescription() {
-            return "3441:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
+            return "4062:2: ( ( ( ( ( () '#' '[' ) )=> ( () otherlv_1= '#' otherlv_2= '[' ) ) ( ( (lv_elements_3_0= ruleXAnnotationOrExpression ) ) (otherlv_4= ',' ( (lv_elements_5_0= ruleXAnnotationOrExpression ) ) )* )? otherlv_6= ']' ) | this_XAnnotationOrExpression_7= ruleXAnnotationOrExpression )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA66_1 = input.LA(1);
+                        int LA73_1 = input.LA(1);
 
                          
-                        int index66_1 = input.index();
+                        int index73_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred6_InternalDataDSL()) ) {s = 34;}
@@ -30248,13 +31959,13 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index66_1);
+                        input.seek(index73_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 66, _s, input);
+                new NoViableAltException(getDescription(), 73, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -30262,11 +31973,11 @@
     static final String dfa_20s = "\12\uffff";
     static final String dfa_21s = "\1\10\11\uffff";
     static final String dfa_22s = "\1\4\7\0\2\uffff";
-    static final String dfa_23s = "\1\u008e\7\0\2\uffff";
+    static final String dfa_23s = "\1\u009b\7\0\2\uffff";
     static final String dfa_24s = "\10\uffff\1\2\1\1";
-    static final String dfa_25s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\1\0\1\6\2\uffff}>";
+    static final String dfa_25s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\2\uffff}>";
     static final String[] dfa_26s = {
-            "\5\10\5\uffff\2\10\42\uffff\1\10\21\uffff\1\10\3\uffff\1\10\1\uffff\4\10\1\uffff\1\10\1\uffff\3\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\30\10\1\uffff\27\10",
+            "\5\10\5\uffff\2\10\44\uffff\1\10\22\uffff\1\10\3\uffff\1\10\13\uffff\4\10\1\uffff\1\10\1\uffff\3\10\1\uffff\3\10\1\1\1\2\1\3\1\4\1\5\1\6\1\7\30\10\1\uffff\27\10",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -30286,11 +31997,11 @@
     static final short[] dfa_25 = DFA.unpackEncodedString(dfa_25s);
     static final short[][] dfa_26 = unpackEncodedStringArray(dfa_26s);
 
-    class DFA68 extends DFA {
+    class DFA75 extends DFA {
 
-        public DFA68(BaseRecognizer recognizer) {
+        public DFA75(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 68;
+            this.decisionNumber = 75;
             this.eot = dfa_20;
             this.eof = dfa_21;
             this.min = dfa_22;
@@ -30300,17 +32011,17 @@
             this.transition = dfa_26;
         }
         public String getDescription() {
-            return "3670:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
+            return "4291:4: ( ( ( ( () ( ( ruleOpMultiAssign ) ) ) )=> ( () ( ( ruleOpMultiAssign ) ) ) ) ( (lv_rightOperand_7_0= ruleXAssignment ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA68_6 = input.LA(1);
+                        int LA75_1 = input.LA(1);
 
                          
-                        int index68_6 = input.index();
+                        int index75_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30318,14 +32029,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_6);
+                        input.seek(index75_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA68_1 = input.LA(1);
+                        int LA75_2 = input.LA(1);
 
                          
-                        int index68_1 = input.index();
+                        int index75_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30333,14 +32044,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_1);
+                        input.seek(index75_2);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA68_2 = input.LA(1);
+                        int LA75_3 = input.LA(1);
 
                          
-                        int index68_2 = input.index();
+                        int index75_3 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30348,14 +32059,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_2);
+                        input.seek(index75_3);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA68_3 = input.LA(1);
+                        int LA75_4 = input.LA(1);
 
                          
-                        int index68_3 = input.index();
+                        int index75_4 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30363,14 +32074,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_3);
+                        input.seek(index75_4);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA68_4 = input.LA(1);
+                        int LA75_5 = input.LA(1);
 
                          
-                        int index68_4 = input.index();
+                        int index75_5 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30378,14 +32089,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_4);
+                        input.seek(index75_5);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA68_5 = input.LA(1);
+                        int LA75_6 = input.LA(1);
 
                          
-                        int index68_5 = input.index();
+                        int index75_6 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30393,14 +32104,14 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_5);
+                        input.seek(index75_6);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA68_7 = input.LA(1);
+                        int LA75_7 = input.LA(1);
 
                          
-                        int index68_7 = input.index();
+                        int index75_7 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred7_InternalDataDSL()) ) {s = 9;}
@@ -30408,13 +32119,13 @@
                         else if ( (true) ) {s = 8;}
 
                          
-                        input.seek(index68_7);
+                        input.seek(index75_7);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 68, _s, input);
+                new NoViableAltException(getDescription(), 75, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -30422,11 +32133,11 @@
     static final String dfa_27s = "\13\uffff";
     static final String dfa_28s = "\1\1\12\uffff";
     static final String dfa_29s = "\1\4\1\uffff\10\0\1\uffff";
-    static final String dfa_30s = "\1\u008e\1\uffff\10\0\1\uffff";
+    static final String dfa_30s = "\1\u009b\1\uffff\10\0\1\uffff";
     static final String dfa_31s = "\1\uffff\1\2\10\uffff\1\1";
-    static final String dfa_32s = "\2\uffff\1\3\1\4\1\5\1\6\1\7\1\0\1\1\1\2\1\uffff}>";
+    static final String dfa_32s = "\2\uffff\1\3\1\6\1\4\1\5\1\7\1\2\1\0\1\1\1\uffff}>";
     static final String[] dfa_33s = {
-            "\5\1\5\uffff\2\1\42\uffff\1\1\21\uffff\1\1\3\uffff\1\1\1\uffff\4\1\1\uffff\1\1\1\uffff\3\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\12\1\1\uffff\27\1",
+            "\5\1\5\uffff\2\1\44\uffff\1\1\22\uffff\1\1\3\uffff\1\1\13\uffff\4\1\1\uffff\1\1\1\uffff\3\1\1\uffff\10\1\1\2\1\3\10\1\1\4\1\5\1\6\1\7\1\10\1\11\12\1\1\uffff\27\1",
             "",
             "\1\uffff",
             "\1\uffff",
@@ -30447,11 +32158,11 @@
     static final short[] dfa_32 = DFA.unpackEncodedString(dfa_32s);
     static final short[][] dfa_33 = unpackEncodedStringArray(dfa_33s);
 
-    class DFA78 extends DFA {
+    class DFA85 extends DFA {
 
-        public DFA78(BaseRecognizer recognizer) {
+        public DFA85(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 78;
+            this.decisionNumber = 85;
             this.eot = dfa_27;
             this.eof = dfa_28;
             this.min = dfa_29;
@@ -30461,17 +32172,17 @@
             this.transition = dfa_33;
         }
         public String getDescription() {
-            return "()* loopback of 4384:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
+            return "()* loopback of 5005:3: ( ( ( ( () ( ( ruleOpOther ) ) ) )=> ( () ( ( ruleOpOther ) ) ) ) ( (lv_rightOperand_3_0= ruleXAdditiveExpression ) ) )*";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA78_7 = input.LA(1);
+                        int LA85_8 = input.LA(1);
 
                          
-                        int index78_7 = input.index();
+                        int index85_8 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30479,14 +32190,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_7);
+                        input.seek(index85_8);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA78_8 = input.LA(1);
+                        int LA85_9 = input.LA(1);
 
                          
-                        int index78_8 = input.index();
+                        int index85_9 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30494,14 +32205,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_8);
+                        input.seek(index85_9);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA78_9 = input.LA(1);
+                        int LA85_7 = input.LA(1);
 
                          
-                        int index78_9 = input.index();
+                        int index85_7 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30509,14 +32220,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_9);
+                        input.seek(index85_7);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA78_2 = input.LA(1);
+                        int LA85_2 = input.LA(1);
 
                          
-                        int index78_2 = input.index();
+                        int index85_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30524,14 +32235,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_2);
+                        input.seek(index85_2);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA78_3 = input.LA(1);
+                        int LA85_4 = input.LA(1);
 
                          
-                        int index78_3 = input.index();
+                        int index85_4 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30539,14 +32250,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_3);
+                        input.seek(index85_4);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA78_4 = input.LA(1);
+                        int LA85_5 = input.LA(1);
 
                          
-                        int index78_4 = input.index();
+                        int index85_5 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30554,14 +32265,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_4);
+                        input.seek(index85_5);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA78_5 = input.LA(1);
+                        int LA85_3 = input.LA(1);
 
                          
-                        int index78_5 = input.index();
+                        int index85_3 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30569,14 +32280,14 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_5);
+                        input.seek(index85_3);
                         if ( s>=0 ) return s;
                         break;
                     case 7 : 
-                        int LA78_6 = input.LA(1);
+                        int LA85_6 = input.LA(1);
 
                          
-                        int index78_6 = input.index();
+                        int index85_6 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred13_InternalDataDSL()) ) {s = 10;}
@@ -30584,19 +32295,19 @@
                         else if ( (true) ) {s = 1;}
 
                          
-                        input.seek(index78_6);
+                        input.seek(index85_6);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 78, _s, input);
+                new NoViableAltException(getDescription(), 85, _s, input);
             error(nvae);
             throw nvae;
         }
     }
-    static final String dfa_34s = "\1\135\2\uffff\1\136\7\uffff";
-    static final String dfa_35s = "\1\154\2\uffff\1\151\7\uffff";
+    static final String dfa_34s = "\1\152\2\uffff\1\153\7\uffff";
+    static final String dfa_35s = "\1\171\2\uffff\1\166\7\uffff";
     static final String dfa_36s = "\1\uffff\1\1\1\2\1\uffff\1\4\1\5\1\7\1\10\1\11\1\3\1\6";
     static final String dfa_37s = "\13\uffff}>";
     static final String[] dfa_38s = {
@@ -30618,11 +32329,11 @@
     static final short[] dfa_37 = DFA.unpackEncodedString(dfa_37s);
     static final short[][] dfa_38 = unpackEncodedStringArray(dfa_38s);
 
-    class DFA81 extends DFA {
+    class DFA88 extends DFA {
 
-        public DFA81(BaseRecognizer recognizer) {
+        public DFA88(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 81;
+            this.decisionNumber = 88;
             this.eot = dfa_27;
             this.eof = dfa_27;
             this.min = dfa_34;
@@ -30632,17 +32343,17 @@
             this.transition = dfa_38;
         }
         public String getDescription() {
-            return "4460:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
+            return "5081:2: (kw= '->' | kw= '..<' | (kw= '>' kw= '..' ) | kw= '..' | kw= '=>' | (kw= '>' ( ( ( ( '>' '>' ) )=> (kw= '>' kw= '>' ) ) | kw= '>' ) ) | (kw= '<' ( ( ( ( '<' '<' ) )=> (kw= '<' kw= '<' ) ) | kw= '<' | kw= '=>' ) ) | kw= '<>' | kw= '?:' )";
         }
     }
     static final String dfa_39s = "\116\uffff";
     static final String dfa_40s = "\1\2\115\uffff";
     static final String dfa_41s = "\1\4\1\0\114\uffff";
-    static final String dfa_42s = "\1\u008e\1\0\114\uffff";
+    static final String dfa_42s = "\1\u009b\1\0\114\uffff";
     static final String dfa_43s = "\2\uffff\1\2\112\uffff\1\1";
     static final String dfa_44s = "\1\uffff\1\0\114\uffff}>";
     static final String[] dfa_45s = {
-            "\5\2\5\uffff\2\2\42\uffff\1\2\21\uffff\1\2\3\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\uffff\1\1\2\2\1\uffff\42\2\1\uffff\27\2",
+            "\5\2\5\uffff\2\2\44\uffff\1\2\22\uffff\1\2\3\uffff\1\2\13\uffff\4\2\1\uffff\1\2\1\uffff\1\1\2\2\1\uffff\42\2\1\uffff\27\2",
             "\1\uffff",
             "",
             "",
@@ -30730,11 +32441,11 @@
     static final short[] dfa_44 = DFA.unpackEncodedString(dfa_44s);
     static final short[][] dfa_45 = unpackEncodedStringArray(dfa_45s);
 
-    class DFA97 extends DFA {
+    class DFA104 extends DFA {
 
-        public DFA97(BaseRecognizer recognizer) {
+        public DFA104(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 97;
+            this.decisionNumber = 104;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -30744,17 +32455,17 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "5361:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
+            return "5982:5: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_17_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )? otherlv_22= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA97_1 = input.LA(1);
+                        int LA104_1 = input.LA(1);
 
                          
-                        int index97_1 = input.index();
+                        int index104_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred22_InternalDataDSL()) ) {s = 77;}
@@ -30762,23 +32473,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index97_1);
+                        input.seek(index104_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 97, _s, input);
+                new NoViableAltException(getDescription(), 104, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_46s = "\1\4\2\0\41\uffff";
-    static final String dfa_47s = "\1\u008d\2\0\41\uffff";
+    static final String dfa_47s = "\1\u009a\2\0\41\uffff";
     static final String dfa_48s = "\3\uffff\2\1\1\2\35\uffff\1\3";
     static final String dfa_49s = "\1\0\1\1\1\2\41\uffff}>";
     static final String[] dfa_50s = {
-            "\2\5\1\1\2\5\5\uffff\1\5\43\uffff\1\5\25\uffff\1\5\2\uffff\2\5\4\uffff\1\2\1\uffff\1\43\1\uffff\2\5\6\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\2\5\2\uffff\12\5\1\uffff\1\5",
+            "\2\5\1\1\2\5\5\uffff\1\5\45\uffff\1\5\26\uffff\1\5\14\uffff\2\5\4\uffff\1\2\1\uffff\1\43\1\uffff\2\5\6\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\2\5\2\uffff\12\5\1\uffff\1\5",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -30821,11 +32532,11 @@
     static final short[] dfa_49 = DFA.unpackEncodedString(dfa_49s);
     static final short[][] dfa_50 = unpackEncodedStringArray(dfa_50s);
 
-    class DFA96 extends DFA {
+    class DFA103 extends DFA {
 
-        public DFA96(BaseRecognizer recognizer) {
+        public DFA103(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 96;
+            this.decisionNumber = 103;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_46;
@@ -30835,40 +32546,40 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "5380:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
+            return "6001:6: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_memberCallArguments_18_0= ruleXShortClosure ) ) | ( ( (lv_memberCallArguments_19_0= ruleXExpression ) ) (otherlv_20= ',' ( (lv_memberCallArguments_21_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA96_0 = input.LA(1);
+                        int LA103_0 = input.LA(1);
 
                          
-                        int index96_0 = input.index();
+                        int index103_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA96_0==RULE_ID) ) {s = 1;}
+                        if ( (LA103_0==RULE_ID) ) {s = 1;}
 
-                        else if ( (LA96_0==81) ) {s = 2;}
+                        else if ( (LA103_0==94) ) {s = 2;}
 
-                        else if ( (LA96_0==106) && (synpred23_InternalDataDSL())) {s = 3;}
+                        else if ( (LA103_0==119) && (synpred23_InternalDataDSL())) {s = 3;}
 
-                        else if ( (LA96_0==119) && (synpred23_InternalDataDSL())) {s = 4;}
+                        else if ( (LA103_0==132) && (synpred23_InternalDataDSL())) {s = 4;}
 
-                        else if ( ((LA96_0>=RULE_STRING && LA96_0<=RULE_INT)||(LA96_0>=RULE_HEX && LA96_0<=RULE_DECIMAL)||LA96_0==14||LA96_0==50||LA96_0==72||(LA96_0>=75 && LA96_0<=76)||(LA96_0>=85 && LA96_0<=86)||LA96_0==93||(LA96_0>=109 && LA96_0<=110)||LA96_0==114||LA96_0==120||LA96_0==122||(LA96_0>=126 && LA96_0<=127)||(LA96_0>=130 && LA96_0<=139)||LA96_0==141) ) {s = 5;}
+                        else if ( ((LA103_0>=RULE_STRING && LA103_0<=RULE_INT)||(LA103_0>=RULE_HEX && LA103_0<=RULE_DECIMAL)||LA103_0==14||LA103_0==52||LA103_0==75||(LA103_0>=88 && LA103_0<=89)||(LA103_0>=98 && LA103_0<=99)||LA103_0==106||(LA103_0>=122 && LA103_0<=123)||LA103_0==127||LA103_0==133||LA103_0==135||(LA103_0>=139 && LA103_0<=140)||(LA103_0>=143 && LA103_0<=152)||LA103_0==154) ) {s = 5;}
 
-                        else if ( (LA96_0==83) ) {s = 35;}
+                        else if ( (LA103_0==96) ) {s = 35;}
 
                          
-                        input.seek(index96_0);
+                        input.seek(index103_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA96_1 = input.LA(1);
+                        int LA103_1 = input.LA(1);
 
                          
-                        int index96_1 = input.index();
+                        int index103_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred23_InternalDataDSL()) ) {s = 4;}
@@ -30876,14 +32587,14 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index96_1);
+                        input.seek(index103_1);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA96_2 = input.LA(1);
+                        int LA103_2 = input.LA(1);
 
                          
-                        int index96_2 = input.index();
+                        int index103_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred23_InternalDataDSL()) ) {s = 4;}
@@ -30891,19 +32602,19 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index96_2);
+                        input.seek(index103_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 96, _s, input);
+                new NoViableAltException(getDescription(), 103, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_51s = {
-            "\5\2\5\uffff\2\2\42\uffff\1\2\21\uffff\1\2\3\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\1\2\1\1\40\2\1\uffff\27\2",
+            "\5\2\5\uffff\2\2\44\uffff\1\2\22\uffff\1\2\3\uffff\1\2\13\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\1\2\1\1\40\2\1\uffff\27\2",
             "\1\uffff",
             "",
             "",
@@ -30984,11 +32695,11 @@
     };
     static final short[][] dfa_51 = unpackEncodedStringArray(dfa_51s);
 
-    class DFA98 extends DFA {
+    class DFA105 extends DFA {
 
-        public DFA98(BaseRecognizer recognizer) {
+        public DFA105(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 98;
+            this.decisionNumber = 105;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -30998,17 +32709,17 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "5478:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
+            return "6099:5: ( ( ( () '[' ) )=> (lv_memberCallArguments_23_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA98_1 = input.LA(1);
+                        int LA105_1 = input.LA(1);
 
                          
-                        int index98_1 = input.index();
+                        int index105_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred24_InternalDataDSL()) ) {s = 77;}
@@ -31016,24 +32727,24 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index98_1);
+                        input.seek(index105_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 98, _s, input);
+                new NoViableAltException(getDescription(), 105, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_52s = "\40\uffff";
     static final String dfa_53s = "\1\4\26\uffff\1\0\10\uffff";
-    static final String dfa_54s = "\1\u008d\26\uffff\1\0\10\uffff";
+    static final String dfa_54s = "\1\u009a\26\uffff\1\0\10\uffff";
     static final String dfa_55s = "\1\uffff\1\1\1\2\1\3\1\4\1\5\6\uffff\1\6\11\uffff\1\7\1\uffff\1\12\1\13\1\14\1\15\1\16\1\17\1\10\1\11";
     static final String dfa_56s = "\1\0\26\uffff\1\1\10\uffff}>";
     static final String[] dfa_57s = {
-            "\2\14\1\5\2\14\5\uffff\1\2\43\uffff\1\27\25\uffff\1\5\2\uffff\2\5\4\uffff\1\35\3\uffff\2\14\6\uffff\1\5\32\uffff\1\26\1\uffff\1\3\3\uffff\1\30\1\31\2\uffff\2\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
+            "\2\14\1\5\2\14\5\uffff\1\2\45\uffff\1\27\26\uffff\1\5\14\uffff\2\5\4\uffff\1\35\3\uffff\2\14\6\uffff\1\5\32\uffff\1\26\1\uffff\1\3\3\uffff\1\30\1\31\2\uffff\2\5\1\1\4\14\1\32\1\33\1\34\1\uffff\1\4",
             "",
             "",
             "",
@@ -31074,11 +32785,11 @@
     static final short[] dfa_56 = DFA.unpackEncodedString(dfa_56s);
     static final short[][] dfa_57 = unpackEncodedStringArray(dfa_57s);
 
-    class DFA100 extends DFA {
+    class DFA107 extends DFA {
 
-        public DFA100(BaseRecognizer recognizer) {
+        public DFA107(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 100;
+            this.decisionNumber = 107;
             this.eot = dfa_52;
             this.eof = dfa_52;
             this.min = dfa_53;
@@ -31088,56 +32799,56 @@
             this.transition = dfa_57;
         }
         public String getDescription() {
-            return "5523:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
+            return "6144:2: (this_XConstructorCall_0= ruleXConstructorCall | this_XBlockExpression_1= ruleXBlockExpression | this_XSwitchExpression_2= ruleXSwitchExpression | ( ( ( () 'synchronized' '(' ) )=>this_XSynchronizedExpression_3= ruleXSynchronizedExpression ) | this_XFeatureCall_4= ruleXFeatureCall | this_XLiteral_5= ruleXLiteral | this_XIfExpression_6= ruleXIfExpression | ( ( ( () 'for' '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=>this_XForLoopExpression_7= ruleXForLoopExpression ) | this_XBasicForLoopExpression_8= ruleXBasicForLoopExpression | this_XWhileExpression_9= ruleXWhileExpression | this_XDoWhileExpression_10= ruleXDoWhileExpression | this_XThrowExpression_11= ruleXThrowExpression | this_XReturnExpression_12= ruleXReturnExpression | this_XTryCatchFinallyExpression_13= ruleXTryCatchFinallyExpression | this_XParenthesizedExpression_14= ruleXParenthesizedExpression )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA100_0 = input.LA(1);
+                        int LA107_0 = input.LA(1);
 
                          
-                        int index100_0 = input.index();
+                        int index107_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA100_0==132) ) {s = 1;}
+                        if ( (LA107_0==145) ) {s = 1;}
 
-                        else if ( (LA100_0==14) ) {s = 2;}
+                        else if ( (LA107_0==14) ) {s = 2;}
 
-                        else if ( (LA100_0==122) ) {s = 3;}
+                        else if ( (LA107_0==135) ) {s = 3;}
 
-                        else if ( (LA100_0==141) && (synpred25_InternalDataDSL())) {s = 4;}
+                        else if ( (LA107_0==154) && (synpred25_InternalDataDSL())) {s = 4;}
 
-                        else if ( (LA100_0==RULE_ID||LA100_0==72||(LA100_0>=75 && LA100_0<=76)||LA100_0==93||(LA100_0>=130 && LA100_0<=131)) ) {s = 5;}
+                        else if ( (LA107_0==RULE_ID||LA107_0==75||(LA107_0>=88 && LA107_0<=89)||LA107_0==106||(LA107_0>=143 && LA107_0<=144)) ) {s = 5;}
 
-                        else if ( ((LA100_0>=RULE_STRING && LA100_0<=RULE_INT)||(LA100_0>=RULE_HEX && LA100_0<=RULE_DECIMAL)||(LA100_0>=85 && LA100_0<=86)||(LA100_0>=133 && LA100_0<=136)) ) {s = 12;}
+                        else if ( ((LA107_0>=RULE_STRING && LA107_0<=RULE_INT)||(LA107_0>=RULE_HEX && LA107_0<=RULE_DECIMAL)||(LA107_0>=98 && LA107_0<=99)||(LA107_0>=146 && LA107_0<=149)) ) {s = 12;}
 
-                        else if ( (LA100_0==120) ) {s = 22;}
+                        else if ( (LA107_0==133) ) {s = 22;}
 
-                        else if ( (LA100_0==50) ) {s = 23;}
+                        else if ( (LA107_0==52) ) {s = 23;}
 
-                        else if ( (LA100_0==126) ) {s = 24;}
+                        else if ( (LA107_0==139) ) {s = 24;}
 
-                        else if ( (LA100_0==127) ) {s = 25;}
+                        else if ( (LA107_0==140) ) {s = 25;}
 
-                        else if ( (LA100_0==137) ) {s = 26;}
+                        else if ( (LA107_0==150) ) {s = 26;}
 
-                        else if ( (LA100_0==138) ) {s = 27;}
+                        else if ( (LA107_0==151) ) {s = 27;}
 
-                        else if ( (LA100_0==139) ) {s = 28;}
+                        else if ( (LA107_0==152) ) {s = 28;}
 
-                        else if ( (LA100_0==81) ) {s = 29;}
+                        else if ( (LA107_0==94) ) {s = 29;}
 
                          
-                        input.seek(index100_0);
+                        input.seek(index107_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA100_23 = input.LA(1);
+                        int LA107_23 = input.LA(1);
 
                          
-                        int index100_23 = input.index();
+                        int index107_23 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred26_InternalDataDSL()) ) {s = 30;}
@@ -31145,24 +32856,24 @@
                         else if ( (true) ) {s = 31;}
 
                          
-                        input.seek(index100_23);
+                        input.seek(index107_23);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 100, _s, input);
+                new NoViableAltException(getDescription(), 107, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_58s = "\46\uffff";
     static final String dfa_59s = "\1\4\2\0\43\uffff";
-    static final String dfa_60s = "\1\u008d\2\0\43\uffff";
+    static final String dfa_60s = "\1\u009a\2\0\43\uffff";
     static final String dfa_61s = "\3\uffff\2\1\1\2\40\uffff";
     static final String dfa_62s = "\1\0\1\1\1\2\43\uffff}>";
     static final String[] dfa_63s = {
-            "\2\5\1\1\2\5\5\uffff\1\5\43\uffff\1\5\25\uffff\1\5\2\uffff\2\5\4\uffff\1\2\3\uffff\3\5\5\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\16\5\1\uffff\1\5",
+            "\2\5\1\1\2\5\5\uffff\1\5\45\uffff\1\5\26\uffff\1\5\14\uffff\2\5\4\uffff\1\2\3\uffff\3\5\5\uffff\1\5\14\uffff\1\3\2\uffff\2\5\3\uffff\1\5\4\uffff\1\4\1\5\1\uffff\1\5\3\uffff\16\5\1\uffff\1\5",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -31209,11 +32920,11 @@
     static final short[] dfa_62 = DFA.unpackEncodedString(dfa_62s);
     static final short[][] dfa_63 = unpackEncodedStringArray(dfa_63s);
 
-    class DFA109 extends DFA {
+    class DFA116 extends DFA {
 
-        public DFA109(BaseRecognizer recognizer) {
+        public DFA116(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 109;
+            this.decisionNumber = 116;
             this.eot = dfa_58;
             this.eof = dfa_58;
             this.min = dfa_59;
@@ -31223,38 +32934,38 @@
             this.transition = dfa_63;
         }
         public String getDescription() {
-            return "6015:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
+            return "6636:3: ( ( ( ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> ( ( ( (lv_declaredFormalParameters_2_0= ruleJvmFormalParameter ) ) (otherlv_3= ',' ( (lv_declaredFormalParameters_4_0= ruleJvmFormalParameter ) ) )* )? ( (lv_explicitSyntax_5_0= '|' ) ) ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA109_0 = input.LA(1);
+                        int LA116_0 = input.LA(1);
 
                          
-                        int index109_0 = input.index();
+                        int index116_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA109_0==RULE_ID) ) {s = 1;}
+                        if ( (LA116_0==RULE_ID) ) {s = 1;}
 
-                        else if ( (LA109_0==81) ) {s = 2;}
+                        else if ( (LA116_0==94) ) {s = 2;}
 
-                        else if ( (LA109_0==106) && (synpred29_InternalDataDSL())) {s = 3;}
+                        else if ( (LA116_0==119) && (synpred29_InternalDataDSL())) {s = 3;}
 
-                        else if ( (LA109_0==119) && (synpred29_InternalDataDSL())) {s = 4;}
+                        else if ( (LA116_0==132) && (synpred29_InternalDataDSL())) {s = 4;}
 
-                        else if ( ((LA109_0>=RULE_STRING && LA109_0<=RULE_INT)||(LA109_0>=RULE_HEX && LA109_0<=RULE_DECIMAL)||LA109_0==14||LA109_0==50||LA109_0==72||(LA109_0>=75 && LA109_0<=76)||(LA109_0>=85 && LA109_0<=87)||LA109_0==93||(LA109_0>=109 && LA109_0<=110)||LA109_0==114||LA109_0==120||LA109_0==122||(LA109_0>=126 && LA109_0<=139)||LA109_0==141) ) {s = 5;}
+                        else if ( ((LA116_0>=RULE_STRING && LA116_0<=RULE_INT)||(LA116_0>=RULE_HEX && LA116_0<=RULE_DECIMAL)||LA116_0==14||LA116_0==52||LA116_0==75||(LA116_0>=88 && LA116_0<=89)||(LA116_0>=98 && LA116_0<=100)||LA116_0==106||(LA116_0>=122 && LA116_0<=123)||LA116_0==127||LA116_0==133||LA116_0==135||(LA116_0>=139 && LA116_0<=152)||LA116_0==154) ) {s = 5;}
 
                          
-                        input.seek(index109_0);
+                        input.seek(index116_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA109_1 = input.LA(1);
+                        int LA116_1 = input.LA(1);
 
                          
-                        int index109_1 = input.index();
+                        int index116_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred29_InternalDataDSL()) ) {s = 4;}
@@ -31262,14 +32973,14 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index109_1);
+                        input.seek(index116_1);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA109_2 = input.LA(1);
+                        int LA116_2 = input.LA(1);
 
                          
-                        int index109_2 = input.index();
+                        int index116_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred29_InternalDataDSL()) ) {s = 4;}
@@ -31277,19 +32988,19 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index109_2);
+                        input.seek(index116_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 109, _s, input);
+                new NoViableAltException(getDescription(), 116, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_64s = {
-            "\5\2\5\uffff\1\2\43\uffff\1\2\25\uffff\1\2\2\uffff\2\2\4\uffff\1\1\3\uffff\2\2\6\uffff\1\2\14\uffff\1\2\2\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
+            "\5\2\5\uffff\1\2\45\uffff\1\2\26\uffff\1\2\14\uffff\2\2\4\uffff\1\1\3\uffff\2\2\6\uffff\1\2\14\uffff\1\2\2\uffff\2\2\3\uffff\1\2\5\uffff\1\2\1\uffff\1\2\3\uffff\2\2\2\uffff\12\2\1\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -31327,11 +33038,11 @@
     };
     static final short[][] dfa_64 = unpackEncodedStringArray(dfa_64s);
 
-    class DFA116 extends DFA {
+    class DFA123 extends DFA {
 
-        public DFA116(BaseRecognizer recognizer) {
+        public DFA123(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 116;
+            this.decisionNumber = 123;
             this.eot = dfa_14;
             this.eof = dfa_14;
             this.min = dfa_15;
@@ -31341,17 +33052,17 @@
             this.transition = dfa_64;
         }
         public String getDescription() {
-            return "6481:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
+            return "7102:3: ( ( ( ( ( '(' ( ( ruleJvmFormalParameter ) ) ':' ) )=> (otherlv_2= '(' ( (lv_declaredParam_3_0= ruleJvmFormalParameter ) ) otherlv_4= ':' ) ) ( (lv_switch_5_0= ruleXExpression ) ) otherlv_6= ')' ) | ( ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )? ( (lv_switch_9_0= ruleXExpression ) ) ) )";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA116_1 = input.LA(1);
+                        int LA123_1 = input.LA(1);
 
                          
-                        int index116_1 = input.index();
+                        int index123_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred32_InternalDataDSL()) ) {s = 34;}
@@ -31359,24 +33070,24 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index116_1);
+                        input.seek(index123_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 116, _s, input);
+                new NoViableAltException(getDescription(), 123, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_65s = "\42\uffff";
     static final String dfa_66s = "\1\4\2\0\37\uffff";
-    static final String dfa_67s = "\1\u008d\2\0\37\uffff";
+    static final String dfa_67s = "\1\u009a\2\0\37\uffff";
     static final String dfa_68s = "\3\uffff\1\1\1\2\35\uffff";
     static final String dfa_69s = "\1\0\1\1\1\2\37\uffff}>";
     static final String[] dfa_70s = {
-            "\2\4\1\1\2\4\5\uffff\1\4\43\uffff\1\4\25\uffff\1\4\2\uffff\2\4\4\uffff\1\2\3\uffff\2\4\6\uffff\1\4\14\uffff\1\3\2\uffff\2\4\3\uffff\1\4\5\uffff\1\4\1\uffff\1\4\3\uffff\2\4\2\uffff\12\4\1\uffff\1\4",
+            "\2\4\1\1\2\4\5\uffff\1\4\45\uffff\1\4\26\uffff\1\4\14\uffff\2\4\4\uffff\1\2\3\uffff\2\4\6\uffff\1\4\14\uffff\1\3\2\uffff\2\4\3\uffff\1\4\5\uffff\1\4\1\uffff\1\4\3\uffff\2\4\2\uffff\12\4\1\uffff\1\4",
             "\1\uffff",
             "\1\uffff",
             "",
@@ -31419,11 +33130,11 @@
     static final short[] dfa_69 = DFA.unpackEncodedString(dfa_69s);
     static final short[][] dfa_70 = unpackEncodedStringArray(dfa_70s);
 
-    class DFA115 extends DFA {
+    class DFA122 extends DFA {
 
-        public DFA115(BaseRecognizer recognizer) {
+        public DFA122(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 115;
+            this.decisionNumber = 122;
             this.eot = dfa_65;
             this.eof = dfa_65;
             this.min = dfa_66;
@@ -31433,36 +33144,36 @@
             this.transition = dfa_70;
         }
         public String getDescription() {
-            return "6550:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
+            return "7171:5: ( ( ( ( ( ruleJvmFormalParameter ) ) ':' ) )=> ( ( (lv_declaredParam_7_0= ruleJvmFormalParameter ) ) otherlv_8= ':' ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA115_0 = input.LA(1);
+                        int LA122_0 = input.LA(1);
 
                          
-                        int index115_0 = input.index();
+                        int index122_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA115_0==RULE_ID) ) {s = 1;}
+                        if ( (LA122_0==RULE_ID) ) {s = 1;}
 
-                        else if ( (LA115_0==81) ) {s = 2;}
+                        else if ( (LA122_0==94) ) {s = 2;}
 
-                        else if ( (LA115_0==106) && (synpred33_InternalDataDSL())) {s = 3;}
+                        else if ( (LA122_0==119) && (synpred33_InternalDataDSL())) {s = 3;}
 
-                        else if ( ((LA115_0>=RULE_STRING && LA115_0<=RULE_INT)||(LA115_0>=RULE_HEX && LA115_0<=RULE_DECIMAL)||LA115_0==14||LA115_0==50||LA115_0==72||(LA115_0>=75 && LA115_0<=76)||(LA115_0>=85 && LA115_0<=86)||LA115_0==93||(LA115_0>=109 && LA115_0<=110)||LA115_0==114||LA115_0==120||LA115_0==122||(LA115_0>=126 && LA115_0<=127)||(LA115_0>=130 && LA115_0<=139)||LA115_0==141) ) {s = 4;}
+                        else if ( ((LA122_0>=RULE_STRING && LA122_0<=RULE_INT)||(LA122_0>=RULE_HEX && LA122_0<=RULE_DECIMAL)||LA122_0==14||LA122_0==52||LA122_0==75||(LA122_0>=88 && LA122_0<=89)||(LA122_0>=98 && LA122_0<=99)||LA122_0==106||(LA122_0>=122 && LA122_0<=123)||LA122_0==127||LA122_0==133||LA122_0==135||(LA122_0>=139 && LA122_0<=140)||(LA122_0>=143 && LA122_0<=152)||LA122_0==154) ) {s = 4;}
 
                          
-                        input.seek(index115_0);
+                        input.seek(index122_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA115_1 = input.LA(1);
+                        int LA122_1 = input.LA(1);
 
                          
-                        int index115_1 = input.index();
+                        int index122_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred33_InternalDataDSL()) ) {s = 3;}
@@ -31470,14 +33181,14 @@
                         else if ( (true) ) {s = 4;}
 
                          
-                        input.seek(index115_1);
+                        input.seek(index122_1);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA115_2 = input.LA(1);
+                        int LA122_2 = input.LA(1);
 
                          
-                        int index115_2 = input.index();
+                        int index122_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred33_InternalDataDSL()) ) {s = 3;}
@@ -31485,23 +33196,23 @@
                         else if ( (true) ) {s = 4;}
 
                          
-                        input.seek(index115_2);
+                        input.seek(index122_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 115, _s, input);
+                new NoViableAltException(getDescription(), 122, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA138 extends DFA {
+    class DFA145 extends DFA {
 
-        public DFA138(BaseRecognizer recognizer) {
+        public DFA145(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 138;
+            this.decisionNumber = 145;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -31511,17 +33222,17 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "7679:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
+            return "8300:3: ( ( ( ( '(' ) )=> (lv_explicitOperationCall_7_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )? otherlv_12= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA138_1 = input.LA(1);
+                        int LA145_1 = input.LA(1);
 
                          
-                        int index138_1 = input.index();
+                        int index145_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred36_InternalDataDSL()) ) {s = 77;}
@@ -31529,23 +33240,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index138_1);
+                        input.seek(index145_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 138, _s, input);
+                new NoViableAltException(getDescription(), 145, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA137 extends DFA {
+    class DFA144 extends DFA {
 
-        public DFA137(BaseRecognizer recognizer) {
+        public DFA144(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 137;
+            this.decisionNumber = 144;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_46;
@@ -31555,40 +33266,40 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "7698:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
+            return "8319:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_featureCallArguments_8_0= ruleXShortClosure ) ) | ( ( (lv_featureCallArguments_9_0= ruleXExpression ) ) (otherlv_10= ',' ( (lv_featureCallArguments_11_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA137_0 = input.LA(1);
+                        int LA144_0 = input.LA(1);
 
                          
-                        int index137_0 = input.index();
+                        int index144_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA137_0==RULE_ID) ) {s = 1;}
+                        if ( (LA144_0==RULE_ID) ) {s = 1;}
 
-                        else if ( (LA137_0==81) ) {s = 2;}
+                        else if ( (LA144_0==94) ) {s = 2;}
 
-                        else if ( (LA137_0==106) && (synpred37_InternalDataDSL())) {s = 3;}
+                        else if ( (LA144_0==119) && (synpred37_InternalDataDSL())) {s = 3;}
 
-                        else if ( (LA137_0==119) && (synpred37_InternalDataDSL())) {s = 4;}
+                        else if ( (LA144_0==132) && (synpred37_InternalDataDSL())) {s = 4;}
 
-                        else if ( ((LA137_0>=RULE_STRING && LA137_0<=RULE_INT)||(LA137_0>=RULE_HEX && LA137_0<=RULE_DECIMAL)||LA137_0==14||LA137_0==50||LA137_0==72||(LA137_0>=75 && LA137_0<=76)||(LA137_0>=85 && LA137_0<=86)||LA137_0==93||(LA137_0>=109 && LA137_0<=110)||LA137_0==114||LA137_0==120||LA137_0==122||(LA137_0>=126 && LA137_0<=127)||(LA137_0>=130 && LA137_0<=139)||LA137_0==141) ) {s = 5;}
+                        else if ( ((LA144_0>=RULE_STRING && LA144_0<=RULE_INT)||(LA144_0>=RULE_HEX && LA144_0<=RULE_DECIMAL)||LA144_0==14||LA144_0==52||LA144_0==75||(LA144_0>=88 && LA144_0<=89)||(LA144_0>=98 && LA144_0<=99)||LA144_0==106||(LA144_0>=122 && LA144_0<=123)||LA144_0==127||LA144_0==133||LA144_0==135||(LA144_0>=139 && LA144_0<=140)||(LA144_0>=143 && LA144_0<=152)||LA144_0==154) ) {s = 5;}
 
-                        else if ( (LA137_0==83) ) {s = 35;}
+                        else if ( (LA144_0==96) ) {s = 35;}
 
                          
-                        input.seek(index137_0);
+                        input.seek(index144_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA137_1 = input.LA(1);
+                        int LA144_1 = input.LA(1);
 
                          
-                        int index137_1 = input.index();
+                        int index144_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred37_InternalDataDSL()) ) {s = 4;}
@@ -31596,14 +33307,14 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index137_1);
+                        input.seek(index144_1);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA137_2 = input.LA(1);
+                        int LA144_2 = input.LA(1);
 
                          
-                        int index137_2 = input.index();
+                        int index144_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred37_InternalDataDSL()) ) {s = 4;}
@@ -31611,23 +33322,23 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index137_2);
+                        input.seek(index144_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 137, _s, input);
+                new NoViableAltException(getDescription(), 144, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA139 extends DFA {
+    class DFA146 extends DFA {
 
-        public DFA139(BaseRecognizer recognizer) {
+        public DFA146(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 139;
+            this.decisionNumber = 146;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -31637,17 +33348,17 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "7796:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
+            return "8417:3: ( ( ( () '[' ) )=> (lv_featureCallArguments_13_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA139_1 = input.LA(1);
+                        int LA146_1 = input.LA(1);
 
                          
-                        int index139_1 = input.index();
+                        int index146_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred38_InternalDataDSL()) ) {s = 77;}
@@ -31655,19 +33366,19 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index139_1);
+                        input.seek(index146_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 139, _s, input);
+                new NoViableAltException(getDescription(), 146, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String[] dfa_71s = {
-            "\5\2\5\uffff\2\2\42\uffff\1\2\21\uffff\1\2\3\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\27\2",
+            "\5\2\5\uffff\2\2\44\uffff\1\2\22\uffff\1\2\3\uffff\1\2\13\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\27\2",
             "\1\uffff",
             "",
             "",
@@ -31748,11 +33459,11 @@
     };
     static final short[][] dfa_71 = unpackEncodedStringArray(dfa_71s);
 
-    class DFA143 extends DFA {
+    class DFA150 extends DFA {
 
-        public DFA143(BaseRecognizer recognizer) {
+        public DFA150(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 143;
+            this.decisionNumber = 150;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -31762,17 +33473,17 @@
             this.transition = dfa_71;
         }
         public String getDescription() {
-            return "7955:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
+            return "8576:3: ( ( ( '<' )=>otherlv_3= '<' ) ( (lv_typeArguments_4_0= ruleJvmArgumentTypeReference ) ) (otherlv_5= ',' ( (lv_typeArguments_6_0= ruleJvmArgumentTypeReference ) ) )* otherlv_7= '>' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA143_1 = input.LA(1);
+                        int LA150_1 = input.LA(1);
 
                          
-                        int index143_1 = input.index();
+                        int index150_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred39_InternalDataDSL()) ) {s = 77;}
@@ -31780,23 +33491,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index143_1);
+                        input.seek(index150_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 143, _s, input);
+                new NoViableAltException(getDescription(), 150, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA146 extends DFA {
+    class DFA153 extends DFA {
 
-        public DFA146(BaseRecognizer recognizer) {
+        public DFA153(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 146;
+            this.decisionNumber = 153;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -31806,17 +33517,17 @@
             this.transition = dfa_45;
         }
         public String getDescription() {
-            return "8012:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
+            return "8633:3: ( ( ( ( '(' ) )=> (lv_explicitConstructorCall_8_0= '(' ) ) ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )? otherlv_13= ')' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA146_1 = input.LA(1);
+                        int LA153_1 = input.LA(1);
 
                          
-                        int index146_1 = input.index();
+                        int index153_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred40_InternalDataDSL()) ) {s = 77;}
@@ -31824,23 +33535,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index146_1);
+                        input.seek(index153_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 146, _s, input);
+                new NoViableAltException(getDescription(), 153, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA145 extends DFA {
+    class DFA152 extends DFA {
 
-        public DFA145(BaseRecognizer recognizer) {
+        public DFA152(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 145;
+            this.decisionNumber = 152;
             this.eot = dfa_8;
             this.eof = dfa_8;
             this.min = dfa_46;
@@ -31850,40 +33561,40 @@
             this.transition = dfa_50;
         }
         public String getDescription() {
-            return "8031:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
+            return "8652:4: ( ( ( ( () ( ( ( ruleJvmFormalParameter ) ) ( ',' ( ( ruleJvmFormalParameter ) ) )* )? ( ( '|' ) ) ) )=> (lv_arguments_9_0= ruleXShortClosure ) ) | ( ( (lv_arguments_10_0= ruleXExpression ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleXExpression ) ) )* ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA145_0 = input.LA(1);
+                        int LA152_0 = input.LA(1);
 
                          
-                        int index145_0 = input.index();
+                        int index152_0 = input.index();
                         input.rewind();
                         s = -1;
-                        if ( (LA145_0==RULE_ID) ) {s = 1;}
+                        if ( (LA152_0==RULE_ID) ) {s = 1;}
 
-                        else if ( (LA145_0==81) ) {s = 2;}
+                        else if ( (LA152_0==94) ) {s = 2;}
 
-                        else if ( (LA145_0==106) && (synpred41_InternalDataDSL())) {s = 3;}
+                        else if ( (LA152_0==119) && (synpred41_InternalDataDSL())) {s = 3;}
 
-                        else if ( (LA145_0==119) && (synpred41_InternalDataDSL())) {s = 4;}
+                        else if ( (LA152_0==132) && (synpred41_InternalDataDSL())) {s = 4;}
 
-                        else if ( ((LA145_0>=RULE_STRING && LA145_0<=RULE_INT)||(LA145_0>=RULE_HEX && LA145_0<=RULE_DECIMAL)||LA145_0==14||LA145_0==50||LA145_0==72||(LA145_0>=75 && LA145_0<=76)||(LA145_0>=85 && LA145_0<=86)||LA145_0==93||(LA145_0>=109 && LA145_0<=110)||LA145_0==114||LA145_0==120||LA145_0==122||(LA145_0>=126 && LA145_0<=127)||(LA145_0>=130 && LA145_0<=139)||LA145_0==141) ) {s = 5;}
+                        else if ( ((LA152_0>=RULE_STRING && LA152_0<=RULE_INT)||(LA152_0>=RULE_HEX && LA152_0<=RULE_DECIMAL)||LA152_0==14||LA152_0==52||LA152_0==75||(LA152_0>=88 && LA152_0<=89)||(LA152_0>=98 && LA152_0<=99)||LA152_0==106||(LA152_0>=122 && LA152_0<=123)||LA152_0==127||LA152_0==133||LA152_0==135||(LA152_0>=139 && LA152_0<=140)||(LA152_0>=143 && LA152_0<=152)||LA152_0==154) ) {s = 5;}
 
-                        else if ( (LA145_0==83) ) {s = 35;}
+                        else if ( (LA152_0==96) ) {s = 35;}
 
                          
-                        input.seek(index145_0);
+                        input.seek(index152_0);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA145_1 = input.LA(1);
+                        int LA152_1 = input.LA(1);
 
                          
-                        int index145_1 = input.index();
+                        int index152_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred41_InternalDataDSL()) ) {s = 4;}
@@ -31891,14 +33602,14 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index145_1);
+                        input.seek(index152_1);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA145_2 = input.LA(1);
+                        int LA152_2 = input.LA(1);
 
                          
-                        int index145_2 = input.index();
+                        int index152_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred41_InternalDataDSL()) ) {s = 4;}
@@ -31906,23 +33617,23 @@
                         else if ( (true) ) {s = 5;}
 
                          
-                        input.seek(index145_2);
+                        input.seek(index152_2);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 145, _s, input);
+                new NoViableAltException(getDescription(), 152, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA147 extends DFA {
+    class DFA154 extends DFA {
 
-        public DFA147(BaseRecognizer recognizer) {
+        public DFA154(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 147;
+            this.decisionNumber = 154;
             this.eot = dfa_39;
             this.eof = dfa_40;
             this.min = dfa_41;
@@ -31932,17 +33643,17 @@
             this.transition = dfa_51;
         }
         public String getDescription() {
-            return "8129:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
+            return "8750:3: ( ( ( () '[' ) )=> (lv_arguments_14_0= ruleXClosure ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA147_1 = input.LA(1);
+                        int LA154_1 = input.LA(1);
 
                          
-                        int index147_1 = input.index();
+                        int index154_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred42_InternalDataDSL()) ) {s = 77;}
@@ -31950,24 +33661,24 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index147_1);
+                        input.seek(index154_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 147, _s, input);
+                new NoViableAltException(getDescription(), 154, _s, input);
             error(nvae);
             throw nvae;
         }
     }
     static final String dfa_72s = "\1\41\115\uffff";
     static final String dfa_73s = "\1\4\40\0\55\uffff";
-    static final String dfa_74s = "\1\u008e\40\0\55\uffff";
+    static final String dfa_74s = "\1\u009b\40\0\55\uffff";
     static final String dfa_75s = "\41\uffff\1\2\53\uffff\1\1";
     static final String dfa_76s = "\1\uffff\1\0\1\1\1\2\1\3\1\4\1\5\1\6\1\7\1\10\1\11\1\12\1\13\1\14\1\15\1\16\1\17\1\20\1\21\1\22\1\23\1\24\1\25\1\26\1\27\1\30\1\31\1\32\1\33\1\34\1\35\1\36\1\37\55\uffff}>";
     static final String[] dfa_77s = {
-            "\1\27\1\24\1\1\1\23\1\25\5\uffff\1\12\1\41\42\uffff\1\32\21\uffff\1\41\3\uffff\1\5\1\uffff\1\41\1\4\1\3\1\41\1\uffff\1\41\1\uffff\1\40\2\41\1\uffff\1\17\1\20\6\41\1\15\17\41\1\10\1\7\3\41\1\6\4\41\1\uffff\1\31\1\41\1\13\3\41\1\33\1\34\2\41\1\2\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
+            "\1\27\1\24\1\1\1\23\1\25\5\uffff\1\12\1\41\44\uffff\1\32\22\uffff\1\41\3\uffff\1\5\13\uffff\1\41\1\4\1\3\1\41\1\uffff\1\41\1\uffff\1\40\2\41\1\uffff\1\17\1\20\6\41\1\15\17\41\1\10\1\7\3\41\1\6\4\41\1\uffff\1\31\1\41\1\13\3\41\1\33\1\34\2\41\1\2\1\16\1\11\1\21\1\22\1\26\1\30\1\35\1\36\1\37\1\41\1\14\1\41",
             "\1\uffff",
             "\1\uffff",
             "\1\uffff",
@@ -32053,11 +33764,11 @@
     static final short[] dfa_76 = DFA.unpackEncodedString(dfa_76s);
     static final short[][] dfa_77 = unpackEncodedStringArray(dfa_77s);
 
-    class DFA150 extends DFA {
+    class DFA157 extends DFA {
 
-        public DFA150(BaseRecognizer recognizer) {
+        public DFA157(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 150;
+            this.decisionNumber = 157;
             this.eot = dfa_39;
             this.eof = dfa_72;
             this.min = dfa_73;
@@ -32067,17 +33778,17 @@
             this.transition = dfa_77;
         }
         public String getDescription() {
-            return "8472:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
+            return "9093:3: ( ( 'extends' | 'static' | 'import' | 'extension' | '!' | '-' | '+' | 'new' | '{' | 'switch' | 'synchronized' | '<' | 'super' | '#' | '[' | 'false' | 'true' | 'null' | 'typeof' | 'if' | 'for' | 'while' | 'do' | 'throw' | 'return' | 'try' | '(' | RULE_ID | RULE_HEX | RULE_INT | RULE_DECIMAL | RULE_STRING )=> (lv_expression_2_0= ruleXExpression ) )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA150_1 = input.LA(1);
+                        int LA157_1 = input.LA(1);
 
                          
-                        int index150_1 = input.index();
+                        int index157_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32085,14 +33796,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_1);
+                        input.seek(index157_1);
                         if ( s>=0 ) return s;
                         break;
                     case 1 : 
-                        int LA150_2 = input.LA(1);
+                        int LA157_2 = input.LA(1);
 
                          
-                        int index150_2 = input.index();
+                        int index157_2 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32100,14 +33811,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_2);
+                        input.seek(index157_2);
                         if ( s>=0 ) return s;
                         break;
                     case 2 : 
-                        int LA150_3 = input.LA(1);
+                        int LA157_3 = input.LA(1);
 
                          
-                        int index150_3 = input.index();
+                        int index157_3 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32115,14 +33826,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_3);
+                        input.seek(index157_3);
                         if ( s>=0 ) return s;
                         break;
                     case 3 : 
-                        int LA150_4 = input.LA(1);
+                        int LA157_4 = input.LA(1);
 
                          
-                        int index150_4 = input.index();
+                        int index157_4 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32130,14 +33841,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_4);
+                        input.seek(index157_4);
                         if ( s>=0 ) return s;
                         break;
                     case 4 : 
-                        int LA150_5 = input.LA(1);
+                        int LA157_5 = input.LA(1);
 
                          
-                        int index150_5 = input.index();
+                        int index157_5 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32145,14 +33856,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_5);
+                        input.seek(index157_5);
                         if ( s>=0 ) return s;
                         break;
                     case 5 : 
-                        int LA150_6 = input.LA(1);
+                        int LA157_6 = input.LA(1);
 
                          
-                        int index150_6 = input.index();
+                        int index157_6 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32160,14 +33871,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_6);
+                        input.seek(index157_6);
                         if ( s>=0 ) return s;
                         break;
                     case 6 : 
-                        int LA150_7 = input.LA(1);
+                        int LA157_7 = input.LA(1);
 
                          
-                        int index150_7 = input.index();
+                        int index157_7 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32175,14 +33886,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_7);
+                        input.seek(index157_7);
                         if ( s>=0 ) return s;
                         break;
                     case 7 : 
-                        int LA150_8 = input.LA(1);
+                        int LA157_8 = input.LA(1);
 
                          
-                        int index150_8 = input.index();
+                        int index157_8 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32190,14 +33901,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_8);
+                        input.seek(index157_8);
                         if ( s>=0 ) return s;
                         break;
                     case 8 : 
-                        int LA150_9 = input.LA(1);
+                        int LA157_9 = input.LA(1);
 
                          
-                        int index150_9 = input.index();
+                        int index157_9 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32205,14 +33916,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_9);
+                        input.seek(index157_9);
                         if ( s>=0 ) return s;
                         break;
                     case 9 : 
-                        int LA150_10 = input.LA(1);
+                        int LA157_10 = input.LA(1);
 
                          
-                        int index150_10 = input.index();
+                        int index157_10 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32220,14 +33931,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_10);
+                        input.seek(index157_10);
                         if ( s>=0 ) return s;
                         break;
                     case 10 : 
-                        int LA150_11 = input.LA(1);
+                        int LA157_11 = input.LA(1);
 
                          
-                        int index150_11 = input.index();
+                        int index157_11 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32235,14 +33946,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_11);
+                        input.seek(index157_11);
                         if ( s>=0 ) return s;
                         break;
                     case 11 : 
-                        int LA150_12 = input.LA(1);
+                        int LA157_12 = input.LA(1);
 
                          
-                        int index150_12 = input.index();
+                        int index157_12 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32250,14 +33961,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_12);
+                        input.seek(index157_12);
                         if ( s>=0 ) return s;
                         break;
                     case 12 : 
-                        int LA150_13 = input.LA(1);
+                        int LA157_13 = input.LA(1);
 
                          
-                        int index150_13 = input.index();
+                        int index157_13 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32265,14 +33976,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_13);
+                        input.seek(index157_13);
                         if ( s>=0 ) return s;
                         break;
                     case 13 : 
-                        int LA150_14 = input.LA(1);
+                        int LA157_14 = input.LA(1);
 
                          
-                        int index150_14 = input.index();
+                        int index157_14 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32280,14 +33991,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_14);
+                        input.seek(index157_14);
                         if ( s>=0 ) return s;
                         break;
                     case 14 : 
-                        int LA150_15 = input.LA(1);
+                        int LA157_15 = input.LA(1);
 
                          
-                        int index150_15 = input.index();
+                        int index157_15 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32295,14 +34006,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_15);
+                        input.seek(index157_15);
                         if ( s>=0 ) return s;
                         break;
                     case 15 : 
-                        int LA150_16 = input.LA(1);
+                        int LA157_16 = input.LA(1);
 
                          
-                        int index150_16 = input.index();
+                        int index157_16 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32310,14 +34021,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_16);
+                        input.seek(index157_16);
                         if ( s>=0 ) return s;
                         break;
                     case 16 : 
-                        int LA150_17 = input.LA(1);
+                        int LA157_17 = input.LA(1);
 
                          
-                        int index150_17 = input.index();
+                        int index157_17 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32325,14 +34036,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_17);
+                        input.seek(index157_17);
                         if ( s>=0 ) return s;
                         break;
                     case 17 : 
-                        int LA150_18 = input.LA(1);
+                        int LA157_18 = input.LA(1);
 
                          
-                        int index150_18 = input.index();
+                        int index157_18 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32340,14 +34051,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_18);
+                        input.seek(index157_18);
                         if ( s>=0 ) return s;
                         break;
                     case 18 : 
-                        int LA150_19 = input.LA(1);
+                        int LA157_19 = input.LA(1);
 
                          
-                        int index150_19 = input.index();
+                        int index157_19 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32355,14 +34066,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_19);
+                        input.seek(index157_19);
                         if ( s>=0 ) return s;
                         break;
                     case 19 : 
-                        int LA150_20 = input.LA(1);
+                        int LA157_20 = input.LA(1);
 
                          
-                        int index150_20 = input.index();
+                        int index157_20 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32370,14 +34081,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_20);
+                        input.seek(index157_20);
                         if ( s>=0 ) return s;
                         break;
                     case 20 : 
-                        int LA150_21 = input.LA(1);
+                        int LA157_21 = input.LA(1);
 
                          
-                        int index150_21 = input.index();
+                        int index157_21 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32385,14 +34096,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_21);
+                        input.seek(index157_21);
                         if ( s>=0 ) return s;
                         break;
                     case 21 : 
-                        int LA150_22 = input.LA(1);
+                        int LA157_22 = input.LA(1);
 
                          
-                        int index150_22 = input.index();
+                        int index157_22 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32400,14 +34111,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_22);
+                        input.seek(index157_22);
                         if ( s>=0 ) return s;
                         break;
                     case 22 : 
-                        int LA150_23 = input.LA(1);
+                        int LA157_23 = input.LA(1);
 
                          
-                        int index150_23 = input.index();
+                        int index157_23 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32415,14 +34126,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_23);
+                        input.seek(index157_23);
                         if ( s>=0 ) return s;
                         break;
                     case 23 : 
-                        int LA150_24 = input.LA(1);
+                        int LA157_24 = input.LA(1);
 
                          
-                        int index150_24 = input.index();
+                        int index157_24 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32430,14 +34141,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_24);
+                        input.seek(index157_24);
                         if ( s>=0 ) return s;
                         break;
                     case 24 : 
-                        int LA150_25 = input.LA(1);
+                        int LA157_25 = input.LA(1);
 
                          
-                        int index150_25 = input.index();
+                        int index157_25 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32445,14 +34156,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_25);
+                        input.seek(index157_25);
                         if ( s>=0 ) return s;
                         break;
                     case 25 : 
-                        int LA150_26 = input.LA(1);
+                        int LA157_26 = input.LA(1);
 
                          
-                        int index150_26 = input.index();
+                        int index157_26 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32460,14 +34171,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_26);
+                        input.seek(index157_26);
                         if ( s>=0 ) return s;
                         break;
                     case 26 : 
-                        int LA150_27 = input.LA(1);
+                        int LA157_27 = input.LA(1);
 
                          
-                        int index150_27 = input.index();
+                        int index157_27 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32475,14 +34186,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_27);
+                        input.seek(index157_27);
                         if ( s>=0 ) return s;
                         break;
                     case 27 : 
-                        int LA150_28 = input.LA(1);
+                        int LA157_28 = input.LA(1);
 
                          
-                        int index150_28 = input.index();
+                        int index157_28 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32490,14 +34201,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_28);
+                        input.seek(index157_28);
                         if ( s>=0 ) return s;
                         break;
                     case 28 : 
-                        int LA150_29 = input.LA(1);
+                        int LA157_29 = input.LA(1);
 
                          
-                        int index150_29 = input.index();
+                        int index157_29 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32505,14 +34216,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_29);
+                        input.seek(index157_29);
                         if ( s>=0 ) return s;
                         break;
                     case 29 : 
-                        int LA150_30 = input.LA(1);
+                        int LA157_30 = input.LA(1);
 
                          
-                        int index150_30 = input.index();
+                        int index157_30 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32520,14 +34231,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_30);
+                        input.seek(index157_30);
                         if ( s>=0 ) return s;
                         break;
                     case 30 : 
-                        int LA150_31 = input.LA(1);
+                        int LA157_31 = input.LA(1);
 
                          
-                        int index150_31 = input.index();
+                        int index157_31 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32535,14 +34246,14 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_31);
+                        input.seek(index157_31);
                         if ( s>=0 ) return s;
                         break;
                     case 31 : 
-                        int LA150_32 = input.LA(1);
+                        int LA157_32 = input.LA(1);
 
                          
-                        int index150_32 = input.index();
+                        int index157_32 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred43_InternalDataDSL()) ) {s = 77;}
@@ -32550,13 +34261,13 @@
                         else if ( (true) ) {s = 33;}
 
                          
-                        input.seek(index150_32);
+                        input.seek(index157_32);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 150, _s, input);
+                new NoViableAltException(getDescription(), 157, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -32564,11 +34275,11 @@
     static final String dfa_78s = "\117\uffff";
     static final String dfa_79s = "\1\2\116\uffff";
     static final String dfa_80s = "\1\4\1\0\115\uffff";
-    static final String dfa_81s = "\1\u0090\1\0\115\uffff";
+    static final String dfa_81s = "\1\u009d\1\0\115\uffff";
     static final String dfa_82s = "\2\uffff\1\2\113\uffff\1\1";
     static final String dfa_83s = "\1\uffff\1\0\115\uffff}>";
     static final String[] dfa_84s = {
-            "\5\2\5\uffff\2\2\42\uffff\1\2\21\uffff\1\2\3\uffff\1\2\1\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\27\2\1\uffff\1\2",
+            "\5\2\5\uffff\2\2\44\uffff\1\2\22\uffff\1\2\3\uffff\1\2\13\uffff\4\2\1\uffff\1\2\1\uffff\3\2\1\uffff\10\2\1\1\31\2\1\uffff\27\2\1\uffff\1\2",
             "\1\uffff",
             "",
             "",
@@ -32657,11 +34368,11 @@
     static final short[] dfa_83 = DFA.unpackEncodedString(dfa_83s);
     static final short[][] dfa_84 = unpackEncodedStringArray(dfa_84s);
 
-    class DFA168 extends DFA {
+    class DFA175 extends DFA {
 
-        public DFA168(BaseRecognizer recognizer) {
+        public DFA175(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 168;
+            this.decisionNumber = 175;
             this.eot = dfa_78;
             this.eof = dfa_79;
             this.min = dfa_80;
@@ -32671,17 +34382,17 @@
             this.transition = dfa_84;
         }
         public String getDescription() {
-            return "9130:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
+            return "9751:3: ( ( ( '<' )=>otherlv_1= '<' ) ( (lv_arguments_2_0= ruleJvmArgumentTypeReference ) ) (otherlv_3= ',' ( (lv_arguments_4_0= ruleJvmArgumentTypeReference ) ) )* otherlv_5= '>' ( ( ( ( () '.' ) )=> ( () otherlv_7= '.' ) ) ( ( ruleValidID ) ) ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )? )* )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA168_1 = input.LA(1);
+                        int LA175_1 = input.LA(1);
 
                          
-                        int index168_1 = input.index();
+                        int index175_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred50_InternalDataDSL()) ) {s = 78;}
@@ -32689,23 +34400,23 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index168_1);
+                        input.seek(index175_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 168, _s, input);
+                new NoViableAltException(getDescription(), 175, _s, input);
             error(nvae);
             throw nvae;
         }
     }
 
-    class DFA166 extends DFA {
+    class DFA173 extends DFA {
 
-        public DFA166(BaseRecognizer recognizer) {
+        public DFA173(BaseRecognizer recognizer) {
             this.recognizer = recognizer;
-            this.decisionNumber = 166;
+            this.decisionNumber = 173;
             this.eot = dfa_78;
             this.eof = dfa_79;
             this.min = dfa_80;
@@ -32715,17 +34426,17 @@
             this.transition = dfa_84;
         }
         public String getDescription() {
-            return "9224:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
+            return "9845:5: ( ( ( '<' )=>otherlv_9= '<' ) ( (lv_arguments_10_0= ruleJvmArgumentTypeReference ) ) (otherlv_11= ',' ( (lv_arguments_12_0= ruleJvmArgumentTypeReference ) ) )* otherlv_13= '>' )?";
         }
         public int specialStateTransition(int s, IntStream _input) throws NoViableAltException {
             TokenStream input = (TokenStream)_input;
         	int _s = s;
             switch ( s ) {
                     case 0 : 
-                        int LA166_1 = input.LA(1);
+                        int LA173_1 = input.LA(1);
 
                          
-                        int index166_1 = input.index();
+                        int index173_1 = input.index();
                         input.rewind();
                         s = -1;
                         if ( (synpred52_InternalDataDSL()) ) {s = 78;}
@@ -32733,13 +34444,13 @@
                         else if ( (true) ) {s = 2;}
 
                          
-                        input.seek(index166_1);
+                        input.seek(index173_1);
                         if ( s>=0 ) return s;
                         break;
             }
             if (state.backtracking>0) {state.failed=true; return -1;}
             NoViableAltException nvae =
-                new NoViableAltException(getDescription(), 166, _s, input);
+                new NoViableAltException(getDescription(), 173, _s, input);
             error(nvae);
             throw nvae;
         }
@@ -32753,7 +34464,7 @@
     public static final BitSet FOLLOW_5 = new BitSet(new long[]{0x0000000000004002L});
     public static final BitSet FOLLOW_6 = new BitSet(new long[]{0x0000000000018000L});
     public static final BitSet FOLLOW_7 = new BitSet(new long[]{0x0000000000028000L});
-    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000040000L,0x0000000000000000L,0x0000000380000000L});
+    public static final BitSet FOLLOW_8 = new BitSet(new long[]{0x0000000000040000L,0x0000000000000000L,0x0000700000000000L});
     public static final BitSet FOLLOW_9 = new BitSet(new long[]{0x0000000000000010L});
     public static final BitSet FOLLOW_10 = new BitSet(new long[]{0x0000000000F80000L});
     public static final BitSet FOLLOW_11 = new BitSet(new long[]{0x0000000000F00000L});
@@ -32761,138 +34472,144 @@
     public static final BitSet FOLLOW_13 = new BitSet(new long[]{0x0000000000000020L});
     public static final BitSet FOLLOW_14 = new BitSet(new long[]{0x0000000000C00000L});
     public static final BitSet FOLLOW_15 = new BitSet(new long[]{0x0000000000800000L});
-    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000000422000000L});
+    public static final BitSet FOLLOW_16 = new BitSet(new long[]{0x0000002422000000L});
     public static final BitSet FOLLOW_17 = new BitSet(new long[]{0x0000000001000000L});
     public static final BitSet FOLLOW_18 = new BitSet(new long[]{0x0000000000004000L});
-    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000002000008000L});
+    public static final BitSet FOLLOW_19 = new BitSet(new long[]{0x0000004000008000L});
     public static final BitSet FOLLOW_20 = new BitSet(new long[]{0x000000001C000002L});
     public static final BitSet FOLLOW_21 = new BitSet(new long[]{0x00000003D8000002L});
     public static final BitSet FOLLOW_22 = new BitSet(new long[]{0x0000000818000000L});
     public static final BitSet FOLLOW_23 = new BitSet(new long[]{0x0000001000000002L});
-    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0001FFC000000002L});
-    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0001FF8000000002L});
-    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0001FF0000000002L});
-    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0001FE0000000002L});
-    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0001FC0000000002L});
-    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x2000000000008000L,0x0000000000000008L});
-    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0001F80000000002L});
-    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x0004000000008000L});
-    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0001F00000000002L});
-    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0001E00000000002L});
-    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0001C00000000002L});
-    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000008000L,0x00000000000000A0L});
-    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0001800000000002L});
-    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0002000000008000L});
-    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0001000000000002L});
-    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000006L});
-    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0000000000008000L});
-    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0008000000000000L});
-    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0010008000000000L});
-    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0010000000000000L});
-    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x03E0000000000002L});
-    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x03C0000000000002L});
-    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0380000000000002L});
-    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0400000000008000L});
-    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0800000000000002L});
-    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x1000000000000000L});
-    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x4000000000000000L});
-    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x8000000000000000L});
-    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0008200000000000L});
-    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
-    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000004L});
-    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000042L});
-    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000000L,0x00000008E0100000L,0x0000001C00000000L});
-    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000012L,0x0000000000000000L,0x0000006000000000L});
-    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000006000000000L});
-    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000003800000L});
-    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000010L});
-    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000000007C000000L});
+    public static final BitSet FOLLOW_24 = new BitSet(new long[]{0x0000000018000002L});
+    public static final BitSet FOLLOW_25 = new BitSet(new long[]{0x0007FF8000000002L});
+    public static final BitSet FOLLOW_26 = new BitSet(new long[]{0x0007FF0000000002L});
+    public static final BitSet FOLLOW_27 = new BitSet(new long[]{0x0007FE0000000002L});
+    public static final BitSet FOLLOW_28 = new BitSet(new long[]{0x0007FC0000000002L});
+    public static final BitSet FOLLOW_29 = new BitSet(new long[]{0x0007F80000000002L});
+    public static final BitSet FOLLOW_30 = new BitSet(new long[]{0x0007F00000000002L});
+    public static final BitSet FOLLOW_31 = new BitSet(new long[]{0x8000000000008000L,0x0000000000000020L});
+    public static final BitSet FOLLOW_32 = new BitSet(new long[]{0x0007E00000000002L});
+    public static final BitSet FOLLOW_33 = new BitSet(new long[]{0x0010000000008000L});
+    public static final BitSet FOLLOW_34 = new BitSet(new long[]{0x0007C00000000002L});
+    public static final BitSet FOLLOW_35 = new BitSet(new long[]{0x0007800000000002L});
+    public static final BitSet FOLLOW_36 = new BitSet(new long[]{0x0000000000008000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_37 = new BitSet(new long[]{0x0007000000000002L});
+    public static final BitSet FOLLOW_38 = new BitSet(new long[]{0x0000000000008000L,0x0000000000002500L});
+    public static final BitSet FOLLOW_39 = new BitSet(new long[]{0x0006000000000002L});
+    public static final BitSet FOLLOW_40 = new BitSet(new long[]{0x0008000000008000L});
+    public static final BitSet FOLLOW_41 = new BitSet(new long[]{0x0004000000000002L});
+    public static final BitSet FOLLOW_42 = new BitSet(new long[]{0x0400000000008000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_43 = new BitSet(new long[]{0x0000000000008000L});
+    public static final BitSet FOLLOW_44 = new BitSet(new long[]{0x0020000000000000L});
+    public static final BitSet FOLLOW_45 = new BitSet(new long[]{0x0000020000000000L});
+    public static final BitSet FOLLOW_46 = new BitSet(new long[]{0x0040000000000000L});
+    public static final BitSet FOLLOW_47 = new BitSet(new long[]{0x0980000000000000L});
+    public static final BitSet FOLLOW_48 = new BitSet(new long[]{0x0600000000000002L});
+    public static final BitSet FOLLOW_49 = new BitSet(new long[]{0x0400000000000002L});
+    public static final BitSet FOLLOW_50 = new BitSet(new long[]{0x1000000000008000L});
+    public static final BitSet FOLLOW_51 = new BitSet(new long[]{0x2000000000000002L});
+    public static final BitSet FOLLOW_52 = new BitSet(new long[]{0x4000000000000000L});
+    public static final BitSet FOLLOW_53 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000001L});
+    public static final BitSet FOLLOW_54 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000002L});
+    public static final BitSet FOLLOW_55 = new BitSet(new long[]{0x0000800000000000L,0x0000000000000008L});
+    public static final BitSet FOLLOW_56 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000004L});
+    public static final BitSet FOLLOW_57 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000010L});
+    public static final BitSet FOLLOW_58 = new BitSet(new long[]{0x0000000000000042L});
+    public static final BitSet FOLLOW_59 = new BitSet(new long[]{0x0000000000000000L,0x00011C0200000000L,0x0003800000000000L});
+    public static final BitSet FOLLOW_60 = new BitSet(new long[]{0x0000000000000012L,0x0000000000000000L,0x000C000000000000L});
+    public static final BitSet FOLLOW_61 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x000C000000000000L});
+    public static final BitSet FOLLOW_62 = new BitSet(new long[]{0x0000000000000052L,0x0000000000000000L,0x000C000000000000L});
     public static final BitSet FOLLOW_63 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000040L});
-    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000001000000L,0x0000000000000300L});
-    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000001000000L,0x0000000000000200L});
-    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
-    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000000007E0000L});
-    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000400L});
-    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000000000040L,0x0000000000005000L});
-    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000100L});
-    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000040L,0x0000000000002000L});
-    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000002L,0x0000000000008000L});
-    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x0000000000020000L});
-    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x00040000000041F0L,0xC5046000206B1900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000000L,0x00000000000C0000L});
-    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000000L,0x0000000000080000L});
-    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000000L,0x0000000000100000L});
-    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020631900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000000L,0x0000000000400000L});
-    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020E31900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000000840000L});
-    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000002L,0x0000000000040000L});
-    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000002L,0x000000007F000000L});
-    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x0000000000000000L,0x0000000020000000L});
-    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x00000000C0000000L});
-    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L});
-    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000002L,0x0000000100000000L});
-    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
-    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x0000003C00000000L});
-    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000002L,0x00000040E0000000L});
-    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000040L,0x0000040000020000L});
-    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000002L,0x00001F8060000000L});
-    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000000L,0x0000020000000000L});
-    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
-    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000000L,0x0000040020000000L});
-    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000002L,0x0000600000000000L});
-    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000002L,0x0003800000002000L});
-    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000010L});
-    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000002L,0x0018000000000000L});
-    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000002L,0x0060000000000400L});
-    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000040L,0x0000000000001900L,0x0000000000000004L});
-    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000040L,0x0000000020001900L,0x000000000000000CL});
-    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000040L,0x0000040000020000L,0x0000000000008000L});
-    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000000L,0x0000000040040000L});
-    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000002L,0x0060000000420400L});
-    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x00040000000041F0L,0xC5846400206B1900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000002L,0x0060000000400400L});
-    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x000400000000C1F0L,0xC504600020631900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000008000L,0x0000000000040000L});
-    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x00040000000041F0L,0xC584640020E31900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000000L,0x0080000000040000L});
-    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020E31900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
-    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x00040000000041F2L,0xC504600020639900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x00040000000041F2L,0xC504600020631900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x0000000000000000L,0x0000000000020000L});
-    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000002L,0x0200000000000000L});
-    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x00040000000041F0L,0xC504640020631900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0800000000000000L});
-    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x0000000000008040L,0x3800040000060000L});
-    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x0000000000000000L,0x2800000000040000L});
-    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000000L,0x0800000000040000L});
-    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020639900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x0000000000000000L,0x0000000000048000L});
-    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020631900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x00040000000041F0L,0xC504600020639900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0000000000008000L});
-    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x4000000000000000L});
-    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x000400000000C1F0L,0xC504600020631900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x000400000000C1F0L,0xC504600020639900L,0x0000000000002FFFL});
-    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x0000000000000002L,0x0000000000100000L});
-    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x0000000000000002L,0x0000000000420000L});
-    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000002L,0x0000000000400000L});
-    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000002L,0x0000000020420000L});
-    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x0000000000000000L,0x0000000000480000L});
-    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x00040000000041F2L,0xC504600020631900L,0x0000000000002FFCL});
-    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000005000L});
-    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000005000L});
-    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000120L});
-    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000040L,0x00000400000A0000L});
-    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
-    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x0000000000000002L,0x0000000020000000L});
-    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000002L,0x0000000020000400L});
-    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x000000000000000CL});
-    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000010000L});
-    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000400L});
-    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000000000000L,0x0000000000002000L});
-    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000800L});
+    public static final BitSet FOLLOW_64 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000007000000000L});
+    public static final BitSet FOLLOW_65 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000080L});
+    public static final BitSet FOLLOW_66 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x00000F8000000000L});
+    public static final BitSet FOLLOW_67 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000200L});
+    public static final BitSet FOLLOW_68 = new BitSet(new long[]{0x0000000001000000L,0x0000000000001800L});
+    public static final BitSet FOLLOW_69 = new BitSet(new long[]{0x0000000001000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_70 = new BitSet(new long[]{0x0000000000000000L,0x0000000000001000L});
+    public static final BitSet FOLLOW_71 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000FC0000000L});
+    public static final BitSet FOLLOW_72 = new BitSet(new long[]{0x0000000000000000L,0x0000000000004000L});
+    public static final BitSet FOLLOW_73 = new BitSet(new long[]{0x0000000000000002L,0x00000000007F8000L});
+    public static final BitSet FOLLOW_74 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L});
+    public static final BitSet FOLLOW_75 = new BitSet(new long[]{0x0000000000000040L,0x000000000A000000L});
+    public static final BitSet FOLLOW_76 = new BitSet(new long[]{0x0000000000000040L,0x0000000000000800L});
+    public static final BitSet FOLLOW_77 = new BitSet(new long[]{0x0000000000000040L,0x0000000004000000L});
+    public static final BitSet FOLLOW_78 = new BitSet(new long[]{0x0000000000000002L,0x0000000010000000L});
+    public static final BitSet FOLLOW_79 = new BitSet(new long[]{0x0000000000000002L,0x0000000040000000L});
+    public static final BitSet FOLLOW_80 = new BitSet(new long[]{0x00100000000041F0L,0x8C00040D63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_81 = new BitSet(new long[]{0x0000000000000000L,0x0000000180000000L});
+    public static final BitSet FOLLOW_82 = new BitSet(new long[]{0x0000000000000000L,0x0000000100000000L});
+    public static final BitSet FOLLOW_83 = new BitSet(new long[]{0x0000000000000000L,0x0000000200000000L});
+    public static final BitSet FOLLOW_84 = new BitSet(new long[]{0x00100000000041F0L,0x8C00040C63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_85 = new BitSet(new long[]{0x0000000000000000L,0x0000000800000000L});
+    public static final BitSet FOLLOW_86 = new BitSet(new long[]{0x00100000000041F0L,0x8C00041C63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_87 = new BitSet(new long[]{0x0000000000000000L,0x0000001080000000L});
+    public static final BitSet FOLLOW_88 = new BitSet(new long[]{0x0000000000000002L,0x0000000080000000L});
+    public static final BitSet FOLLOW_89 = new BitSet(new long[]{0x0000000000000002L,0x00000FE000000000L});
+    public static final BitSet FOLLOW_90 = new BitSet(new long[]{0x0000000000000000L,0x0000040000000000L});
+    public static final BitSet FOLLOW_91 = new BitSet(new long[]{0x0000000000000000L,0x0000180000000000L});
+    public static final BitSet FOLLOW_92 = new BitSet(new long[]{0x0000000000000000L,0x0000100000000000L});
+    public static final BitSet FOLLOW_93 = new BitSet(new long[]{0x0000000000000002L,0x0000200000000000L});
+    public static final BitSet FOLLOW_94 = new BitSet(new long[]{0x0000000000000002L,0x0000400000000000L});
+    public static final BitSet FOLLOW_95 = new BitSet(new long[]{0x0000000000000002L,0x0007800000000000L});
+    public static final BitSet FOLLOW_96 = new BitSet(new long[]{0x0000000000000002L,0x00081C0000000000L});
+    public static final BitSet FOLLOW_97 = new BitSet(new long[]{0x0000000000000040L,0x0080000040000000L});
+    public static final BitSet FOLLOW_98 = new BitSet(new long[]{0x0000000000000002L,0x03F00C0000000000L});
+    public static final BitSet FOLLOW_99 = new BitSet(new long[]{0x0000000000000000L,0x0040000000000000L});
+    public static final BitSet FOLLOW_100 = new BitSet(new long[]{0x0000000000000000L,0x0000080000000000L});
+    public static final BitSet FOLLOW_101 = new BitSet(new long[]{0x0000000000000000L,0x0080040000000000L});
+    public static final BitSet FOLLOW_102 = new BitSet(new long[]{0x0000000000000002L,0x0C00000000000000L});
+    public static final BitSet FOLLOW_103 = new BitSet(new long[]{0x0000000000000002L,0x7000000004000000L});
+    public static final BitSet FOLLOW_104 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000080L});
+    public static final BitSet FOLLOW_105 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000003L});
+    public static final BitSet FOLLOW_106 = new BitSet(new long[]{0x0000000000000002L,0x0000000000800000L,0x000000000000000CL});
+    public static final BitSet FOLLOW_107 = new BitSet(new long[]{0x0000000000000040L,0x0000000003000800L,0x0000000000008000L});
+    public static final BitSet FOLLOW_108 = new BitSet(new long[]{0x0000000000000040L,0x0000040003000800L,0x0000000000018000L});
+    public static final BitSet FOLLOW_109 = new BitSet(new long[]{0x0000000000000040L,0x0080000040000000L,0x0000000010000000L});
+    public static final BitSet FOLLOW_110 = new BitSet(new long[]{0x0000000000000000L,0x0000080080000000L});
+    public static final BitSet FOLLOW_111 = new BitSet(new long[]{0x0000000000000002L,0x0000000840800000L,0x000000000000000CL});
+    public static final BitSet FOLLOW_112 = new BitSet(new long[]{0x00100000000041F0L,0x8C80040D63000800L,0x0000000005FF98B0L});
+    public static final BitSet FOLLOW_113 = new BitSet(new long[]{0x0000000000000002L,0x0000000800800000L,0x000000000000000CL});
+    public static final BitSet FOLLOW_114 = new BitSet(new long[]{0x001000000000C1F0L,0x8C00040C63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_115 = new BitSet(new long[]{0x0000000000008000L,0x0000000080000000L});
+    public static final BitSet FOLLOW_116 = new BitSet(new long[]{0x00100000000041F0L,0x8C80041C63000800L,0x0000000005FFF8B0L});
+    public static final BitSet FOLLOW_117 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L,0x0000000000000010L});
+    public static final BitSet FOLLOW_118 = new BitSet(new long[]{0x00100000000041F0L,0x8C00041C63000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_119 = new BitSet(new long[]{0x0000000000000000L,0x0000001000000000L});
+    public static final BitSet FOLLOW_120 = new BitSet(new long[]{0x00100000000041F2L,0x8C00040C73000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_121 = new BitSet(new long[]{0x00100000000041F2L,0x8C00040C63000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_122 = new BitSet(new long[]{0x0000000000000000L,0x0000000040000000L});
+    public static final BitSet FOLLOW_123 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000000040L});
+    public static final BitSet FOLLOW_124 = new BitSet(new long[]{0x00100000000041F0L,0x8C80040C63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_125 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_126 = new BitSet(new long[]{0x0000000000008040L,0x00800000C0000000L,0x0000000000000700L});
+    public static final BitSet FOLLOW_127 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L,0x0000000000000500L});
+    public static final BitSet FOLLOW_128 = new BitSet(new long[]{0x0000000000000000L,0x0000000080000000L,0x0000000000000100L});
+    public static final BitSet FOLLOW_129 = new BitSet(new long[]{0x00100000000041F0L,0x8C00040C73000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_130 = new BitSet(new long[]{0x0000000000000000L,0x0000000090000000L});
+    public static final BitSet FOLLOW_131 = new BitSet(new long[]{0x00100000000041F0L,0x8C00040C63000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_132 = new BitSet(new long[]{0x00100000000041F0L,0x8C00040C73000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_133 = new BitSet(new long[]{0x0000000000000000L,0x0000000010000000L});
+    public static final BitSet FOLLOW_134 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x0000000000000800L});
+    public static final BitSet FOLLOW_135 = new BitSet(new long[]{0x001000000000C1F0L,0x8C00040C63000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_136 = new BitSet(new long[]{0x001000000000C1F0L,0x8C00040C73000800L,0x0000000005FFF8A0L});
+    public static final BitSet FOLLOW_137 = new BitSet(new long[]{0x0000000000000002L,0x0000000200000000L});
+    public static final BitSet FOLLOW_138 = new BitSet(new long[]{0x0000000000000002L,0x0000000840000000L});
+    public static final BitSet FOLLOW_139 = new BitSet(new long[]{0x0000000000000002L,0x0000000800000000L});
+    public static final BitSet FOLLOW_140 = new BitSet(new long[]{0x0000000000000002L,0x0000040840000000L});
+    public static final BitSet FOLLOW_141 = new BitSet(new long[]{0x0000000000000000L,0x0000000900000000L});
+    public static final BitSet FOLLOW_142 = new BitSet(new long[]{0x00100000000041F2L,0x8C00040C63000800L,0x0000000005FF98A0L});
+    public static final BitSet FOLLOW_143 = new BitSet(new long[]{0x0000000000000000L,0x0000000000000000L,0x000000000A000000L});
+    public static final BitSet FOLLOW_144 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x000000000A000000L});
+    public static final BitSet FOLLOW_145 = new BitSet(new long[]{0x0000000000000120L});
+    public static final BitSet FOLLOW_146 = new BitSet(new long[]{0x0000000000000040L,0x0080000140000000L});
+    public static final BitSet FOLLOW_147 = new BitSet(new long[]{0x0000000000000000L,0x0080000000000000L});
+    public static final BitSet FOLLOW_148 = new BitSet(new long[]{0x0000000000000002L,0x0000040000000000L});
+    public static final BitSet FOLLOW_149 = new BitSet(new long[]{0x0000000000000002L,0x0000040000800000L});
+    public static final BitSet FOLLOW_150 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000000018000L});
+    public static final BitSet FOLLOW_151 = new BitSet(new long[]{0x0000000000000002L,0x0000000000000000L,0x0000000020000000L});
+    public static final BitSet FOLLOW_152 = new BitSet(new long[]{0x0000000000000000L,0x0000000000800000L});
+    public static final BitSet FOLLOW_153 = new BitSet(new long[]{0x0000000000000000L,0x0000000004000000L});
+    public static final BitSet FOLLOW_154 = new BitSet(new long[]{0x0000000000000002L,0x0000000001000000L});
 
 }
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSemanticSequencer.java b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSemanticSequencer.java
index 2567049..6a093b9 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSemanticSequencer.java
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSemanticSequencer.java
@@ -28,16 +28,21 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBlobMapping;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeEntityExpression;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExpose;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML;
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFormat;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeKey;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty;
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerEntity;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMarkerPath;
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeModel;
@@ -131,6 +136,9 @@
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER:
 				sequence_DataInterchangeExportFilter(context, (DataInterchangeExportFilter) semanticObject); 
 				return; 
+			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION:
+				sequence_DataInterchangeExportFilterCondition(context, (DataInterchangeExportFilterCondition) semanticObject); 
+				return; 
 			case DataDSLPackage.DATA_INTERCHANGE_EXPORT_HIDE:
 				sequence_DataInterchangeExportHide(context, (DataInterchangeExportHide) semanticObject); 
 				return; 
@@ -143,11 +151,14 @@
 			case DataDSLPackage.DATA_INTERCHANGE_FILE_EDI:
 				sequence_DataInterchangeFileEDI(context, (DataInterchangeFileEDI) semanticObject); 
 				return; 
+			case DataDSLPackage.DATA_INTERCHANGE_FILE_FIXED:
+				sequence_DataInterchangeFileFixed(context, (DataInterchangeFileFixed) semanticObject); 
+				return; 
 			case DataDSLPackage.DATA_INTERCHANGE_FILE_XML:
 				sequence_DataInterchangeFileXML(context, (DataInterchangeFileXML) semanticObject); 
 				return; 
-			case DataDSLPackage.DATA_INTERCHANGE_FILTER_CONDITION:
-				sequence_DataInterchangeFilterCondition(context, (DataInterchangeFilterCondition) semanticObject); 
+			case DataDSLPackage.DATA_INTERCHANGE_FIXED_COLUMN_MAPPING:
+				sequence_DataInterchangeFixedColumnMapping(context, (DataInterchangeFixedColumnMapping) semanticObject); 
 				return; 
 			case DataDSLPackage.DATA_INTERCHANGE_FORMAT:
 				sequence_DataInterchangeFormat(context, (DataInterchangeFormat) semanticObject); 
@@ -161,6 +172,15 @@
 			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP:
 				sequence_DataInterchangeLookup(context, (DataInterchangeLookup) semanticObject); 
 				return; 
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION:
+				sequence_DataInterchangeLookupFilterCondition(context, (DataInterchangeLookupFilterCondition) semanticObject); 
+				return; 
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY:
+				sequence_DataInterchangeLookupFilterOperandProperty(context, (DataInterchangeLookupFilterOperandProperty) semanticObject); 
+				return; 
+			case DataDSLPackage.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING:
+				sequence_DataInterchangeLookupFilterOperandString(context, (DataInterchangeLookupFilterOperandString) semanticObject); 
+				return; 
 			case DataDSLPackage.DATA_INTERCHANGE_MARKER_ENTITY:
 				sequence_DataInterchangeMarkerEntity(context, (DataInterchangeMarkerEntity) semanticObject); 
 				return; 
@@ -494,6 +514,7 @@
 	 * Constraint:
 	 *     (
 	 *         entity=[LEntity|LFQN] 
+	 *         refDataSource=[LEntityFeature|ID]? 
 	 *         nodeName=STRING? 
 	 *         elementMap=STRING? 
 	 *         (markLatestImport?='latestImport' latestProperty=[LEntityAttribute|ID])? 
@@ -552,10 +573,22 @@
 	
 	/**
 	 * Contexts:
+	 *     DataInterchangeExportFilterCondition returns DataInterchangeExportFilterCondition
+	 *
+	 * Constraint:
+	 *     (refProperty=[LEntityFeature|ID] operator=Operator value=STRING? (operator2=Junction subcondition=DataInterchangeExportFilterCondition)?)
+	 */
+	protected void sequence_DataInterchangeExportFilterCondition(ISerializationContext context, DataInterchangeExportFilterCondition semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
 	 *     DataInterchangeExportFilter returns DataInterchangeExportFilter
 	 *
 	 * Constraint:
-	 *     (condition=DataInterchangeFilterCondition? hiddenproperties+=DataInterchangeExportHide*)
+	 *     (condition=DataInterchangeExportFilterCondition? hiddenproperties+=DataInterchangeExportHide*)
 	 */
 	protected void sequence_DataInterchangeExportFilter(ISerializationContext context, DataInterchangeExportFilter semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
@@ -630,6 +663,19 @@
 	
 	/**
 	 * Contexts:
+	 *     DataInterchangeFile returns DataInterchangeFileFixed
+	 *     DataInterchangeFileFixed returns DataInterchangeFileFixed
+	 *
+	 * Constraint:
+	 *     (fileURL=STRING (encoding=STRING | locale=STRING)*)
+	 */
+	protected void sequence_DataInterchangeFileFixed(ISerializationContext context, DataInterchangeFileFixed semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
 	 *     DataInterchangeFile returns DataInterchangeFileXML
 	 *     DataInterchangeFileXML returns DataInterchangeFileXML
 	 *
@@ -643,17 +689,26 @@
 	
 	/**
 	 * Contexts:
-	 *     DataInterchangeFilterCondition returns DataInterchangeFilterCondition
+	 *     DataInterchangeMapping returns DataInterchangeFixedColumnMapping
+	 *     DataInterchangeFixedColumnMapping returns DataInterchangeFixedColumnMapping
 	 *
 	 * Constraint:
 	 *     (
-	 *         refProperty=[LEntityFeature|ID] 
-	 *         operator=ConditionAndOperator1 
-	 *         value=STRING? 
-	 *         (operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition)?
+	 *         property=[LEntityAttribute|ID] 
+	 *         length=INT 
+	 *         (
+	 *             trim?='trim' | 
+	 *             leftTrim?='leftTrim' | 
+	 *             rightTrim?='rightTrim' | 
+	 *             lowerCase?='lowerCase' | 
+	 *             upperCase?='upperCase' | 
+	 *             capFirst?='capitalizeFirstWord' | 
+	 *             uncapFirst?='uncapitalizeFirstWord' | 
+	 *             capitalize?='capitalize'
+	 *         )*
 	 *     )
 	 */
-	protected void sequence_DataInterchangeFilterCondition(ISerializationContext context, DataInterchangeFilterCondition semanticObject) {
+	protected void sequence_DataInterchangeFixedColumnMapping(ISerializationContext context, DataInterchangeFixedColumnMapping semanticObject) {
 		genericSequencer.createSequence(context, semanticObject);
 	}
 	
@@ -711,17 +766,73 @@
 	
 	/**
 	 * Contexts:
+	 *     DataInterchangeLookupFilterCondition returns DataInterchangeLookupFilterCondition
+	 *
+	 * Constraint:
+	 *     (
+	 *         refProperty=[LEntityFeature|ID] 
+	 *         operator=Operator 
+	 *         operand=DataInterchangeLookupFilterOperand? 
+	 *         (operator2=Junction subcondition=DataInterchangeLookupFilterCondition)?
+	 *     )
+	 */
+	protected void sequence_DataInterchangeLookupFilterCondition(ISerializationContext context, DataInterchangeLookupFilterCondition semanticObject) {
+		genericSequencer.createSequence(context, semanticObject);
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataInterchangeLookupFilterOperand returns DataInterchangeLookupFilterOperandProperty
+	 *     DataInterchangeLookupFilterOperandProperty returns DataInterchangeLookupFilterOperandProperty
+	 *
+	 * Constraint:
+	 *     refProperty=[LEntityFeature|ID]
+	 */
+	protected void sequence_DataInterchangeLookupFilterOperandProperty(ISerializationContext context, DataInterchangeLookupFilterOperandProperty semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getDataInterchangeLookupFilterOperandPropertyAccess().getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1(), semanticObject.eGet(DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY, false));
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
+	 *     DataInterchangeLookupFilterOperand returns DataInterchangeLookupFilterOperandString
+	 *     DataInterchangeLookupFilterOperandString returns DataInterchangeLookupFilterOperandString
+	 *
+	 * Constraint:
+	 *     value=STRING
+	 */
+	protected void sequence_DataInterchangeLookupFilterOperandString(ISerializationContext context, DataInterchangeLookupFilterOperandString semanticObject) {
+		if (errorAcceptor != null) {
+			if (transientValues.isValueTransient(semanticObject, DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE) == ValueTransient.YES)
+				errorAcceptor.accept(diagnosticProvider.createFeatureValueMissing(semanticObject, DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_STRING__VALUE));
+		}
+		SequenceFeeder feeder = createSequencerFeeder(context, semanticObject);
+		feeder.accept(grammarAccess.getDataInterchangeLookupFilterOperandStringAccess().getValueSTRINGTerminalRuleCall_1_0(), semanticObject.getValue());
+		feeder.finish();
+	}
+	
+	
+	/**
+	 * Contexts:
 	 *     DataInterchangeLookup returns DataInterchangeLookup
 	 *
 	 * Constraint:
 	 *     (
 	 *         targetProperty=[LEntityReference|ID] 
 	 *         entity=[LEntity|ID] 
-	 *         elementMap=STRING? 
+	 *         elementMap=STRING 
+	 *         dataMap=STRING 
+	 *         (allowNoResult?='allowNoResult' | markerPath=DataInterchangeMarkerPath)* 
 	 *         queryProperty=[LEntityAttribute|ID] 
 	 *         (cached?='cacheSize' cacheSize=INT)? 
-	 *         dataMap=STRING? 
-	 *         (allowNoResult?='allowNoResult' | allowNonuniqueResult?='allowNonuniqueResult' | markerPath=DataInterchangeMarkerPath)*
+	 *         condition=DataInterchangeLookupFilterCondition?
 	 *     )
 	 */
 	protected void sequence_DataInterchangeLookup(ISerializationContext context, DataInterchangeLookup semanticObject) {
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSyntacticSequencer.java b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSyntacticSequencer.java
index d35e21f..30f0a4d 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSyntacticSequencer.java
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/serializer/DataDSLSyntacticSequencer.java
@@ -36,12 +36,12 @@
 public class DataDSLSyntacticSequencer extends AbstractSyntacticSequencer {
 
 	protected DataDSLGrammarAccess grammarAccess;
-	protected AbstractElementAlias match_DataInterchangeBean___ExposeKeyword_10_0_LeftCurlyBracketKeyword_10_1_RightCurlyBracketKeyword_10_3__q;
-	protected AbstractElementAlias match_DataInterchangeBean___ExpressionKeyword_7_0_LeftCurlyBracketKeyword_7_1_RightCurlyBracketKeyword_7_3__q;
-	protected AbstractElementAlias match_DataInterchangeBean___FormatKeyword_9_0_LeftCurlyBracketKeyword_9_1_RightCurlyBracketKeyword_9_3__q;
-	protected AbstractElementAlias match_DataInterchangeBean___KeysKeyword_12_0_LeftCurlyBracketKeyword_12_1_RightCurlyBracketKeyword_12_3__q;
-	protected AbstractElementAlias match_DataInterchangeBean___LookupKeyword_8_0_LeftCurlyBracketKeyword_8_1_RightCurlyBracketKeyword_8_3__q;
-	protected AbstractElementAlias match_DataInterchangeBean___MappingKeyword_11_0_LeftCurlyBracketKeyword_11_1_RightCurlyBracketKeyword_11_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___ExposeKeyword_8_3_0_LeftCurlyBracketKeyword_8_3_1_RightCurlyBracketKeyword_8_3_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___ExpressionKeyword_8_0_0_LeftCurlyBracketKeyword_8_0_1_RightCurlyBracketKeyword_8_0_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___FormatKeyword_8_2_0_LeftCurlyBracketKeyword_8_2_1_RightCurlyBracketKeyword_8_2_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___KeysKeyword_8_5_0_LeftCurlyBracketKeyword_8_5_1_RightCurlyBracketKeyword_8_5_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___LookupKeyword_8_1_0_LeftCurlyBracketKeyword_8_1_1_RightCurlyBracketKeyword_8_1_3__q;
+	protected AbstractElementAlias match_DataInterchangeBean___MappingKeyword_8_4_0_LeftCurlyBracketKeyword_8_4_1_RightCurlyBracketKeyword_8_4_3__q;
 	protected AbstractElementAlias match_DataInterchangeExportFilter_HideKeyword_2_0_q;
 	protected AbstractElementAlias match_DataInterchangeGroup___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q;
 	protected AbstractElementAlias match_DataInterchangePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q;
@@ -56,12 +56,12 @@
 	@Inject
 	protected void init(IGrammarAccess access) {
 		grammarAccess = (DataDSLGrammarAccess) access;
-		match_DataInterchangeBean___ExposeKeyword_10_0_LeftCurlyBracketKeyword_10_1_RightCurlyBracketKeyword_10_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_10_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_10_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_10_3()));
-		match_DataInterchangeBean___ExpressionKeyword_7_0_LeftCurlyBracketKeyword_7_1_RightCurlyBracketKeyword_7_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_7_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_7_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_7_3()));
-		match_DataInterchangeBean___FormatKeyword_9_0_LeftCurlyBracketKeyword_9_1_RightCurlyBracketKeyword_9_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_9_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_9_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_9_3()));
-		match_DataInterchangeBean___KeysKeyword_12_0_LeftCurlyBracketKeyword_12_1_RightCurlyBracketKeyword_12_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_12_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_12_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_12_3()));
-		match_DataInterchangeBean___LookupKeyword_8_0_LeftCurlyBracketKeyword_8_1_RightCurlyBracketKeyword_8_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3()));
-		match_DataInterchangeBean___MappingKeyword_11_0_LeftCurlyBracketKeyword_11_1_RightCurlyBracketKeyword_11_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_11_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_11_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_11_3()));
+		match_DataInterchangeBean___ExposeKeyword_8_3_0_LeftCurlyBracketKeyword_8_3_1_RightCurlyBracketKeyword_8_3_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getExposeKeyword_8_3_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_3_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_3_3()));
+		match_DataInterchangeBean___ExpressionKeyword_8_0_0_LeftCurlyBracketKeyword_8_0_1_RightCurlyBracketKeyword_8_0_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getExpressionKeyword_8_0_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_0_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_0_3()));
+		match_DataInterchangeBean___FormatKeyword_8_2_0_LeftCurlyBracketKeyword_8_2_1_RightCurlyBracketKeyword_8_2_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getFormatKeyword_8_2_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_2_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_2_3()));
+		match_DataInterchangeBean___KeysKeyword_8_5_0_LeftCurlyBracketKeyword_8_5_1_RightCurlyBracketKeyword_8_5_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getKeysKeyword_8_5_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_5_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_5_3()));
+		match_DataInterchangeBean___LookupKeyword_8_1_0_LeftCurlyBracketKeyword_8_1_1_RightCurlyBracketKeyword_8_1_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLookupKeyword_8_1_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_1_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_1_3()));
+		match_DataInterchangeBean___MappingKeyword_8_4_0_LeftCurlyBracketKeyword_8_4_1_RightCurlyBracketKeyword_8_4_3__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getMappingKeyword_8_4_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getLeftCurlyBracketKeyword_8_4_1()), new TokenAlias(false, false, grammarAccess.getDataInterchangeBeanAccess().getRightCurlyBracketKeyword_8_4_3()));
 		match_DataInterchangeExportFilter_HideKeyword_2_0_q = new TokenAlias(false, true, grammarAccess.getDataInterchangeExportFilterAccess().getHideKeyword_2_0());
 		match_DataInterchangeGroup___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangeGroupAccess().getLeftCurlyBracketKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangeGroupAccess().getRightCurlyBracketKeyword_3_2()));
 		match_DataInterchangePackage___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q = new GroupAlias(false, true, new TokenAlias(false, false, grammarAccess.getDataInterchangePackageAccess().getLeftCurlyBracketKeyword_3_0()), new TokenAlias(false, false, grammarAccess.getDataInterchangePackageAccess().getRightCurlyBracketKeyword_3_2()));
@@ -111,18 +111,18 @@
 		List<INode> transitionNodes = collectNodes(fromNode, toNode);
 		for (AbstractElementAlias syntax : transition.getAmbiguousSyntaxes()) {
 			List<INode> syntaxNodes = getNodesFor(transitionNodes, syntax);
-			if (match_DataInterchangeBean___ExposeKeyword_10_0_LeftCurlyBracketKeyword_10_1_RightCurlyBracketKeyword_10_3__q.equals(syntax))
-				emit_DataInterchangeBean___ExposeKeyword_10_0_LeftCurlyBracketKeyword_10_1_RightCurlyBracketKeyword_10_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if (match_DataInterchangeBean___ExpressionKeyword_7_0_LeftCurlyBracketKeyword_7_1_RightCurlyBracketKeyword_7_3__q.equals(syntax))
-				emit_DataInterchangeBean___ExpressionKeyword_7_0_LeftCurlyBracketKeyword_7_1_RightCurlyBracketKeyword_7_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if (match_DataInterchangeBean___FormatKeyword_9_0_LeftCurlyBracketKeyword_9_1_RightCurlyBracketKeyword_9_3__q.equals(syntax))
-				emit_DataInterchangeBean___FormatKeyword_9_0_LeftCurlyBracketKeyword_9_1_RightCurlyBracketKeyword_9_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if (match_DataInterchangeBean___KeysKeyword_12_0_LeftCurlyBracketKeyword_12_1_RightCurlyBracketKeyword_12_3__q.equals(syntax))
-				emit_DataInterchangeBean___KeysKeyword_12_0_LeftCurlyBracketKeyword_12_1_RightCurlyBracketKeyword_12_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if (match_DataInterchangeBean___LookupKeyword_8_0_LeftCurlyBracketKeyword_8_1_RightCurlyBracketKeyword_8_3__q.equals(syntax))
-				emit_DataInterchangeBean___LookupKeyword_8_0_LeftCurlyBracketKeyword_8_1_RightCurlyBracketKeyword_8_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
-			else if (match_DataInterchangeBean___MappingKeyword_11_0_LeftCurlyBracketKeyword_11_1_RightCurlyBracketKeyword_11_3__q.equals(syntax))
-				emit_DataInterchangeBean___MappingKeyword_11_0_LeftCurlyBracketKeyword_11_1_RightCurlyBracketKeyword_11_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			if (match_DataInterchangeBean___ExposeKeyword_8_3_0_LeftCurlyBracketKeyword_8_3_1_RightCurlyBracketKeyword_8_3_3__q.equals(syntax))
+				emit_DataInterchangeBean___ExposeKeyword_8_3_0_LeftCurlyBracketKeyword_8_3_1_RightCurlyBracketKeyword_8_3_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DataInterchangeBean___ExpressionKeyword_8_0_0_LeftCurlyBracketKeyword_8_0_1_RightCurlyBracketKeyword_8_0_3__q.equals(syntax))
+				emit_DataInterchangeBean___ExpressionKeyword_8_0_0_LeftCurlyBracketKeyword_8_0_1_RightCurlyBracketKeyword_8_0_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DataInterchangeBean___FormatKeyword_8_2_0_LeftCurlyBracketKeyword_8_2_1_RightCurlyBracketKeyword_8_2_3__q.equals(syntax))
+				emit_DataInterchangeBean___FormatKeyword_8_2_0_LeftCurlyBracketKeyword_8_2_1_RightCurlyBracketKeyword_8_2_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DataInterchangeBean___KeysKeyword_8_5_0_LeftCurlyBracketKeyword_8_5_1_RightCurlyBracketKeyword_8_5_3__q.equals(syntax))
+				emit_DataInterchangeBean___KeysKeyword_8_5_0_LeftCurlyBracketKeyword_8_5_1_RightCurlyBracketKeyword_8_5_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DataInterchangeBean___LookupKeyword_8_1_0_LeftCurlyBracketKeyword_8_1_1_RightCurlyBracketKeyword_8_1_3__q.equals(syntax))
+				emit_DataInterchangeBean___LookupKeyword_8_1_0_LeftCurlyBracketKeyword_8_1_1_RightCurlyBracketKeyword_8_1_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
+			else if (match_DataInterchangeBean___MappingKeyword_8_4_0_LeftCurlyBracketKeyword_8_4_1_RightCurlyBracketKeyword_8_4_3__q.equals(syntax))
+				emit_DataInterchangeBean___MappingKeyword_8_4_0_LeftCurlyBracketKeyword_8_4_1_RightCurlyBracketKeyword_8_4_3__q(semanticObject, getLastNavigableState(), syntaxNodes);
 			else if (match_DataInterchangeExportFilter_HideKeyword_2_0_q.equals(syntax))
 				emit_DataInterchangeExportFilter_HideKeyword_2_0_q(semanticObject, getLastNavigableState(), syntaxNodes);
 			else if (match_DataInterchangeGroup___LeftCurlyBracketKeyword_3_0_RightCurlyBracketKeyword_3_2__q.equals(syntax))
@@ -206,8 +206,12 @@
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) 'mapping' '{' mappings+=DataInterchangeMapping
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? (ambiguity) ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
 	 */
-	protected void emit_DataInterchangeBean___ExposeKeyword_10_0_LeftCurlyBracketKeyword_10_1_RightCurlyBracketKeyword_10_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___ExposeKeyword_8_3_0_LeftCurlyBracketKeyword_8_3_1_RightCurlyBracketKeyword_8_3_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -262,8 +266,15 @@
 	 *     nodeName=STRING (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
 	 *     nodeName=STRING (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) 'lookup' '{' lookup+=DataInterchangeLookup
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? 'format' '{' format+=DataInterchangeFormat
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? 'expose' '{' exportExposes+=DataInterchangeExpose
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? 'mapping' '{' mappings+=DataInterchangeMapping
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
+	 *     refDataSource=[LEntityFeature|ID] (ambiguity) ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
 	 */
-	protected void emit_DataInterchangeBean___ExpressionKeyword_7_0_LeftCurlyBracketKeyword_7_1_RightCurlyBracketKeyword_7_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___ExpressionKeyword_8_0_0_LeftCurlyBracketKeyword_8_0_1_RightCurlyBracketKeyword_8_0_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -329,8 +340,13 @@
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) 'expose' '{' exportExposes+=DataInterchangeExpose
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? 'mapping' '{' mappings+=DataInterchangeMapping
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? (ambiguity) ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
 	 */
-	protected void emit_DataInterchangeBean___FormatKeyword_9_0_LeftCurlyBracketKeyword_9_1_RightCurlyBracketKeyword_9_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___FormatKeyword_8_2_0_LeftCurlyBracketKeyword_8_2_1_RightCurlyBracketKeyword_8_2_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -363,6 +379,18 @@
 	 *         '{' 
 	 *         exportFilter=DataInterchangeExportFilter
 	 *     )
+	 *     (
+	 *         refDataSource=[LEntityFeature|ID] 
+	 *         ('expression' '{' '}')? 
+	 *         ('lookup' '{' '}')? 
+	 *         ('format' '{' '}')? 
+	 *         ('expose' '{' '}')? 
+	 *         ('mapping' '{' '}')? 
+	 *         (ambiguity) 
+	 *         'exportFilter' 
+	 *         '{' 
+	 *         exportFilter=DataInterchangeExportFilter
+	 *     )
 	 *     elementMap=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     elementMap=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) (rule end)
 	 *     entity=[LEntity|LFQN] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
@@ -381,8 +409,9 @@
 	 *     mappings+=DataInterchangeMapping '}' (ambiguity) (rule end)
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) (rule end)
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? (ambiguity) (rule end)
 	 */
-	protected void emit_DataInterchangeBean___KeysKeyword_12_0_LeftCurlyBracketKeyword_12_1_RightCurlyBracketKeyword_12_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___KeysKeyword_8_5_0_LeftCurlyBracketKeyword_8_5_1_RightCurlyBracketKeyword_8_5_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -449,8 +478,14 @@
 	 *     nodeName=STRING ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
 	 *     nodeName=STRING ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) 'format' '{' format+=DataInterchangeFormat
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? 'expose' '{' exportExposes+=DataInterchangeExpose
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? 'mapping' '{' mappings+=DataInterchangeMapping
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? 'keys' '{' lookupKeys+=DataInterchangeKey
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? (ambiguity) ('format' '{' '}')? ('expose' '{' '}')? ('mapping' '{' '}')? ('keys' '{' '}')? (rule end)
 	 */
-	protected void emit_DataInterchangeBean___LookupKeyword_8_0_LeftCurlyBracketKeyword_8_1_RightCurlyBracketKeyword_8_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___LookupKeyword_8_1_0_LeftCurlyBracketKeyword_8_1_1_RightCurlyBracketKeyword_8_1_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -508,8 +543,11 @@
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) 'keys' '{' lookupKeys+=DataInterchangeKey
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
 	 *     nodeName=STRING ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) ('keys' '{' '}')? (rule end)
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) 'keys' '{' lookupKeys+=DataInterchangeKey
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) ('keys' '{' '}')? 'exportFilter' '{' exportFilter=DataInterchangeExportFilter
+	 *     refDataSource=[LEntityFeature|ID] ('expression' '{' '}')? ('lookup' '{' '}')? ('format' '{' '}')? ('expose' '{' '}')? (ambiguity) ('keys' '{' '}')? (rule end)
 	 */
-	protected void emit_DataInterchangeBean___MappingKeyword_11_0_LeftCurlyBracketKeyword_11_1_RightCurlyBracketKeyword_11_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
+	protected void emit_DataInterchangeBean___MappingKeyword_8_4_0_LeftCurlyBracketKeyword_8_4_1_RightCurlyBracketKeyword_8_4_3__q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
 	}
 	
@@ -519,7 +557,7 @@
 	 *
 	 * This ambiguous syntax occurs at:
 	 *     (rule start) (ambiguity) (rule start)
-	 *     condition=DataInterchangeFilterCondition '}' (ambiguity) (rule end)
+	 *     condition=DataInterchangeExportFilterCondition '}' (ambiguity) (rule end)
 	 */
 	protected void emit_DataInterchangeExportFilter_HideKeyword_2_0_q(EObject semanticObject, ISynNavigable transition, List<INode> nodes) {
 		acceptNodes(transition, nodes);
diff --git a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/services/DataDSLGrammarAccess.java b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/services/DataDSLGrammarAccess.java
index 44802b4..332f877 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/services/DataDSLGrammarAccess.java
+++ b/org.eclipse.osbp.xtext.datainterchange/src-gen/org/eclipse/osbp/xtext/datainterchange/services/DataDSLGrammarAccess.java
@@ -320,12 +320,13 @@
 		private final RuleCall cDataInterchangeFileXMLParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cDataInterchangeFileCSVParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
 		private final RuleCall cDataInterchangeFileEDIParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
+		private final RuleCall cDataInterchangeFileFixedParserRuleCall_3 = (RuleCall)cAlternatives.eContents().get(3);
 		
 		//DataInterchangeFile:
-		//	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI;
+		//	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI | DataInterchangeFileFixed;
 		@Override public ParserRule getRule() { return rule; }
 		
-		//DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI
+		//DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI | DataInterchangeFileFixed
 		public Alternatives getAlternatives() { return cAlternatives; }
 		
 		//DataInterchangeFileXML
@@ -336,6 +337,9 @@
 		
 		//DataInterchangeFileEDI
 		public RuleCall getDataInterchangeFileEDIParserRuleCall_2() { return cDataInterchangeFileEDIParserRuleCall_2; }
+		
+		//DataInterchangeFileFixed
+		public RuleCall getDataInterchangeFileFixedParserRuleCall_3() { return cDataInterchangeFileFixedParserRuleCall_3; }
 	}
 	public class DataInterchangeFileXMLElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFileXML");
@@ -619,6 +623,69 @@
 		//'validate'
 		public Keyword getValidateValidateKeyword_6_0() { return cValidateValidateKeyword_6_0; }
 	}
+	public class DataInterchangeFileFixedElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFileFixed");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataInterchangeFileFixedAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cFixedKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cFileURLAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cFileURLSTRINGTerminalRuleCall_2_0 = (RuleCall)cFileURLAssignment_2.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_3 = (UnorderedGroup)cGroup.eContents().get(3);
+		private final Group cGroup_3_0 = (Group)cUnorderedGroup_3.eContents().get(0);
+		private final Keyword cEncodingKeyword_3_0_0 = (Keyword)cGroup_3_0.eContents().get(0);
+		private final Assignment cEncodingAssignment_3_0_1 = (Assignment)cGroup_3_0.eContents().get(1);
+		private final RuleCall cEncodingSTRINGTerminalRuleCall_3_0_1_0 = (RuleCall)cEncodingAssignment_3_0_1.eContents().get(0);
+		private final Group cGroup_3_1 = (Group)cUnorderedGroup_3.eContents().get(1);
+		private final Keyword cLocaleKeyword_3_1_0 = (Keyword)cGroup_3_1.eContents().get(0);
+		private final Assignment cLocaleAssignment_3_1_1 = (Assignment)cGroup_3_1.eContents().get(1);
+		private final RuleCall cLocaleSTRINGTerminalRuleCall_3_1_1_0 = (RuleCall)cLocaleAssignment_3_1_1.eContents().get(0);
+		
+		//DataInterchangeFileFixed:
+		//	{DataInterchangeFileFixed} 'Fixed' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{DataInterchangeFileFixed} 'Fixed' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?)
+		public Group getGroup() { return cGroup; }
+		
+		//{DataInterchangeFileFixed}
+		public Action getDataInterchangeFileFixedAction_0() { return cDataInterchangeFileFixedAction_0; }
+		
+		//'Fixed'
+		public Keyword getFixedKeyword_1() { return cFixedKeyword_1; }
+		
+		//fileURL=STRING
+		public Assignment getFileURLAssignment_2() { return cFileURLAssignment_2; }
+		
+		//STRING
+		public RuleCall getFileURLSTRINGTerminalRuleCall_2_0() { return cFileURLSTRINGTerminalRuleCall_2_0; }
+		
+		//('encoding' encoding=STRING)? & ('locale' locale=STRING)?
+		public UnorderedGroup getUnorderedGroup_3() { return cUnorderedGroup_3; }
+		
+		//('encoding' encoding=STRING)?
+		public Group getGroup_3_0() { return cGroup_3_0; }
+		
+		//'encoding'
+		public Keyword getEncodingKeyword_3_0_0() { return cEncodingKeyword_3_0_0; }
+		
+		//encoding=STRING
+		public Assignment getEncodingAssignment_3_0_1() { return cEncodingAssignment_3_0_1; }
+		
+		//STRING
+		public RuleCall getEncodingSTRINGTerminalRuleCall_3_0_1_0() { return cEncodingSTRINGTerminalRuleCall_3_0_1_0; }
+		
+		//('locale' locale=STRING)?
+		public Group getGroup_3_1() { return cGroup_3_1; }
+		
+		//'locale'
+		public Keyword getLocaleKeyword_3_1_0() { return cLocaleKeyword_3_1_0; }
+		
+		//locale=STRING
+		public Assignment getLocaleAssignment_3_1_1() { return cLocaleAssignment_3_1_1; }
+		
+		//STRING
+		public RuleCall getLocaleSTRINGTerminalRuleCall_3_1_1_0() { return cLocaleSTRINGTerminalRuleCall_3_1_1_0; }
+	}
 	public class DataInterchangeBeanElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeBean");
 		private final Group cGroup = (Group)rule.eContents().get(1);
@@ -628,85 +695,92 @@
 		private final CrossReference cEntityLEntityCrossReference_2_0 = (CrossReference)cEntityAssignment_2.eContents().get(0);
 		private final RuleCall cEntityLEntityLFQNParserRuleCall_2_0_1 = (RuleCall)cEntityLEntityCrossReference_2_0.eContents().get(1);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
-		private final Keyword cNodeNameKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
-		private final Assignment cNodeNameAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cNodeNameSTRINGTerminalRuleCall_3_1_0 = (RuleCall)cNodeNameAssignment_3_1.eContents().get(0);
+		private final Keyword cReferencedByKeyword_3_0 = (Keyword)cGroup_3.eContents().get(0);
+		private final Assignment cRefDataSourceAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final CrossReference cRefDataSourceLEntityFeatureCrossReference_3_1_0 = (CrossReference)cRefDataSourceAssignment_3_1.eContents().get(0);
+		private final RuleCall cRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1 = (RuleCall)cRefDataSourceLEntityFeatureCrossReference_3_1_0.eContents().get(1);
 		private final Group cGroup_4 = (Group)cGroup.eContents().get(4);
-		private final Keyword cCreateOnKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
-		private final Assignment cElementMapAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
-		private final RuleCall cElementMapSTRINGTerminalRuleCall_4_1_0 = (RuleCall)cElementMapAssignment_4_1.eContents().get(0);
+		private final Keyword cNodeNameKeyword_4_0 = (Keyword)cGroup_4.eContents().get(0);
+		private final Assignment cNodeNameAssignment_4_1 = (Assignment)cGroup_4.eContents().get(1);
+		private final RuleCall cNodeNameSTRINGTerminalRuleCall_4_1_0 = (RuleCall)cNodeNameAssignment_4_1.eContents().get(0);
 		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
-		private final Assignment cMarkLatestImportAssignment_5_0 = (Assignment)cGroup_5.eContents().get(0);
-		private final Keyword cMarkLatestImportLatestImportKeyword_5_0_0 = (Keyword)cMarkLatestImportAssignment_5_0.eContents().get(0);
-		private final Assignment cLatestPropertyAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
-		private final CrossReference cLatestPropertyLEntityAttributeCrossReference_5_1_0 = (CrossReference)cLatestPropertyAssignment_5_1.eContents().get(0);
-		private final RuleCall cLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1 = (RuleCall)cLatestPropertyLEntityAttributeCrossReference_5_1_0.eContents().get(1);
+		private final Keyword cCreateOnKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
+		private final Assignment cElementMapAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
+		private final RuleCall cElementMapSTRINGTerminalRuleCall_5_1_0 = (RuleCall)cElementMapAssignment_5_1.eContents().get(0);
 		private final Group cGroup_6 = (Group)cGroup.eContents().get(6);
-		private final Assignment cMarkLatestExportAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
-		private final Keyword cMarkLatestExportLatestExportKeyword_6_0_0 = (Keyword)cMarkLatestExportAssignment_6_0.eContents().get(0);
-		private final Assignment cLatestExpPropertyAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
-		private final CrossReference cLatestExpPropertyLEntityAttributeCrossReference_6_1_0 = (CrossReference)cLatestExpPropertyAssignment_6_1.eContents().get(0);
-		private final RuleCall cLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1 = (RuleCall)cLatestExpPropertyLEntityAttributeCrossReference_6_1_0.eContents().get(1);
+		private final Assignment cMarkLatestImportAssignment_6_0 = (Assignment)cGroup_6.eContents().get(0);
+		private final Keyword cMarkLatestImportLatestImportKeyword_6_0_0 = (Keyword)cMarkLatestImportAssignment_6_0.eContents().get(0);
+		private final Assignment cLatestPropertyAssignment_6_1 = (Assignment)cGroup_6.eContents().get(1);
+		private final CrossReference cLatestPropertyLEntityAttributeCrossReference_6_1_0 = (CrossReference)cLatestPropertyAssignment_6_1.eContents().get(0);
+		private final RuleCall cLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1 = (RuleCall)cLatestPropertyLEntityAttributeCrossReference_6_1_0.eContents().get(1);
 		private final Group cGroup_7 = (Group)cGroup.eContents().get(7);
-		private final Keyword cExpressionKeyword_7_0 = (Keyword)cGroup_7.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_7_1 = (Keyword)cGroup_7.eContents().get(1);
-		private final Assignment cExpressionAssignment_7_2 = (Assignment)cGroup_7.eContents().get(2);
-		private final RuleCall cExpressionDataInterchangeExpressionParserRuleCall_7_2_0 = (RuleCall)cExpressionAssignment_7_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_7_3 = (Keyword)cGroup_7.eContents().get(3);
+		private final Assignment cMarkLatestExportAssignment_7_0 = (Assignment)cGroup_7.eContents().get(0);
+		private final Keyword cMarkLatestExportLatestExportKeyword_7_0_0 = (Keyword)cMarkLatestExportAssignment_7_0.eContents().get(0);
+		private final Assignment cLatestExpPropertyAssignment_7_1 = (Assignment)cGroup_7.eContents().get(1);
+		private final CrossReference cLatestExpPropertyLEntityAttributeCrossReference_7_1_0 = (CrossReference)cLatestExpPropertyAssignment_7_1.eContents().get(0);
+		private final RuleCall cLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1 = (RuleCall)cLatestExpPropertyLEntityAttributeCrossReference_7_1_0.eContents().get(1);
 		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
-		private final Keyword cLookupKeyword_8_0 = (Keyword)cGroup_8.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_8_1 = (Keyword)cGroup_8.eContents().get(1);
-		private final Assignment cLookupAssignment_8_2 = (Assignment)cGroup_8.eContents().get(2);
-		private final RuleCall cLookupDataInterchangeLookupParserRuleCall_8_2_0 = (RuleCall)cLookupAssignment_8_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_8_3 = (Keyword)cGroup_8.eContents().get(3);
-		private final Group cGroup_9 = (Group)cGroup.eContents().get(9);
-		private final Keyword cFormatKeyword_9_0 = (Keyword)cGroup_9.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_9_1 = (Keyword)cGroup_9.eContents().get(1);
-		private final Assignment cFormatAssignment_9_2 = (Assignment)cGroup_9.eContents().get(2);
-		private final RuleCall cFormatDataInterchangeFormatParserRuleCall_9_2_0 = (RuleCall)cFormatAssignment_9_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_9_3 = (Keyword)cGroup_9.eContents().get(3);
-		private final Group cGroup_10 = (Group)cGroup.eContents().get(10);
-		private final Keyword cExposeKeyword_10_0 = (Keyword)cGroup_10.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_10_1 = (Keyword)cGroup_10.eContents().get(1);
-		private final Assignment cExportExposesAssignment_10_2 = (Assignment)cGroup_10.eContents().get(2);
-		private final RuleCall cExportExposesDataInterchangeExposeParserRuleCall_10_2_0 = (RuleCall)cExportExposesAssignment_10_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_10_3 = (Keyword)cGroup_10.eContents().get(3);
-		private final Group cGroup_11 = (Group)cGroup.eContents().get(11);
-		private final Keyword cMappingKeyword_11_0 = (Keyword)cGroup_11.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_11_1 = (Keyword)cGroup_11.eContents().get(1);
-		private final Assignment cMappingsAssignment_11_2 = (Assignment)cGroup_11.eContents().get(2);
-		private final RuleCall cMappingsDataInterchangeMappingParserRuleCall_11_2_0 = (RuleCall)cMappingsAssignment_11_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_11_3 = (Keyword)cGroup_11.eContents().get(3);
-		private final Group cGroup_12 = (Group)cGroup.eContents().get(12);
-		private final Keyword cKeysKeyword_12_0 = (Keyword)cGroup_12.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_12_1 = (Keyword)cGroup_12.eContents().get(1);
-		private final Assignment cLookupKeysAssignment_12_2 = (Assignment)cGroup_12.eContents().get(2);
-		private final RuleCall cLookupKeysDataInterchangeKeyParserRuleCall_12_2_0 = (RuleCall)cLookupKeysAssignment_12_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_12_3 = (Keyword)cGroup_12.eContents().get(3);
-		private final Group cGroup_13 = (Group)cGroup.eContents().get(13);
-		private final Keyword cExportFilterKeyword_13_0 = (Keyword)cGroup_13.eContents().get(0);
-		private final Keyword cLeftCurlyBracketKeyword_13_1 = (Keyword)cGroup_13.eContents().get(1);
-		private final Assignment cExportFilterAssignment_13_2 = (Assignment)cGroup_13.eContents().get(2);
-		private final RuleCall cExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0 = (RuleCall)cExportFilterAssignment_13_2.eContents().get(0);
-		private final Keyword cRightCurlyBracketKeyword_13_3 = (Keyword)cGroup_13.eContents().get(3);
+		private final Group cGroup_8_0 = (Group)cGroup_8.eContents().get(0);
+		private final Keyword cExpressionKeyword_8_0_0 = (Keyword)cGroup_8_0.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_0_1 = (Keyword)cGroup_8_0.eContents().get(1);
+		private final Assignment cExpressionAssignment_8_0_2 = (Assignment)cGroup_8_0.eContents().get(2);
+		private final RuleCall cExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0 = (RuleCall)cExpressionAssignment_8_0_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_0_3 = (Keyword)cGroup_8_0.eContents().get(3);
+		private final Group cGroup_8_1 = (Group)cGroup_8.eContents().get(1);
+		private final Keyword cLookupKeyword_8_1_0 = (Keyword)cGroup_8_1.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_1_1 = (Keyword)cGroup_8_1.eContents().get(1);
+		private final Assignment cLookupAssignment_8_1_2 = (Assignment)cGroup_8_1.eContents().get(2);
+		private final RuleCall cLookupDataInterchangeLookupParserRuleCall_8_1_2_0 = (RuleCall)cLookupAssignment_8_1_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_1_3 = (Keyword)cGroup_8_1.eContents().get(3);
+		private final Group cGroup_8_2 = (Group)cGroup_8.eContents().get(2);
+		private final Keyword cFormatKeyword_8_2_0 = (Keyword)cGroup_8_2.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_2_1 = (Keyword)cGroup_8_2.eContents().get(1);
+		private final Assignment cFormatAssignment_8_2_2 = (Assignment)cGroup_8_2.eContents().get(2);
+		private final RuleCall cFormatDataInterchangeFormatParserRuleCall_8_2_2_0 = (RuleCall)cFormatAssignment_8_2_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_2_3 = (Keyword)cGroup_8_2.eContents().get(3);
+		private final Group cGroup_8_3 = (Group)cGroup_8.eContents().get(3);
+		private final Keyword cExposeKeyword_8_3_0 = (Keyword)cGroup_8_3.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_3_1 = (Keyword)cGroup_8_3.eContents().get(1);
+		private final Assignment cExportExposesAssignment_8_3_2 = (Assignment)cGroup_8_3.eContents().get(2);
+		private final RuleCall cExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0 = (RuleCall)cExportExposesAssignment_8_3_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_3_3 = (Keyword)cGroup_8_3.eContents().get(3);
+		private final Group cGroup_8_4 = (Group)cGroup_8.eContents().get(4);
+		private final Keyword cMappingKeyword_8_4_0 = (Keyword)cGroup_8_4.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_4_1 = (Keyword)cGroup_8_4.eContents().get(1);
+		private final Assignment cMappingsAssignment_8_4_2 = (Assignment)cGroup_8_4.eContents().get(2);
+		private final RuleCall cMappingsDataInterchangeMappingParserRuleCall_8_4_2_0 = (RuleCall)cMappingsAssignment_8_4_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_4_3 = (Keyword)cGroup_8_4.eContents().get(3);
+		private final Group cGroup_8_5 = (Group)cGroup_8.eContents().get(5);
+		private final Keyword cKeysKeyword_8_5_0 = (Keyword)cGroup_8_5.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_5_1 = (Keyword)cGroup_8_5.eContents().get(1);
+		private final Assignment cLookupKeysAssignment_8_5_2 = (Assignment)cGroup_8_5.eContents().get(2);
+		private final RuleCall cLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0 = (RuleCall)cLookupKeysAssignment_8_5_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_5_3 = (Keyword)cGroup_8_5.eContents().get(3);
+		private final Group cGroup_8_6 = (Group)cGroup_8.eContents().get(6);
+		private final Keyword cExportFilterKeyword_8_6_0 = (Keyword)cGroup_8_6.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_8_6_1 = (Keyword)cGroup_8_6.eContents().get(1);
+		private final Assignment cExportFilterAssignment_8_6_2 = (Assignment)cGroup_8_6.eContents().get(2);
+		private final RuleCall cExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0 = (RuleCall)cExportFilterAssignment_8_6_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_8_6_3 = (Keyword)cGroup_8_6.eContents().get(3);
 		
 		//DataInterchangeBean:
 		//	{DataInterchangeBean}
-		//	'entity' entity=[entity::LEntity|LFQN] ('nodeName' nodeName=STRING)? ('createOn' elementMap=STRING)?
-		//	(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])? (markLatestExport?='latestExport'
-		//	latestExpProperty=[entity::LEntityAttribute])? ('expression' '{' expression+=DataInterchangeExpression* '}')?
+		//	'entity' entity=[entity::LEntity|LFQN] ('referencedBy' refDataSource=[entity::LEntityFeature])? ('nodeName'
+		//	nodeName=STRING)? ('createOn' elementMap=STRING)? (markLatestImport?='latestImport'
+		//	latestProperty=[entity::LEntityAttribute])? (markLatestExport?='latestExport'
+		//	latestExpProperty=[entity::LEntityAttribute])? (('expression' '{' expression+=DataInterchangeExpression* '}')?
 		//	('lookup' '{' lookup+=DataInterchangeLookup* '}')? ('format' '{' format+=DataInterchangeFormat* '}')? ('expose' '{'
 		//	exportExposes+=DataInterchangeExpose* '}')? ('mapping' '{' mappings+=DataInterchangeMapping* '}')? ('keys' '{'
-		//	lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?;
+		//	lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?);
 		@Override public ParserRule getRule() { return rule; }
 		
-		//{DataInterchangeBean} 'entity' entity=[entity::LEntity|LFQN] ('nodeName' nodeName=STRING)? ('createOn'
-		//elementMap=STRING)? (markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])?
-		//(markLatestExport?='latestExport' latestExpProperty=[entity::LEntityAttribute])? ('expression' '{'
-		//expression+=DataInterchangeExpression* '}')? ('lookup' '{' lookup+=DataInterchangeLookup* '}')? ('format' '{'
-		//format+=DataInterchangeFormat* '}')? ('expose' '{' exportExposes+=DataInterchangeExpose* '}')? ('mapping' '{'
-		//mappings+=DataInterchangeMapping* '}')? ('keys' '{' lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{'
-		//exportFilter=DataInterchangeExportFilter '}')?
+		//{DataInterchangeBean} 'entity' entity=[entity::LEntity|LFQN] ('referencedBy' refDataSource=[entity::LEntityFeature])?
+		//('nodeName' nodeName=STRING)? ('createOn' elementMap=STRING)? (markLatestImport?='latestImport'
+		//latestProperty=[entity::LEntityAttribute])? (markLatestExport?='latestExport'
+		//latestExpProperty=[entity::LEntityAttribute])? (('expression' '{' expression+=DataInterchangeExpression* '}')?
+		//('lookup' '{' lookup+=DataInterchangeLookup* '}')? ('format' '{' format+=DataInterchangeFormat* '}')? ('expose' '{'
+		//exportExposes+=DataInterchangeExpose* '}')? ('mapping' '{' mappings+=DataInterchangeMapping* '}')? ('keys' '{'
+		//lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?)
 		public Group getGroup() { return cGroup; }
 		
 		//{DataInterchangeBean}
@@ -724,191 +798,212 @@
 		//LFQN
 		public RuleCall getEntityLEntityLFQNParserRuleCall_2_0_1() { return cEntityLEntityLFQNParserRuleCall_2_0_1; }
 		
-		//('nodeName' nodeName=STRING)?
+		//('referencedBy' refDataSource=[entity::LEntityFeature])?
 		public Group getGroup_3() { return cGroup_3; }
 		
-		//'nodeName'
-		public Keyword getNodeNameKeyword_3_0() { return cNodeNameKeyword_3_0; }
+		//'referencedBy'
+		public Keyword getReferencedByKeyword_3_0() { return cReferencedByKeyword_3_0; }
 		
-		//nodeName=STRING
-		public Assignment getNodeNameAssignment_3_1() { return cNodeNameAssignment_3_1; }
+		//refDataSource=[entity::LEntityFeature]
+		public Assignment getRefDataSourceAssignment_3_1() { return cRefDataSourceAssignment_3_1; }
 		
-		//STRING
-		public RuleCall getNodeNameSTRINGTerminalRuleCall_3_1_0() { return cNodeNameSTRINGTerminalRuleCall_3_1_0; }
+		//[entity::LEntityFeature]
+		public CrossReference getRefDataSourceLEntityFeatureCrossReference_3_1_0() { return cRefDataSourceLEntityFeatureCrossReference_3_1_0; }
 		
-		//('createOn' elementMap=STRING)?
+		//ID
+		public RuleCall getRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1() { return cRefDataSourceLEntityFeatureIDTerminalRuleCall_3_1_0_1; }
+		
+		//('nodeName' nodeName=STRING)?
 		public Group getGroup_4() { return cGroup_4; }
 		
-		//'createOn'
-		public Keyword getCreateOnKeyword_4_0() { return cCreateOnKeyword_4_0; }
+		//'nodeName'
+		public Keyword getNodeNameKeyword_4_0() { return cNodeNameKeyword_4_0; }
 		
-		//elementMap=STRING
-		public Assignment getElementMapAssignment_4_1() { return cElementMapAssignment_4_1; }
+		//nodeName=STRING
+		public Assignment getNodeNameAssignment_4_1() { return cNodeNameAssignment_4_1; }
 		
 		//STRING
-		public RuleCall getElementMapSTRINGTerminalRuleCall_4_1_0() { return cElementMapSTRINGTerminalRuleCall_4_1_0; }
+		public RuleCall getNodeNameSTRINGTerminalRuleCall_4_1_0() { return cNodeNameSTRINGTerminalRuleCall_4_1_0; }
 		
-		//(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])?
+		//('createOn' elementMap=STRING)?
 		public Group getGroup_5() { return cGroup_5; }
 		
-		//markLatestImport?='latestImport'
-		public Assignment getMarkLatestImportAssignment_5_0() { return cMarkLatestImportAssignment_5_0; }
+		//'createOn'
+		public Keyword getCreateOnKeyword_5_0() { return cCreateOnKeyword_5_0; }
 		
-		//'latestImport'
-		public Keyword getMarkLatestImportLatestImportKeyword_5_0_0() { return cMarkLatestImportLatestImportKeyword_5_0_0; }
+		//elementMap=STRING
+		public Assignment getElementMapAssignment_5_1() { return cElementMapAssignment_5_1; }
 		
-		//latestProperty=[entity::LEntityAttribute]
-		public Assignment getLatestPropertyAssignment_5_1() { return cLatestPropertyAssignment_5_1; }
+		//STRING
+		public RuleCall getElementMapSTRINGTerminalRuleCall_5_1_0() { return cElementMapSTRINGTerminalRuleCall_5_1_0; }
 		
-		//[entity::LEntityAttribute]
-		public CrossReference getLatestPropertyLEntityAttributeCrossReference_5_1_0() { return cLatestPropertyLEntityAttributeCrossReference_5_1_0; }
-		
-		//ID
-		public RuleCall getLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1() { return cLatestPropertyLEntityAttributeIDTerminalRuleCall_5_1_0_1; }
-		
-		//(markLatestExport?='latestExport' latestExpProperty=[entity::LEntityAttribute])?
+		//(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])?
 		public Group getGroup_6() { return cGroup_6; }
 		
-		//markLatestExport?='latestExport'
-		public Assignment getMarkLatestExportAssignment_6_0() { return cMarkLatestExportAssignment_6_0; }
+		//markLatestImport?='latestImport'
+		public Assignment getMarkLatestImportAssignment_6_0() { return cMarkLatestImportAssignment_6_0; }
 		
-		//'latestExport'
-		public Keyword getMarkLatestExportLatestExportKeyword_6_0_0() { return cMarkLatestExportLatestExportKeyword_6_0_0; }
+		//'latestImport'
+		public Keyword getMarkLatestImportLatestImportKeyword_6_0_0() { return cMarkLatestImportLatestImportKeyword_6_0_0; }
 		
-		//latestExpProperty=[entity::LEntityAttribute]
-		public Assignment getLatestExpPropertyAssignment_6_1() { return cLatestExpPropertyAssignment_6_1; }
+		//latestProperty=[entity::LEntityAttribute]
+		public Assignment getLatestPropertyAssignment_6_1() { return cLatestPropertyAssignment_6_1; }
 		
 		//[entity::LEntityAttribute]
-		public CrossReference getLatestExpPropertyLEntityAttributeCrossReference_6_1_0() { return cLatestExpPropertyLEntityAttributeCrossReference_6_1_0; }
+		public CrossReference getLatestPropertyLEntityAttributeCrossReference_6_1_0() { return cLatestPropertyLEntityAttributeCrossReference_6_1_0; }
 		
 		//ID
-		public RuleCall getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1() { return cLatestExpPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1; }
+		public RuleCall getLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1() { return cLatestPropertyLEntityAttributeIDTerminalRuleCall_6_1_0_1; }
 		
-		//('expression' '{' expression+=DataInterchangeExpression* '}')?
+		//(markLatestExport?='latestExport' latestExpProperty=[entity::LEntityAttribute])?
 		public Group getGroup_7() { return cGroup_7; }
 		
-		//'expression'
-		public Keyword getExpressionKeyword_7_0() { return cExpressionKeyword_7_0; }
+		//markLatestExport?='latestExport'
+		public Assignment getMarkLatestExportAssignment_7_0() { return cMarkLatestExportAssignment_7_0; }
 		
-		//'{'
-		public Keyword getLeftCurlyBracketKeyword_7_1() { return cLeftCurlyBracketKeyword_7_1; }
+		//'latestExport'
+		public Keyword getMarkLatestExportLatestExportKeyword_7_0_0() { return cMarkLatestExportLatestExportKeyword_7_0_0; }
 		
-		//expression+=DataInterchangeExpression*
-		public Assignment getExpressionAssignment_7_2() { return cExpressionAssignment_7_2; }
+		//latestExpProperty=[entity::LEntityAttribute]
+		public Assignment getLatestExpPropertyAssignment_7_1() { return cLatestExpPropertyAssignment_7_1; }
 		
-		//DataInterchangeExpression
-		public RuleCall getExpressionDataInterchangeExpressionParserRuleCall_7_2_0() { return cExpressionDataInterchangeExpressionParserRuleCall_7_2_0; }
+		//[entity::LEntityAttribute]
+		public CrossReference getLatestExpPropertyLEntityAttributeCrossReference_7_1_0() { return cLatestExpPropertyLEntityAttributeCrossReference_7_1_0; }
 		
-		//'}'
-		public Keyword getRightCurlyBracketKeyword_7_3() { return cRightCurlyBracketKeyword_7_3; }
+		//ID
+		public RuleCall getLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1() { return cLatestExpPropertyLEntityAttributeIDTerminalRuleCall_7_1_0_1; }
 		
-		//('lookup' '{' lookup+=DataInterchangeLookup* '}')?
+		//('expression' '{' expression+=DataInterchangeExpression* '}')? ('lookup' '{' lookup+=DataInterchangeLookup* '}')?
+		//('format' '{' format+=DataInterchangeFormat* '}')? ('expose' '{' exportExposes+=DataInterchangeExpose* '}')? ('mapping'
+		//'{' mappings+=DataInterchangeMapping* '}')? ('keys' '{' lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{'
+		//exportFilter=DataInterchangeExportFilter '}')?
 		public Group getGroup_8() { return cGroup_8; }
 		
-		//'lookup'
-		public Keyword getLookupKeyword_8_0() { return cLookupKeyword_8_0; }
+		//('expression' '{' expression+=DataInterchangeExpression* '}')?
+		public Group getGroup_8_0() { return cGroup_8_0; }
+		
+		//'expression'
+		public Keyword getExpressionKeyword_8_0_0() { return cExpressionKeyword_8_0_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_8_1() { return cLeftCurlyBracketKeyword_8_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_0_1() { return cLeftCurlyBracketKeyword_8_0_1; }
+		
+		//expression+=DataInterchangeExpression*
+		public Assignment getExpressionAssignment_8_0_2() { return cExpressionAssignment_8_0_2; }
+		
+		//DataInterchangeExpression
+		public RuleCall getExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0() { return cExpressionDataInterchangeExpressionParserRuleCall_8_0_2_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_8_0_3() { return cRightCurlyBracketKeyword_8_0_3; }
+		
+		//('lookup' '{' lookup+=DataInterchangeLookup* '}')?
+		public Group getGroup_8_1() { return cGroup_8_1; }
+		
+		//'lookup'
+		public Keyword getLookupKeyword_8_1_0() { return cLookupKeyword_8_1_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_8_1_1() { return cLeftCurlyBracketKeyword_8_1_1; }
 		
 		//lookup+=DataInterchangeLookup*
-		public Assignment getLookupAssignment_8_2() { return cLookupAssignment_8_2; }
+		public Assignment getLookupAssignment_8_1_2() { return cLookupAssignment_8_1_2; }
 		
 		//DataInterchangeLookup
-		public RuleCall getLookupDataInterchangeLookupParserRuleCall_8_2_0() { return cLookupDataInterchangeLookupParserRuleCall_8_2_0; }
+		public RuleCall getLookupDataInterchangeLookupParserRuleCall_8_1_2_0() { return cLookupDataInterchangeLookupParserRuleCall_8_1_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_8_3() { return cRightCurlyBracketKeyword_8_3; }
+		public Keyword getRightCurlyBracketKeyword_8_1_3() { return cRightCurlyBracketKeyword_8_1_3; }
 		
 		//('format' '{' format+=DataInterchangeFormat* '}')?
-		public Group getGroup_9() { return cGroup_9; }
+		public Group getGroup_8_2() { return cGroup_8_2; }
 		
 		//'format'
-		public Keyword getFormatKeyword_9_0() { return cFormatKeyword_9_0; }
+		public Keyword getFormatKeyword_8_2_0() { return cFormatKeyword_8_2_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_9_1() { return cLeftCurlyBracketKeyword_9_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_2_1() { return cLeftCurlyBracketKeyword_8_2_1; }
 		
 		//format+=DataInterchangeFormat*
-		public Assignment getFormatAssignment_9_2() { return cFormatAssignment_9_2; }
+		public Assignment getFormatAssignment_8_2_2() { return cFormatAssignment_8_2_2; }
 		
 		//DataInterchangeFormat
-		public RuleCall getFormatDataInterchangeFormatParserRuleCall_9_2_0() { return cFormatDataInterchangeFormatParserRuleCall_9_2_0; }
+		public RuleCall getFormatDataInterchangeFormatParserRuleCall_8_2_2_0() { return cFormatDataInterchangeFormatParserRuleCall_8_2_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_9_3() { return cRightCurlyBracketKeyword_9_3; }
+		public Keyword getRightCurlyBracketKeyword_8_2_3() { return cRightCurlyBracketKeyword_8_2_3; }
 		
 		//('expose' '{' exportExposes+=DataInterchangeExpose* '}')?
-		public Group getGroup_10() { return cGroup_10; }
+		public Group getGroup_8_3() { return cGroup_8_3; }
 		
 		//'expose'
-		public Keyword getExposeKeyword_10_0() { return cExposeKeyword_10_0; }
+		public Keyword getExposeKeyword_8_3_0() { return cExposeKeyword_8_3_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_10_1() { return cLeftCurlyBracketKeyword_10_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_3_1() { return cLeftCurlyBracketKeyword_8_3_1; }
 		
 		//exportExposes+=DataInterchangeExpose*
-		public Assignment getExportExposesAssignment_10_2() { return cExportExposesAssignment_10_2; }
+		public Assignment getExportExposesAssignment_8_3_2() { return cExportExposesAssignment_8_3_2; }
 		
 		//DataInterchangeExpose
-		public RuleCall getExportExposesDataInterchangeExposeParserRuleCall_10_2_0() { return cExportExposesDataInterchangeExposeParserRuleCall_10_2_0; }
+		public RuleCall getExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0() { return cExportExposesDataInterchangeExposeParserRuleCall_8_3_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_10_3() { return cRightCurlyBracketKeyword_10_3; }
+		public Keyword getRightCurlyBracketKeyword_8_3_3() { return cRightCurlyBracketKeyword_8_3_3; }
 		
 		//('mapping' '{' mappings+=DataInterchangeMapping* '}')?
-		public Group getGroup_11() { return cGroup_11; }
+		public Group getGroup_8_4() { return cGroup_8_4; }
 		
 		//'mapping'
-		public Keyword getMappingKeyword_11_0() { return cMappingKeyword_11_0; }
+		public Keyword getMappingKeyword_8_4_0() { return cMappingKeyword_8_4_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_11_1() { return cLeftCurlyBracketKeyword_11_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_4_1() { return cLeftCurlyBracketKeyword_8_4_1; }
 		
 		//mappings+=DataInterchangeMapping*
-		public Assignment getMappingsAssignment_11_2() { return cMappingsAssignment_11_2; }
+		public Assignment getMappingsAssignment_8_4_2() { return cMappingsAssignment_8_4_2; }
 		
 		//DataInterchangeMapping
-		public RuleCall getMappingsDataInterchangeMappingParserRuleCall_11_2_0() { return cMappingsDataInterchangeMappingParserRuleCall_11_2_0; }
+		public RuleCall getMappingsDataInterchangeMappingParserRuleCall_8_4_2_0() { return cMappingsDataInterchangeMappingParserRuleCall_8_4_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_11_3() { return cRightCurlyBracketKeyword_11_3; }
+		public Keyword getRightCurlyBracketKeyword_8_4_3() { return cRightCurlyBracketKeyword_8_4_3; }
 		
 		//('keys' '{' lookupKeys+=DataInterchangeKey* '}')?
-		public Group getGroup_12() { return cGroup_12; }
+		public Group getGroup_8_5() { return cGroup_8_5; }
 		
 		//'keys'
-		public Keyword getKeysKeyword_12_0() { return cKeysKeyword_12_0; }
+		public Keyword getKeysKeyword_8_5_0() { return cKeysKeyword_8_5_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_12_1() { return cLeftCurlyBracketKeyword_12_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_5_1() { return cLeftCurlyBracketKeyword_8_5_1; }
 		
 		//lookupKeys+=DataInterchangeKey*
-		public Assignment getLookupKeysAssignment_12_2() { return cLookupKeysAssignment_12_2; }
+		public Assignment getLookupKeysAssignment_8_5_2() { return cLookupKeysAssignment_8_5_2; }
 		
 		//DataInterchangeKey
-		public RuleCall getLookupKeysDataInterchangeKeyParserRuleCall_12_2_0() { return cLookupKeysDataInterchangeKeyParserRuleCall_12_2_0; }
+		public RuleCall getLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0() { return cLookupKeysDataInterchangeKeyParserRuleCall_8_5_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_12_3() { return cRightCurlyBracketKeyword_12_3; }
+		public Keyword getRightCurlyBracketKeyword_8_5_3() { return cRightCurlyBracketKeyword_8_5_3; }
 		
 		//('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?
-		public Group getGroup_13() { return cGroup_13; }
+		public Group getGroup_8_6() { return cGroup_8_6; }
 		
 		//'exportFilter'
-		public Keyword getExportFilterKeyword_13_0() { return cExportFilterKeyword_13_0; }
+		public Keyword getExportFilterKeyword_8_6_0() { return cExportFilterKeyword_8_6_0; }
 		
 		//'{'
-		public Keyword getLeftCurlyBracketKeyword_13_1() { return cLeftCurlyBracketKeyword_13_1; }
+		public Keyword getLeftCurlyBracketKeyword_8_6_1() { return cLeftCurlyBracketKeyword_8_6_1; }
 		
 		//exportFilter=DataInterchangeExportFilter
-		public Assignment getExportFilterAssignment_13_2() { return cExportFilterAssignment_13_2; }
+		public Assignment getExportFilterAssignment_8_6_2() { return cExportFilterAssignment_8_6_2; }
 		
 		//DataInterchangeExportFilter
-		public RuleCall getExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0() { return cExportFilterDataInterchangeExportFilterParserRuleCall_13_2_0; }
+		public RuleCall getExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0() { return cExportFilterDataInterchangeExportFilterParserRuleCall_8_6_2_0; }
 		
 		//'}'
-		public Keyword getRightCurlyBracketKeyword_13_3() { return cRightCurlyBracketKeyword_13_3; }
+		public Keyword getRightCurlyBracketKeyword_8_6_3() { return cRightCurlyBracketKeyword_8_6_3; }
 	}
 	public class DataInterchangeKeyElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeKey");
@@ -949,48 +1044,51 @@
 		private final Assignment cTargetPropertyAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final CrossReference cTargetPropertyLEntityReferenceCrossReference_2_0 = (CrossReference)cTargetPropertyAssignment_2.eContents().get(0);
 		private final RuleCall cTargetPropertyLEntityReferenceIDTerminalRuleCall_2_0_1 = (RuleCall)cTargetPropertyLEntityReferenceCrossReference_2_0.eContents().get(1);
-		private final Keyword cOnKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Keyword cInKeyword_3 = (Keyword)cGroup.eContents().get(3);
 		private final Assignment cEntityAssignment_4 = (Assignment)cGroup.eContents().get(4);
 		private final CrossReference cEntityLEntityCrossReference_4_0 = (CrossReference)cEntityAssignment_4.eContents().get(0);
 		private final RuleCall cEntityLEntityIDTerminalRuleCall_4_0_1 = (RuleCall)cEntityLEntityCrossReference_4_0.eContents().get(1);
-		private final Group cGroup_5 = (Group)cGroup.eContents().get(5);
-		private final Keyword cCreateOnKeyword_5_0 = (Keyword)cGroup_5.eContents().get(0);
-		private final Assignment cElementMapAssignment_5_1 = (Assignment)cGroup_5.eContents().get(1);
-		private final RuleCall cElementMapSTRINGTerminalRuleCall_5_1_0 = (RuleCall)cElementMapAssignment_5_1.eContents().get(0);
-		private final Keyword cWithKeyword_6 = (Keyword)cGroup.eContents().get(6);
-		private final Assignment cQueryPropertyAssignment_7 = (Assignment)cGroup.eContents().get(7);
-		private final CrossReference cQueryPropertyLEntityAttributeCrossReference_7_0 = (CrossReference)cQueryPropertyAssignment_7.eContents().get(0);
-		private final RuleCall cQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1 = (RuleCall)cQueryPropertyLEntityAttributeCrossReference_7_0.eContents().get(1);
-		private final Group cGroup_8 = (Group)cGroup.eContents().get(8);
-		private final Assignment cCachedAssignment_8_0 = (Assignment)cGroup_8.eContents().get(0);
-		private final Keyword cCachedCacheSizeKeyword_8_0_0 = (Keyword)cCachedAssignment_8_0.eContents().get(0);
-		private final Assignment cCacheSizeAssignment_8_1 = (Assignment)cGroup_8.eContents().get(1);
-		private final RuleCall cCacheSizeINTTerminalRuleCall_8_1_0 = (RuleCall)cCacheSizeAssignment_8_1.eContents().get(0);
-		private final Group cGroup_9 = (Group)cGroup.eContents().get(9);
-		private final Keyword cMapToKeyword_9_0 = (Keyword)cGroup_9.eContents().get(0);
-		private final Assignment cDataMapAssignment_9_1 = (Assignment)cGroup_9.eContents().get(1);
-		private final RuleCall cDataMapSTRINGTerminalRuleCall_9_1_0 = (RuleCall)cDataMapAssignment_9_1.eContents().get(0);
-		private final UnorderedGroup cUnorderedGroup_10 = (UnorderedGroup)cGroup.eContents().get(10);
-		private final Assignment cAllowNoResultAssignment_10_0 = (Assignment)cUnorderedGroup_10.eContents().get(0);
-		private final Keyword cAllowNoResultAllowNoResultKeyword_10_0_0 = (Keyword)cAllowNoResultAssignment_10_0.eContents().get(0);
-		private final Assignment cAllowNonuniqueResultAssignment_10_1 = (Assignment)cUnorderedGroup_10.eContents().get(1);
-		private final Keyword cAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0 = (Keyword)cAllowNonuniqueResultAssignment_10_1.eContents().get(0);
-		private final Assignment cMarkerPathAssignment_10_2 = (Assignment)cUnorderedGroup_10.eContents().get(2);
-		private final RuleCall cMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0 = (RuleCall)cMarkerPathAssignment_10_2.eContents().get(0);
+		private final Keyword cCreateOnKeyword_5 = (Keyword)cGroup.eContents().get(5);
+		private final Assignment cElementMapAssignment_6 = (Assignment)cGroup.eContents().get(6);
+		private final RuleCall cElementMapSTRINGTerminalRuleCall_6_0 = (RuleCall)cElementMapAssignment_6.eContents().get(0);
+		private final Keyword cMapFromKeyword_7 = (Keyword)cGroup.eContents().get(7);
+		private final Assignment cDataMapAssignment_8 = (Assignment)cGroup.eContents().get(8);
+		private final RuleCall cDataMapSTRINGTerminalRuleCall_8_0 = (RuleCall)cDataMapAssignment_8.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_9 = (UnorderedGroup)cGroup.eContents().get(9);
+		private final Assignment cAllowNoResultAssignment_9_0 = (Assignment)cUnorderedGroup_9.eContents().get(0);
+		private final Keyword cAllowNoResultAllowNoResultKeyword_9_0_0 = (Keyword)cAllowNoResultAssignment_9_0.eContents().get(0);
+		private final Assignment cMarkerPathAssignment_9_1 = (Assignment)cUnorderedGroup_9.eContents().get(1);
+		private final RuleCall cMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0 = (RuleCall)cMarkerPathAssignment_9_1.eContents().get(0);
+		private final Keyword cMapToKeyword_10 = (Keyword)cGroup.eContents().get(10);
+		private final Assignment cQueryPropertyAssignment_11 = (Assignment)cGroup.eContents().get(11);
+		private final CrossReference cQueryPropertyLEntityAttributeCrossReference_11_0 = (CrossReference)cQueryPropertyAssignment_11.eContents().get(0);
+		private final RuleCall cQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1 = (RuleCall)cQueryPropertyLEntityAttributeCrossReference_11_0.eContents().get(1);
+		private final Group cGroup_12 = (Group)cGroup.eContents().get(12);
+		private final Assignment cCachedAssignment_12_0 = (Assignment)cGroup_12.eContents().get(0);
+		private final Keyword cCachedCacheSizeKeyword_12_0_0 = (Keyword)cCachedAssignment_12_0.eContents().get(0);
+		private final Assignment cCacheSizeAssignment_12_1 = (Assignment)cGroup_12.eContents().get(1);
+		private final RuleCall cCacheSizeINTTerminalRuleCall_12_1_0 = (RuleCall)cCacheSizeAssignment_12_1.eContents().get(0);
+		private final Group cGroup_13 = (Group)cGroup.eContents().get(13);
+		private final Keyword cWhereKeyword_13_0 = (Keyword)cGroup_13.eContents().get(0);
+		private final Keyword cLeftCurlyBracketKeyword_13_1 = (Keyword)cGroup_13.eContents().get(1);
+		private final Assignment cConditionAssignment_13_2 = (Assignment)cGroup_13.eContents().get(2);
+		private final RuleCall cConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0 = (RuleCall)cConditionAssignment_13_2.eContents().get(0);
+		private final Keyword cRightCurlyBracketKeyword_13_3 = (Keyword)cGroup_13.eContents().get(3);
 		
 		//DataInterchangeLookup:
 		//	{DataInterchangeLookup}
 		//	'for' targetProperty=[entity::LEntityReference]
-		//	'on' entity=[entity::LEntity] ('createOn' elementMap=STRING)?
-		//	'with' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('mapTo' dataMap=STRING)?
-		//	(allowNoResult?='allowNoResult'? & allowNonuniqueResult?='allowNonuniqueResult'? &
-		//	markerPath=DataInterchangeMarkerPath?);
+		//	'in' entity=[entity::LEntity]
+		//	'createOn' elementMap=STRING
+		//	'mapFrom' dataMap=STRING (allowNoResult?='allowNoResult'? & markerPath=DataInterchangeMarkerPath?)
+		//	'mapTo' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('where' '{'
+		//	condition=DataInterchangeLookupFilterCondition '}')?;
 		@Override public ParserRule getRule() { return rule; }
 		
-		//{DataInterchangeLookup} 'for' targetProperty=[entity::LEntityReference] 'on' entity=[entity::LEntity] ('createOn'
-		//elementMap=STRING)? 'with' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('mapTo'
-		//dataMap=STRING)? (allowNoResult?='allowNoResult'? & allowNonuniqueResult?='allowNonuniqueResult'? &
-		//markerPath=DataInterchangeMarkerPath?)
+		//{DataInterchangeLookup} 'for' targetProperty=[entity::LEntityReference] 'in' entity=[entity::LEntity] 'createOn'
+		//elementMap=STRING 'mapFrom' dataMap=STRING (allowNoResult?='allowNoResult'? & markerPath=DataInterchangeMarkerPath?)
+		//'mapTo' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('where' '{'
+		//condition=DataInterchangeLookupFilterCondition '}')?
 		public Group getGroup() { return cGroup; }
 		
 		//{DataInterchangeLookup}
@@ -1008,8 +1106,8 @@
 		//ID
 		public RuleCall getTargetPropertyLEntityReferenceIDTerminalRuleCall_2_0_1() { return cTargetPropertyLEntityReferenceIDTerminalRuleCall_2_0_1; }
 		
-		//'on'
-		public Keyword getOnKeyword_3() { return cOnKeyword_3; }
+		//'in'
+		public Keyword getInKeyword_3() { return cInKeyword_3; }
 		
 		//entity=[entity::LEntity]
 		public Assignment getEntityAssignment_4() { return cEntityAssignment_4; }
@@ -1020,77 +1118,83 @@
 		//ID
 		public RuleCall getEntityLEntityIDTerminalRuleCall_4_0_1() { return cEntityLEntityIDTerminalRuleCall_4_0_1; }
 		
-		//('createOn' elementMap=STRING)?
-		public Group getGroup_5() { return cGroup_5; }
-		
 		//'createOn'
-		public Keyword getCreateOnKeyword_5_0() { return cCreateOnKeyword_5_0; }
+		public Keyword getCreateOnKeyword_5() { return cCreateOnKeyword_5; }
 		
 		//elementMap=STRING
-		public Assignment getElementMapAssignment_5_1() { return cElementMapAssignment_5_1; }
+		public Assignment getElementMapAssignment_6() { return cElementMapAssignment_6; }
 		
 		//STRING
-		public RuleCall getElementMapSTRINGTerminalRuleCall_5_1_0() { return cElementMapSTRINGTerminalRuleCall_5_1_0; }
+		public RuleCall getElementMapSTRINGTerminalRuleCall_6_0() { return cElementMapSTRINGTerminalRuleCall_6_0; }
 		
-		//'with'
-		public Keyword getWithKeyword_6() { return cWithKeyword_6; }
-		
-		//queryProperty=[entity::LEntityAttribute]
-		public Assignment getQueryPropertyAssignment_7() { return cQueryPropertyAssignment_7; }
-		
-		//[entity::LEntityAttribute]
-		public CrossReference getQueryPropertyLEntityAttributeCrossReference_7_0() { return cQueryPropertyLEntityAttributeCrossReference_7_0; }
-		
-		//ID
-		public RuleCall getQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1() { return cQueryPropertyLEntityAttributeIDTerminalRuleCall_7_0_1; }
-		
-		//(cached?='cacheSize' cacheSize=INT)?
-		public Group getGroup_8() { return cGroup_8; }
-		
-		//cached?='cacheSize'
-		public Assignment getCachedAssignment_8_0() { return cCachedAssignment_8_0; }
-		
-		//'cacheSize'
-		public Keyword getCachedCacheSizeKeyword_8_0_0() { return cCachedCacheSizeKeyword_8_0_0; }
-		
-		//cacheSize=INT
-		public Assignment getCacheSizeAssignment_8_1() { return cCacheSizeAssignment_8_1; }
-		
-		//INT
-		public RuleCall getCacheSizeINTTerminalRuleCall_8_1_0() { return cCacheSizeINTTerminalRuleCall_8_1_0; }
-		
-		//('mapTo' dataMap=STRING)?
-		public Group getGroup_9() { return cGroup_9; }
-		
-		//'mapTo'
-		public Keyword getMapToKeyword_9_0() { return cMapToKeyword_9_0; }
+		//'mapFrom'
+		public Keyword getMapFromKeyword_7() { return cMapFromKeyword_7; }
 		
 		//dataMap=STRING
-		public Assignment getDataMapAssignment_9_1() { return cDataMapAssignment_9_1; }
+		public Assignment getDataMapAssignment_8() { return cDataMapAssignment_8; }
 		
 		//STRING
-		public RuleCall getDataMapSTRINGTerminalRuleCall_9_1_0() { return cDataMapSTRINGTerminalRuleCall_9_1_0; }
+		public RuleCall getDataMapSTRINGTerminalRuleCall_8_0() { return cDataMapSTRINGTerminalRuleCall_8_0; }
 		
-		//allowNoResult?='allowNoResult'? & allowNonuniqueResult?='allowNonuniqueResult'? & markerPath=DataInterchangeMarkerPath?
-		public UnorderedGroup getUnorderedGroup_10() { return cUnorderedGroup_10; }
+		//allowNoResult?='allowNoResult'? & markerPath=DataInterchangeMarkerPath?
+		public UnorderedGroup getUnorderedGroup_9() { return cUnorderedGroup_9; }
 		
 		//allowNoResult?='allowNoResult'?
-		public Assignment getAllowNoResultAssignment_10_0() { return cAllowNoResultAssignment_10_0; }
+		public Assignment getAllowNoResultAssignment_9_0() { return cAllowNoResultAssignment_9_0; }
 		
 		//'allowNoResult'
-		public Keyword getAllowNoResultAllowNoResultKeyword_10_0_0() { return cAllowNoResultAllowNoResultKeyword_10_0_0; }
-		
-		//allowNonuniqueResult?='allowNonuniqueResult'?
-		public Assignment getAllowNonuniqueResultAssignment_10_1() { return cAllowNonuniqueResultAssignment_10_1; }
-		
-		//'allowNonuniqueResult'
-		public Keyword getAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0() { return cAllowNonuniqueResultAllowNonuniqueResultKeyword_10_1_0; }
+		public Keyword getAllowNoResultAllowNoResultKeyword_9_0_0() { return cAllowNoResultAllowNoResultKeyword_9_0_0; }
 		
 		//markerPath=DataInterchangeMarkerPath?
-		public Assignment getMarkerPathAssignment_10_2() { return cMarkerPathAssignment_10_2; }
+		public Assignment getMarkerPathAssignment_9_1() { return cMarkerPathAssignment_9_1; }
 		
 		//DataInterchangeMarkerPath
-		public RuleCall getMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0() { return cMarkerPathDataInterchangeMarkerPathParserRuleCall_10_2_0; }
+		public RuleCall getMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0() { return cMarkerPathDataInterchangeMarkerPathParserRuleCall_9_1_0; }
+		
+		//'mapTo'
+		public Keyword getMapToKeyword_10() { return cMapToKeyword_10; }
+		
+		//queryProperty=[entity::LEntityAttribute]
+		public Assignment getQueryPropertyAssignment_11() { return cQueryPropertyAssignment_11; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getQueryPropertyLEntityAttributeCrossReference_11_0() { return cQueryPropertyLEntityAttributeCrossReference_11_0; }
+		
+		//ID
+		public RuleCall getQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1() { return cQueryPropertyLEntityAttributeIDTerminalRuleCall_11_0_1; }
+		
+		//(cached?='cacheSize' cacheSize=INT)?
+		public Group getGroup_12() { return cGroup_12; }
+		
+		//cached?='cacheSize'
+		public Assignment getCachedAssignment_12_0() { return cCachedAssignment_12_0; }
+		
+		//'cacheSize'
+		public Keyword getCachedCacheSizeKeyword_12_0_0() { return cCachedCacheSizeKeyword_12_0_0; }
+		
+		//cacheSize=INT
+		public Assignment getCacheSizeAssignment_12_1() { return cCacheSizeAssignment_12_1; }
+		
+		//INT
+		public RuleCall getCacheSizeINTTerminalRuleCall_12_1_0() { return cCacheSizeINTTerminalRuleCall_12_1_0; }
+		
+		//('where' '{' condition=DataInterchangeLookupFilterCondition '}')?
+		public Group getGroup_13() { return cGroup_13; }
+		
+		//'where'
+		public Keyword getWhereKeyword_13_0() { return cWhereKeyword_13_0; }
+		
+		//'{'
+		public Keyword getLeftCurlyBracketKeyword_13_1() { return cLeftCurlyBracketKeyword_13_1; }
+		
+		//condition=DataInterchangeLookupFilterCondition
+		public Assignment getConditionAssignment_13_2() { return cConditionAssignment_13_2; }
+		
+		//DataInterchangeLookupFilterCondition
+		public RuleCall getConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0() { return cConditionDataInterchangeLookupFilterConditionParserRuleCall_13_2_0; }
+		
+		//'}'
+		public Keyword getRightCurlyBracketKeyword_13_3() { return cRightCurlyBracketKeyword_13_3; }
 	}
 	public class DataInterchangeMarkerPathElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeMarkerPath");
@@ -1403,7 +1507,7 @@
 		private final Keyword cWhereKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
 		private final Keyword cLeftCurlyBracketKeyword_1_1 = (Keyword)cGroup_1.eContents().get(1);
 		private final Assignment cConditionAssignment_1_2 = (Assignment)cGroup_1.eContents().get(2);
-		private final RuleCall cConditionDataInterchangeFilterConditionParserRuleCall_1_2_0 = (RuleCall)cConditionAssignment_1_2.eContents().get(0);
+		private final RuleCall cConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0 = (RuleCall)cConditionAssignment_1_2.eContents().get(0);
 		private final Keyword cRightCurlyBracketKeyword_1_3 = (Keyword)cGroup_1.eContents().get(3);
 		private final Group cGroup_2 = (Group)cGroup.eContents().get(2);
 		private final Keyword cHideKeyword_2_0 = (Keyword)cGroup_2.eContents().get(0);
@@ -1411,18 +1515,18 @@
 		private final RuleCall cHiddenpropertiesDataInterchangeExportHideParserRuleCall_2_1_0 = (RuleCall)cHiddenpropertiesAssignment_2_1.eContents().get(0);
 		
 		//DataInterchangeExportFilter:
-		//	{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeFilterCondition '}')? ('hide'
+		//	{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeExportFilterCondition '}')? ('hide'
 		//	hiddenproperties+=DataInterchangeExportHide*)?;
 		@Override public ParserRule getRule() { return rule; }
 		
-		//{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeFilterCondition '}')? ('hide'
+		//{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeExportFilterCondition '}')? ('hide'
 		//hiddenproperties+=DataInterchangeExportHide*)?
 		public Group getGroup() { return cGroup; }
 		
 		//{DataInterchangeExportFilter}
 		public Action getDataInterchangeExportFilterAction_0() { return cDataInterchangeExportFilterAction_0; }
 		
-		//('where' '{' condition=DataInterchangeFilterCondition '}')?
+		//('where' '{' condition=DataInterchangeExportFilterCondition '}')?
 		public Group getGroup_1() { return cGroup_1; }
 		
 		//'where'
@@ -1431,11 +1535,11 @@
 		//'{'
 		public Keyword getLeftCurlyBracketKeyword_1_1() { return cLeftCurlyBracketKeyword_1_1; }
 		
-		//condition=DataInterchangeFilterCondition
+		//condition=DataInterchangeExportFilterCondition
 		public Assignment getConditionAssignment_1_2() { return cConditionAssignment_1_2; }
 		
-		//DataInterchangeFilterCondition
-		public RuleCall getConditionDataInterchangeFilterConditionParserRuleCall_1_2_0() { return cConditionDataInterchangeFilterConditionParserRuleCall_1_2_0; }
+		//DataInterchangeExportFilterCondition
+		public RuleCall getConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0() { return cConditionDataInterchangeExportFilterConditionParserRuleCall_1_2_0; }
 		
 		//'}'
 		public Keyword getRightCurlyBracketKeyword_1_3() { return cRightCurlyBracketKeyword_1_3; }
@@ -1452,29 +1556,29 @@
 		//DataInterchangeExportHide
 		public RuleCall getHiddenpropertiesDataInterchangeExportHideParserRuleCall_2_1_0() { return cHiddenpropertiesDataInterchangeExportHideParserRuleCall_2_1_0; }
 	}
-	public class DataInterchangeFilterConditionElements extends AbstractParserRuleElementFinder {
-		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFilterCondition");
+	public class DataInterchangeExportFilterConditionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportFilterCondition");
 		private final Group cGroup = (Group)rule.eContents().get(1);
 		private final Assignment cRefPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
 		private final CrossReference cRefPropertyLEntityFeatureCrossReference_0_0 = (CrossReference)cRefPropertyAssignment_0.eContents().get(0);
 		private final RuleCall cRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1 = (RuleCall)cRefPropertyLEntityFeatureCrossReference_0_0.eContents().get(1);
 		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
-		private final RuleCall cOperatorConditionAndOperator1EnumRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
+		private final RuleCall cOperatorOperatorEnumRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
 		private final Assignment cValueAssignment_2 = (Assignment)cGroup.eContents().get(2);
 		private final RuleCall cValueSTRINGTerminalRuleCall_2_0 = (RuleCall)cValueAssignment_2.eContents().get(0);
 		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
 		private final Assignment cOperator2Assignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
-		private final RuleCall cOperator2ConditionAndOperator2EnumRuleCall_3_0_0 = (RuleCall)cOperator2Assignment_3_0.eContents().get(0);
+		private final RuleCall cOperator2JunctionEnumRuleCall_3_0_0 = (RuleCall)cOperator2Assignment_3_0.eContents().get(0);
 		private final Assignment cSubconditionAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
-		private final RuleCall cSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0 = (RuleCall)cSubconditionAssignment_3_1.eContents().get(0);
+		private final RuleCall cSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0 = (RuleCall)cSubconditionAssignment_3_1.eContents().get(0);
 		
-		//DataInterchangeFilterCondition:
-		//	refProperty=[entity::LEntityFeature] operator=ConditionAndOperator1
-		//	value=STRING? (operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition)?;
+		//DataInterchangeExportFilterCondition:
+		//	refProperty=[entity::LEntityFeature] operator=Operator
+		//	value=STRING? (operator2=Junction subcondition=DataInterchangeExportFilterCondition)?;
 		@Override public ParserRule getRule() { return rule; }
 		
-		//refProperty=[entity::LEntityFeature] operator=ConditionAndOperator1 value=STRING? (operator2=ConditionAndOperator2
-		//subcondition=DataInterchangeFilterCondition)?
+		//refProperty=[entity::LEntityFeature] operator=Operator value=STRING? (operator2=Junction
+		//subcondition=DataInterchangeExportFilterCondition)?
 		public Group getGroup() { return cGroup; }
 		
 		//refProperty=[entity::LEntityFeature]
@@ -1486,11 +1590,11 @@
 		//ID
 		public RuleCall getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1() { return cRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1; }
 		
-		//operator=ConditionAndOperator1
+		//operator=Operator
 		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
 		
-		//ConditionAndOperator1
-		public RuleCall getOperatorConditionAndOperator1EnumRuleCall_1_0() { return cOperatorConditionAndOperator1EnumRuleCall_1_0; }
+		//Operator
+		public RuleCall getOperatorOperatorEnumRuleCall_1_0() { return cOperatorOperatorEnumRuleCall_1_0; }
 		
 		//value=STRING?
 		public Assignment getValueAssignment_2() { return cValueAssignment_2; }
@@ -1498,20 +1602,150 @@
 		//STRING
 		public RuleCall getValueSTRINGTerminalRuleCall_2_0() { return cValueSTRINGTerminalRuleCall_2_0; }
 		
-		//(operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition)?
+		//(operator2=Junction subcondition=DataInterchangeExportFilterCondition)?
 		public Group getGroup_3() { return cGroup_3; }
 		
-		//operator2=ConditionAndOperator2
+		//operator2=Junction
 		public Assignment getOperator2Assignment_3_0() { return cOperator2Assignment_3_0; }
 		
-		//ConditionAndOperator2
-		public RuleCall getOperator2ConditionAndOperator2EnumRuleCall_3_0_0() { return cOperator2ConditionAndOperator2EnumRuleCall_3_0_0; }
+		//Junction
+		public RuleCall getOperator2JunctionEnumRuleCall_3_0_0() { return cOperator2JunctionEnumRuleCall_3_0_0; }
 		
-		//subcondition=DataInterchangeFilterCondition
+		//subcondition=DataInterchangeExportFilterCondition
 		public Assignment getSubconditionAssignment_3_1() { return cSubconditionAssignment_3_1; }
 		
-		//DataInterchangeFilterCondition
-		public RuleCall getSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0() { return cSubconditionDataInterchangeFilterConditionParserRuleCall_3_1_0; }
+		//DataInterchangeExportFilterCondition
+		public RuleCall getSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0() { return cSubconditionDataInterchangeExportFilterConditionParserRuleCall_3_1_0; }
+	}
+	public class DataInterchangeLookupFilterConditionElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterCondition");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Assignment cRefPropertyAssignment_0 = (Assignment)cGroup.eContents().get(0);
+		private final CrossReference cRefPropertyLEntityFeatureCrossReference_0_0 = (CrossReference)cRefPropertyAssignment_0.eContents().get(0);
+		private final RuleCall cRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1 = (RuleCall)cRefPropertyLEntityFeatureCrossReference_0_0.eContents().get(1);
+		private final Assignment cOperatorAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cOperatorOperatorEnumRuleCall_1_0 = (RuleCall)cOperatorAssignment_1.eContents().get(0);
+		private final Assignment cOperandAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final RuleCall cOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0 = (RuleCall)cOperandAssignment_2.eContents().get(0);
+		private final Group cGroup_3 = (Group)cGroup.eContents().get(3);
+		private final Assignment cOperator2Assignment_3_0 = (Assignment)cGroup_3.eContents().get(0);
+		private final RuleCall cOperator2JunctionEnumRuleCall_3_0_0 = (RuleCall)cOperator2Assignment_3_0.eContents().get(0);
+		private final Assignment cSubconditionAssignment_3_1 = (Assignment)cGroup_3.eContents().get(1);
+		private final RuleCall cSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0 = (RuleCall)cSubconditionAssignment_3_1.eContents().get(0);
+		
+		//DataInterchangeLookupFilterCondition:
+		//	refProperty=[entity::LEntityFeature] operator=Operator
+		//	operand=DataInterchangeLookupFilterOperand? (operator2=Junction subcondition=DataInterchangeLookupFilterCondition)?;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//refProperty=[entity::LEntityFeature] operator=Operator operand=DataInterchangeLookupFilterOperand? (operator2=Junction
+		//subcondition=DataInterchangeLookupFilterCondition)?
+		public Group getGroup() { return cGroup; }
+		
+		//refProperty=[entity::LEntityFeature]
+		public Assignment getRefPropertyAssignment_0() { return cRefPropertyAssignment_0; }
+		
+		//[entity::LEntityFeature]
+		public CrossReference getRefPropertyLEntityFeatureCrossReference_0_0() { return cRefPropertyLEntityFeatureCrossReference_0_0; }
+		
+		//ID
+		public RuleCall getRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1() { return cRefPropertyLEntityFeatureIDTerminalRuleCall_0_0_1; }
+		
+		//operator=Operator
+		public Assignment getOperatorAssignment_1() { return cOperatorAssignment_1; }
+		
+		//Operator
+		public RuleCall getOperatorOperatorEnumRuleCall_1_0() { return cOperatorOperatorEnumRuleCall_1_0; }
+		
+		//operand=DataInterchangeLookupFilterOperand?
+		public Assignment getOperandAssignment_2() { return cOperandAssignment_2; }
+		
+		//DataInterchangeLookupFilterOperand
+		public RuleCall getOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0() { return cOperandDataInterchangeLookupFilterOperandParserRuleCall_2_0; }
+		
+		//(operator2=Junction subcondition=DataInterchangeLookupFilterCondition)?
+		public Group getGroup_3() { return cGroup_3; }
+		
+		//operator2=Junction
+		public Assignment getOperator2Assignment_3_0() { return cOperator2Assignment_3_0; }
+		
+		//Junction
+		public RuleCall getOperator2JunctionEnumRuleCall_3_0_0() { return cOperator2JunctionEnumRuleCall_3_0_0; }
+		
+		//subcondition=DataInterchangeLookupFilterCondition
+		public Assignment getSubconditionAssignment_3_1() { return cSubconditionAssignment_3_1; }
+		
+		//DataInterchangeLookupFilterCondition
+		public RuleCall getSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0() { return cSubconditionDataInterchangeLookupFilterConditionParserRuleCall_3_1_0; }
+	}
+	public class DataInterchangeLookupFilterOperandElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterOperand");
+		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
+		private final RuleCall cDataInterchangeLookupFilterOperandStringParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
+		private final RuleCall cDataInterchangeLookupFilterOperandPropertyParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		
+		//DataInterchangeLookupFilterOperand:
+		//	DataInterchangeLookupFilterOperandString | DataInterchangeLookupFilterOperandProperty;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//DataInterchangeLookupFilterOperandString | DataInterchangeLookupFilterOperandProperty
+		public Alternatives getAlternatives() { return cAlternatives; }
+		
+		//DataInterchangeLookupFilterOperandString
+		public RuleCall getDataInterchangeLookupFilterOperandStringParserRuleCall_0() { return cDataInterchangeLookupFilterOperandStringParserRuleCall_0; }
+		
+		//DataInterchangeLookupFilterOperandProperty
+		public RuleCall getDataInterchangeLookupFilterOperandPropertyParserRuleCall_1() { return cDataInterchangeLookupFilterOperandPropertyParserRuleCall_1; }
+	}
+	public class DataInterchangeLookupFilterOperandPropertyElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterOperandProperty");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataInterchangeLookupFilterOperandPropertyAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cRefPropertyAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final CrossReference cRefPropertyLEntityFeatureCrossReference_1_0 = (CrossReference)cRefPropertyAssignment_1.eContents().get(0);
+		private final RuleCall cRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1 = (RuleCall)cRefPropertyLEntityFeatureCrossReference_1_0.eContents().get(1);
+		
+		//DataInterchangeLookupFilterOperandProperty:
+		//	{DataInterchangeLookupFilterOperandProperty} refProperty=[entity::LEntityFeature];
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{DataInterchangeLookupFilterOperandProperty} refProperty=[entity::LEntityFeature]
+		public Group getGroup() { return cGroup; }
+		
+		//{DataInterchangeLookupFilterOperandProperty}
+		public Action getDataInterchangeLookupFilterOperandPropertyAction_0() { return cDataInterchangeLookupFilterOperandPropertyAction_0; }
+		
+		//refProperty=[entity::LEntityFeature]
+		public Assignment getRefPropertyAssignment_1() { return cRefPropertyAssignment_1; }
+		
+		//[entity::LEntityFeature]
+		public CrossReference getRefPropertyLEntityFeatureCrossReference_1_0() { return cRefPropertyLEntityFeatureCrossReference_1_0; }
+		
+		//ID
+		public RuleCall getRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1() { return cRefPropertyLEntityFeatureIDTerminalRuleCall_1_0_1; }
+	}
+	public class DataInterchangeLookupFilterOperandStringElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeLookupFilterOperandString");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataInterchangeLookupFilterOperandStringAction_0 = (Action)cGroup.eContents().get(0);
+		private final Assignment cValueAssignment_1 = (Assignment)cGroup.eContents().get(1);
+		private final RuleCall cValueSTRINGTerminalRuleCall_1_0 = (RuleCall)cValueAssignment_1.eContents().get(0);
+		
+		//DataInterchangeLookupFilterOperandString:
+		//	{DataInterchangeLookupFilterOperandString} value=STRING;
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{DataInterchangeLookupFilterOperandString} value=STRING
+		public Group getGroup() { return cGroup; }
+		
+		//{DataInterchangeLookupFilterOperandString}
+		public Action getDataInterchangeLookupFilterOperandStringAction_0() { return cDataInterchangeLookupFilterOperandStringAction_0; }
+		
+		//value=STRING
+		public Assignment getValueAssignment_1() { return cValueAssignment_1; }
+		
+		//STRING
+		public RuleCall getValueSTRINGTerminalRuleCall_1_0() { return cValueSTRINGTerminalRuleCall_1_0; }
 	}
 	public class DataInterchangeExportHideElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeExportHide");
@@ -1602,12 +1836,13 @@
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final RuleCall cDataInterchangeValueMappingParserRuleCall_0 = (RuleCall)cAlternatives.eContents().get(0);
 		private final RuleCall cDataInterchangeBlobMappingParserRuleCall_1 = (RuleCall)cAlternatives.eContents().get(1);
+		private final RuleCall cDataInterchangeFixedColumnMappingParserRuleCall_2 = (RuleCall)cAlternatives.eContents().get(2);
 		
 		//DataInterchangeMapping:
-		//	DataInterchangeValueMapping | DataInterchangeBlobMapping;
+		//	DataInterchangeValueMapping | DataInterchangeBlobMapping | DataInterchangeFixedColumnMapping;
 		@Override public ParserRule getRule() { return rule; }
 		
-		//DataInterchangeValueMapping | DataInterchangeBlobMapping
+		//DataInterchangeValueMapping | DataInterchangeBlobMapping | DataInterchangeFixedColumnMapping
 		public Alternatives getAlternatives() { return cAlternatives; }
 		
 		//DataInterchangeValueMapping
@@ -1615,6 +1850,9 @@
 		
 		//DataInterchangeBlobMapping
 		public RuleCall getDataInterchangeBlobMappingParserRuleCall_1() { return cDataInterchangeBlobMappingParserRuleCall_1; }
+		
+		//DataInterchangeFixedColumnMapping
+		public RuleCall getDataInterchangeFixedColumnMappingParserRuleCall_2() { return cDataInterchangeFixedColumnMappingParserRuleCall_2; }
 	}
 	public class DataInterchangeValueMappingElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeValueMapping");
@@ -1749,6 +1987,132 @@
 		//PredefinedBlobMimeTypeEnum
 		public RuleCall getMimeTypePredefinedBlobMimeTypeEnumEnumRuleCall_8_0() { return cMimeTypePredefinedBlobMimeTypeEnumEnumRuleCall_8_0; }
 	}
+	public class DataInterchangeFixedColumnMappingElements extends AbstractParserRuleElementFinder {
+		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.DataInterchangeFixedColumnMapping");
+		private final Group cGroup = (Group)rule.eContents().get(1);
+		private final Action cDataInterchangeFixedColumnMappingAction_0 = (Action)cGroup.eContents().get(0);
+		private final Keyword cMapFixedLengthKeyword_1 = (Keyword)cGroup.eContents().get(1);
+		private final Assignment cPropertyAssignment_2 = (Assignment)cGroup.eContents().get(2);
+		private final CrossReference cPropertyLEntityAttributeCrossReference_2_0 = (CrossReference)cPropertyAssignment_2.eContents().get(0);
+		private final RuleCall cPropertyLEntityAttributeIDTerminalRuleCall_2_0_1 = (RuleCall)cPropertyLEntityAttributeCrossReference_2_0.eContents().get(1);
+		private final Keyword cLengthKeyword_3 = (Keyword)cGroup.eContents().get(3);
+		private final Assignment cLengthAssignment_4 = (Assignment)cGroup.eContents().get(4);
+		private final RuleCall cLengthINTTerminalRuleCall_4_0 = (RuleCall)cLengthAssignment_4.eContents().get(0);
+		private final UnorderedGroup cUnorderedGroup_5 = (UnorderedGroup)cGroup.eContents().get(5);
+		private final Alternatives cAlternatives_5_0 = (Alternatives)cUnorderedGroup_5.eContents().get(0);
+		private final Assignment cTrimAssignment_5_0_0 = (Assignment)cAlternatives_5_0.eContents().get(0);
+		private final Keyword cTrimTrimKeyword_5_0_0_0 = (Keyword)cTrimAssignment_5_0_0.eContents().get(0);
+		private final Assignment cLeftTrimAssignment_5_0_1 = (Assignment)cAlternatives_5_0.eContents().get(1);
+		private final Keyword cLeftTrimLeftTrimKeyword_5_0_1_0 = (Keyword)cLeftTrimAssignment_5_0_1.eContents().get(0);
+		private final Assignment cRightTrimAssignment_5_0_2 = (Assignment)cAlternatives_5_0.eContents().get(2);
+		private final Keyword cRightTrimRightTrimKeyword_5_0_2_0 = (Keyword)cRightTrimAssignment_5_0_2.eContents().get(0);
+		private final Alternatives cAlternatives_5_1 = (Alternatives)cUnorderedGroup_5.eContents().get(1);
+		private final Assignment cLowerCaseAssignment_5_1_0 = (Assignment)cAlternatives_5_1.eContents().get(0);
+		private final Keyword cLowerCaseLowerCaseKeyword_5_1_0_0 = (Keyword)cLowerCaseAssignment_5_1_0.eContents().get(0);
+		private final Assignment cUpperCaseAssignment_5_1_1 = (Assignment)cAlternatives_5_1.eContents().get(1);
+		private final Keyword cUpperCaseUpperCaseKeyword_5_1_1_0 = (Keyword)cUpperCaseAssignment_5_1_1.eContents().get(0);
+		private final Assignment cCapFirstAssignment_5_1_2 = (Assignment)cAlternatives_5_1.eContents().get(2);
+		private final Keyword cCapFirstCapitalizeFirstWordKeyword_5_1_2_0 = (Keyword)cCapFirstAssignment_5_1_2.eContents().get(0);
+		private final Assignment cUncapFirstAssignment_5_1_3 = (Assignment)cAlternatives_5_1.eContents().get(3);
+		private final Keyword cUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0 = (Keyword)cUncapFirstAssignment_5_1_3.eContents().get(0);
+		private final Assignment cCapitalizeAssignment_5_1_4 = (Assignment)cAlternatives_5_1.eContents().get(4);
+		private final Keyword cCapitalizeCapitalizeKeyword_5_1_4_0 = (Keyword)cCapitalizeAssignment_5_1_4.eContents().get(0);
+		
+		//// it would be better if the mime type can be optional and deduced from extension
+		//DataInterchangeFixedColumnMapping:
+		//	{DataInterchangeFixedColumnMapping} 'mapFixedLength' property=[entity::LEntityAttribute] 'length' length=INT
+		//	((trim?='trim' | leftTrim?='leftTrim' | rightTrim?='rightTrim')? & (lowerCase?='lowerCase' | upperCase?='upperCase' |
+		//	capFirst?='capitalizeFirstWord' | uncapFirst?='uncapitalizeFirstWord' | capitalize?='capitalize')?);
+		@Override public ParserRule getRule() { return rule; }
+		
+		//{DataInterchangeFixedColumnMapping} 'mapFixedLength' property=[entity::LEntityAttribute] 'length' length=INT
+		//((trim?='trim' | leftTrim?='leftTrim' | rightTrim?='rightTrim')? & (lowerCase?='lowerCase' | upperCase?='upperCase' |
+		//capFirst?='capitalizeFirstWord' | uncapFirst?='uncapitalizeFirstWord' | capitalize?='capitalize')?)
+		public Group getGroup() { return cGroup; }
+		
+		//{DataInterchangeFixedColumnMapping}
+		public Action getDataInterchangeFixedColumnMappingAction_0() { return cDataInterchangeFixedColumnMappingAction_0; }
+		
+		//'mapFixedLength'
+		public Keyword getMapFixedLengthKeyword_1() { return cMapFixedLengthKeyword_1; }
+		
+		//property=[entity::LEntityAttribute]
+		public Assignment getPropertyAssignment_2() { return cPropertyAssignment_2; }
+		
+		//[entity::LEntityAttribute]
+		public CrossReference getPropertyLEntityAttributeCrossReference_2_0() { return cPropertyLEntityAttributeCrossReference_2_0; }
+		
+		//ID
+		public RuleCall getPropertyLEntityAttributeIDTerminalRuleCall_2_0_1() { return cPropertyLEntityAttributeIDTerminalRuleCall_2_0_1; }
+		
+		//'length'
+		public Keyword getLengthKeyword_3() { return cLengthKeyword_3; }
+		
+		//length=INT
+		public Assignment getLengthAssignment_4() { return cLengthAssignment_4; }
+		
+		//INT
+		public RuleCall getLengthINTTerminalRuleCall_4_0() { return cLengthINTTerminalRuleCall_4_0; }
+		
+		//(trim?='trim' | leftTrim?='leftTrim' | rightTrim?='rightTrim')? & (lowerCase?='lowerCase' | upperCase?='upperCase' |
+		//capFirst?='capitalizeFirstWord' | uncapFirst?='uncapitalizeFirstWord' | capitalize?='capitalize')?
+		public UnorderedGroup getUnorderedGroup_5() { return cUnorderedGroup_5; }
+		
+		//(trim?='trim' | leftTrim?='leftTrim' | rightTrim?='rightTrim')?
+		public Alternatives getAlternatives_5_0() { return cAlternatives_5_0; }
+		
+		//trim?='trim'
+		public Assignment getTrimAssignment_5_0_0() { return cTrimAssignment_5_0_0; }
+		
+		//'trim'
+		public Keyword getTrimTrimKeyword_5_0_0_0() { return cTrimTrimKeyword_5_0_0_0; }
+		
+		//leftTrim?='leftTrim'
+		public Assignment getLeftTrimAssignment_5_0_1() { return cLeftTrimAssignment_5_0_1; }
+		
+		//'leftTrim'
+		public Keyword getLeftTrimLeftTrimKeyword_5_0_1_0() { return cLeftTrimLeftTrimKeyword_5_0_1_0; }
+		
+		//rightTrim?='rightTrim'
+		public Assignment getRightTrimAssignment_5_0_2() { return cRightTrimAssignment_5_0_2; }
+		
+		//'rightTrim'
+		public Keyword getRightTrimRightTrimKeyword_5_0_2_0() { return cRightTrimRightTrimKeyword_5_0_2_0; }
+		
+		//(lowerCase?='lowerCase' | upperCase?='upperCase' | capFirst?='capitalizeFirstWord' | uncapFirst?='uncapitalizeFirstWord'
+		//| capitalize?='capitalize')?
+		public Alternatives getAlternatives_5_1() { return cAlternatives_5_1; }
+		
+		//lowerCase?='lowerCase'
+		public Assignment getLowerCaseAssignment_5_1_0() { return cLowerCaseAssignment_5_1_0; }
+		
+		//'lowerCase'
+		public Keyword getLowerCaseLowerCaseKeyword_5_1_0_0() { return cLowerCaseLowerCaseKeyword_5_1_0_0; }
+		
+		//upperCase?='upperCase'
+		public Assignment getUpperCaseAssignment_5_1_1() { return cUpperCaseAssignment_5_1_1; }
+		
+		//'upperCase'
+		public Keyword getUpperCaseUpperCaseKeyword_5_1_1_0() { return cUpperCaseUpperCaseKeyword_5_1_1_0; }
+		
+		//capFirst?='capitalizeFirstWord'
+		public Assignment getCapFirstAssignment_5_1_2() { return cCapFirstAssignment_5_1_2; }
+		
+		//'capitalizeFirstWord'
+		public Keyword getCapFirstCapitalizeFirstWordKeyword_5_1_2_0() { return cCapFirstCapitalizeFirstWordKeyword_5_1_2_0; }
+		
+		//uncapFirst?='uncapitalizeFirstWord'
+		public Assignment getUncapFirstAssignment_5_1_3() { return cUncapFirstAssignment_5_1_3; }
+		
+		//'uncapitalizeFirstWord'
+		public Keyword getUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0() { return cUncapFirstUncapitalizeFirstWordKeyword_5_1_3_0; }
+		
+		//capitalize?='capitalize'
+		public Assignment getCapitalizeAssignment_5_1_4() { return cCapitalizeAssignment_5_1_4; }
+		
+		//'capitalize'
+		public Keyword getCapitalizeCapitalizeKeyword_5_1_4_0() { return cCapitalizeCapitalizeKeyword_5_1_4_0; }
+	}
 	public class LFQNElements extends AbstractParserRuleElementFinder {
 		private final ParserRule rule = (ParserRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.LFQN");
 		private final Group cGroup = (Group)rule.eContents().get(1);
@@ -1757,7 +2121,6 @@
 		private final Keyword cFullStopKeyword_1_0 = (Keyword)cGroup_1.eContents().get(0);
 		private final RuleCall cIDTerminalRuleCall_1_1 = (RuleCall)cGroup_1.eContents().get(1);
 		
-		//// it would be better if the mime type can be optional and deduced from extension
 		//LFQN:
 		//	ID ('.' ID)*;
 		@Override public ParserRule getRule() { return rule; }
@@ -1993,8 +2356,8 @@
 		//'remove'
 		public Keyword getRemoveRemoveKeyword_2_0() { return cRemoveRemoveKeyword_2_0; }
 	}
-	public class ConditionAndOperator1Elements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator1");
+	public class OperatorElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.Operator");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cEqualsEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cEqualsEqualsSignKeyword_0_0 = (Keyword)cEqualsEnumLiteralDeclaration_0.eContents().get(0);
@@ -2013,7 +2376,7 @@
 		private final EnumLiteralDeclaration cIsnotnullEnumLiteralDeclaration_7 = (EnumLiteralDeclaration)cAlternatives.eContents().get(7);
 		private final Keyword cIsnotnullIsnotnullKeyword_7_0 = (Keyword)cIsnotnullEnumLiteralDeclaration_7.eContents().get(0);
 		
-		//enum ConditionAndOperator1:
+		//enum Operator:
 		//	equals='=' |
 		//	notequals='!=' |
 		//	greaterthen='>' |
@@ -2076,15 +2439,15 @@
 		//'isnotnull'
 		public Keyword getIsnotnullIsnotnullKeyword_7_0() { return cIsnotnullIsnotnullKeyword_7_0; }
 	}
-	public class ConditionAndOperator2Elements extends AbstractEnumRuleElementFinder {
-		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.ConditionAndOperator2");
+	public class JunctionElements extends AbstractEnumRuleElementFinder {
+		private final EnumRule rule = (EnumRule) GrammarUtil.findRuleForName(getGrammar(), "org.eclipse.osbp.xtext.datainterchange.DataDSL.Junction");
 		private final Alternatives cAlternatives = (Alternatives)rule.eContents().get(1);
 		private final EnumLiteralDeclaration cAndEnumLiteralDeclaration_0 = (EnumLiteralDeclaration)cAlternatives.eContents().get(0);
 		private final Keyword cAndAndKeyword_0_0 = (Keyword)cAndEnumLiteralDeclaration_0.eContents().get(0);
 		private final EnumLiteralDeclaration cOrEnumLiteralDeclaration_1 = (EnumLiteralDeclaration)cAlternatives.eContents().get(1);
 		private final Keyword cOrOrKeyword_1_0 = (Keyword)cOrEnumLiteralDeclaration_1.eContents().get(0);
 		
-		//enum ConditionAndOperator2:
+		//enum Junction:
 		//	and |
 		//	or;
 		public EnumRule getRule() { return rule; }
@@ -2113,6 +2476,7 @@
 	private final DataInterchangeFileXMLElements pDataInterchangeFileXML;
 	private final DataInterchangeFileCSVElements pDataInterchangeFileCSV;
 	private final DataInterchangeFileEDIElements pDataInterchangeFileEDI;
+	private final DataInterchangeFileFixedElements pDataInterchangeFileFixed;
 	private final DataInterchangeBeanElements pDataInterchangeBean;
 	private final DataInterchangeKeyElements pDataInterchangeKey;
 	private final DataInterchangeLookupElements pDataInterchangeLookup;
@@ -2123,12 +2487,17 @@
 	private final DataInterchangeEntityExpressionElements pDataInterchangeEntityExpression;
 	private final DataInterchangeExposeElements pDataInterchangeExpose;
 	private final DataInterchangeExportFilterElements pDataInterchangeExportFilter;
-	private final DataInterchangeFilterConditionElements pDataInterchangeFilterCondition;
+	private final DataInterchangeExportFilterConditionElements pDataInterchangeExportFilterCondition;
+	private final DataInterchangeLookupFilterConditionElements pDataInterchangeLookupFilterCondition;
+	private final DataInterchangeLookupFilterOperandElements pDataInterchangeLookupFilterOperand;
+	private final DataInterchangeLookupFilterOperandPropertyElements pDataInterchangeLookupFilterOperandProperty;
+	private final DataInterchangeLookupFilterOperandStringElements pDataInterchangeLookupFilterOperandString;
 	private final DataInterchangeExportHideElements pDataInterchangeExportHide;
 	private final DataInterchangePredefinedExpressionElements pDataInterchangePredefinedExpression;
 	private final DataInterchangeMappingElements pDataInterchangeMapping;
 	private final DataInterchangeValueMappingElements pDataInterchangeValueMapping;
 	private final DataInterchangeBlobMappingElements pDataInterchangeBlobMapping;
+	private final DataInterchangeFixedColumnMappingElements pDataInterchangeFixedColumnMapping;
 	private final LFQNElements pLFQN;
 	private final TRANSLATABLESTRINGElements pTRANSLATABLESTRING;
 	private final TRANSLATABLEIDElements pTRANSLATABLEID;
@@ -2136,8 +2505,8 @@
 	private final PredefinedBeanEnumElements ePredefinedBeanEnum;
 	private final PredefinedBeanTypeEnumElements ePredefinedBeanTypeEnum;
 	private final EntityManagerModeElements eEntityManagerMode;
-	private final ConditionAndOperator1Elements eConditionAndOperator1;
-	private final ConditionAndOperator2Elements eConditionAndOperator2;
+	private final OperatorElements eOperator;
+	private final JunctionElements eJunction;
 	
 	private final Grammar grammar;
 	
@@ -2168,6 +2537,7 @@
 		this.pDataInterchangeFileXML = new DataInterchangeFileXMLElements();
 		this.pDataInterchangeFileCSV = new DataInterchangeFileCSVElements();
 		this.pDataInterchangeFileEDI = new DataInterchangeFileEDIElements();
+		this.pDataInterchangeFileFixed = new DataInterchangeFileFixedElements();
 		this.pDataInterchangeBean = new DataInterchangeBeanElements();
 		this.pDataInterchangeKey = new DataInterchangeKeyElements();
 		this.pDataInterchangeLookup = new DataInterchangeLookupElements();
@@ -2178,12 +2548,17 @@
 		this.pDataInterchangeEntityExpression = new DataInterchangeEntityExpressionElements();
 		this.pDataInterchangeExpose = new DataInterchangeExposeElements();
 		this.pDataInterchangeExportFilter = new DataInterchangeExportFilterElements();
-		this.pDataInterchangeFilterCondition = new DataInterchangeFilterConditionElements();
+		this.pDataInterchangeExportFilterCondition = new DataInterchangeExportFilterConditionElements();
+		this.pDataInterchangeLookupFilterCondition = new DataInterchangeLookupFilterConditionElements();
+		this.pDataInterchangeLookupFilterOperand = new DataInterchangeLookupFilterOperandElements();
+		this.pDataInterchangeLookupFilterOperandProperty = new DataInterchangeLookupFilterOperandPropertyElements();
+		this.pDataInterchangeLookupFilterOperandString = new DataInterchangeLookupFilterOperandStringElements();
 		this.pDataInterchangeExportHide = new DataInterchangeExportHideElements();
 		this.pDataInterchangePredefinedExpression = new DataInterchangePredefinedExpressionElements();
 		this.pDataInterchangeMapping = new DataInterchangeMappingElements();
 		this.pDataInterchangeValueMapping = new DataInterchangeValueMappingElements();
 		this.pDataInterchangeBlobMapping = new DataInterchangeBlobMappingElements();
+		this.pDataInterchangeFixedColumnMapping = new DataInterchangeFixedColumnMappingElements();
 		this.pLFQN = new LFQNElements();
 		this.pTRANSLATABLESTRING = new TRANSLATABLESTRINGElements();
 		this.pTRANSLATABLEID = new TRANSLATABLEIDElements();
@@ -2191,8 +2566,8 @@
 		this.ePredefinedBeanEnum = new PredefinedBeanEnumElements();
 		this.ePredefinedBeanTypeEnum = new PredefinedBeanTypeEnumElements();
 		this.eEntityManagerMode = new EntityManagerModeElements();
-		this.eConditionAndOperator1 = new ConditionAndOperator1Elements();
-		this.eConditionAndOperator2 = new ConditionAndOperator2Elements();
+		this.eOperator = new OperatorElements();
+		this.eJunction = new JunctionElements();
 	}
 	
 	protected Grammar internalFindGrammar(GrammarProvider grammarProvider) {
@@ -2280,7 +2655,7 @@
 	}
 	
 	//DataInterchangeFile:
-	//	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI;
+	//	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI | DataInterchangeFileFixed;
 	public DataInterchangeFileElements getDataInterchangeFileAccess() {
 		return pDataInterchangeFile;
 	}
@@ -2323,14 +2698,25 @@
 		return getDataInterchangeFileEDIAccess().getRule();
 	}
 	
+	//DataInterchangeFileFixed:
+	//	{DataInterchangeFileFixed} 'Fixed' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
+	public DataInterchangeFileFixedElements getDataInterchangeFileFixedAccess() {
+		return pDataInterchangeFileFixed;
+	}
+	
+	public ParserRule getDataInterchangeFileFixedRule() {
+		return getDataInterchangeFileFixedAccess().getRule();
+	}
+	
 	//DataInterchangeBean:
 	//	{DataInterchangeBean}
-	//	'entity' entity=[entity::LEntity|LFQN] ('nodeName' nodeName=STRING)? ('createOn' elementMap=STRING)?
-	//	(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])? (markLatestExport?='latestExport'
-	//	latestExpProperty=[entity::LEntityAttribute])? ('expression' '{' expression+=DataInterchangeExpression* '}')?
+	//	'entity' entity=[entity::LEntity|LFQN] ('referencedBy' refDataSource=[entity::LEntityFeature])? ('nodeName'
+	//	nodeName=STRING)? ('createOn' elementMap=STRING)? (markLatestImport?='latestImport'
+	//	latestProperty=[entity::LEntityAttribute])? (markLatestExport?='latestExport'
+	//	latestExpProperty=[entity::LEntityAttribute])? (('expression' '{' expression+=DataInterchangeExpression* '}')?
 	//	('lookup' '{' lookup+=DataInterchangeLookup* '}')? ('format' '{' format+=DataInterchangeFormat* '}')? ('expose' '{'
 	//	exportExposes+=DataInterchangeExpose* '}')? ('mapping' '{' mappings+=DataInterchangeMapping* '}')? ('keys' '{'
-	//	lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?;
+	//	lookupKeys+=DataInterchangeKey* '}')? ('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?);
 	public DataInterchangeBeanElements getDataInterchangeBeanAccess() {
 		return pDataInterchangeBean;
 	}
@@ -2352,10 +2738,11 @@
 	//DataInterchangeLookup:
 	//	{DataInterchangeLookup}
 	//	'for' targetProperty=[entity::LEntityReference]
-	//	'on' entity=[entity::LEntity] ('createOn' elementMap=STRING)?
-	//	'with' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('mapTo' dataMap=STRING)?
-	//	(allowNoResult?='allowNoResult'? & allowNonuniqueResult?='allowNonuniqueResult'? &
-	//	markerPath=DataInterchangeMarkerPath?);
+	//	'in' entity=[entity::LEntity]
+	//	'createOn' elementMap=STRING
+	//	'mapFrom' dataMap=STRING (allowNoResult?='allowNoResult'? & markerPath=DataInterchangeMarkerPath?)
+	//	'mapTo' queryProperty=[entity::LEntityAttribute] (cached?='cacheSize' cacheSize=INT)? ('where' '{'
+	//	condition=DataInterchangeLookupFilterCondition '}')?;
 	public DataInterchangeLookupElements getDataInterchangeLookupAccess() {
 		return pDataInterchangeLookup;
 	}
@@ -2431,7 +2818,7 @@
 	}
 	
 	//DataInterchangeExportFilter:
-	//	{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeFilterCondition '}')? ('hide'
+	//	{DataInterchangeExportFilter} ('where' '{' condition=DataInterchangeExportFilterCondition '}')? ('hide'
 	//	hiddenproperties+=DataInterchangeExportHide*)?;
 	public DataInterchangeExportFilterElements getDataInterchangeExportFilterAccess() {
 		return pDataInterchangeExportFilter;
@@ -2441,15 +2828,56 @@
 		return getDataInterchangeExportFilterAccess().getRule();
 	}
 	
-	//DataInterchangeFilterCondition:
-	//	refProperty=[entity::LEntityFeature] operator=ConditionAndOperator1
-	//	value=STRING? (operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition)?;
-	public DataInterchangeFilterConditionElements getDataInterchangeFilterConditionAccess() {
-		return pDataInterchangeFilterCondition;
+	//DataInterchangeExportFilterCondition:
+	//	refProperty=[entity::LEntityFeature] operator=Operator
+	//	value=STRING? (operator2=Junction subcondition=DataInterchangeExportFilterCondition)?;
+	public DataInterchangeExportFilterConditionElements getDataInterchangeExportFilterConditionAccess() {
+		return pDataInterchangeExportFilterCondition;
 	}
 	
-	public ParserRule getDataInterchangeFilterConditionRule() {
-		return getDataInterchangeFilterConditionAccess().getRule();
+	public ParserRule getDataInterchangeExportFilterConditionRule() {
+		return getDataInterchangeExportFilterConditionAccess().getRule();
+	}
+	
+	//DataInterchangeLookupFilterCondition:
+	//	refProperty=[entity::LEntityFeature] operator=Operator
+	//	operand=DataInterchangeLookupFilterOperand? (operator2=Junction subcondition=DataInterchangeLookupFilterCondition)?;
+	public DataInterchangeLookupFilterConditionElements getDataInterchangeLookupFilterConditionAccess() {
+		return pDataInterchangeLookupFilterCondition;
+	}
+	
+	public ParserRule getDataInterchangeLookupFilterConditionRule() {
+		return getDataInterchangeLookupFilterConditionAccess().getRule();
+	}
+	
+	//DataInterchangeLookupFilterOperand:
+	//	DataInterchangeLookupFilterOperandString | DataInterchangeLookupFilterOperandProperty;
+	public DataInterchangeLookupFilterOperandElements getDataInterchangeLookupFilterOperandAccess() {
+		return pDataInterchangeLookupFilterOperand;
+	}
+	
+	public ParserRule getDataInterchangeLookupFilterOperandRule() {
+		return getDataInterchangeLookupFilterOperandAccess().getRule();
+	}
+	
+	//DataInterchangeLookupFilterOperandProperty:
+	//	{DataInterchangeLookupFilterOperandProperty} refProperty=[entity::LEntityFeature];
+	public DataInterchangeLookupFilterOperandPropertyElements getDataInterchangeLookupFilterOperandPropertyAccess() {
+		return pDataInterchangeLookupFilterOperandProperty;
+	}
+	
+	public ParserRule getDataInterchangeLookupFilterOperandPropertyRule() {
+		return getDataInterchangeLookupFilterOperandPropertyAccess().getRule();
+	}
+	
+	//DataInterchangeLookupFilterOperandString:
+	//	{DataInterchangeLookupFilterOperandString} value=STRING;
+	public DataInterchangeLookupFilterOperandStringElements getDataInterchangeLookupFilterOperandStringAccess() {
+		return pDataInterchangeLookupFilterOperandString;
+	}
+	
+	public ParserRule getDataInterchangeLookupFilterOperandStringRule() {
+		return getDataInterchangeLookupFilterOperandStringAccess().getRule();
 	}
 	
 	//DataInterchangeExportHide:
@@ -2474,7 +2902,7 @@
 	}
 	
 	//DataInterchangeMapping:
-	//	DataInterchangeValueMapping | DataInterchangeBlobMapping;
+	//	DataInterchangeValueMapping | DataInterchangeBlobMapping | DataInterchangeFixedColumnMapping;
 	public DataInterchangeMappingElements getDataInterchangeMappingAccess() {
 		return pDataInterchangeMapping;
 	}
@@ -2506,6 +2934,18 @@
 	}
 	
 	//// it would be better if the mime type can be optional and deduced from extension
+	//DataInterchangeFixedColumnMapping:
+	//	{DataInterchangeFixedColumnMapping} 'mapFixedLength' property=[entity::LEntityAttribute] 'length' length=INT
+	//	((trim?='trim' | leftTrim?='leftTrim' | rightTrim?='rightTrim')? & (lowerCase?='lowerCase' | upperCase?='upperCase' |
+	//	capFirst?='capitalizeFirstWord' | uncapFirst?='uncapitalizeFirstWord' | capitalize?='capitalize')?);
+	public DataInterchangeFixedColumnMappingElements getDataInterchangeFixedColumnMappingAccess() {
+		return pDataInterchangeFixedColumnMapping;
+	}
+	
+	public ParserRule getDataInterchangeFixedColumnMappingRule() {
+		return getDataInterchangeFixedColumnMappingAccess().getRule();
+	}
+	
 	//LFQN:
 	//	ID ('.' ID)*;
 	public LFQNElements getLFQNAccess() {
@@ -2589,7 +3029,7 @@
 		return getEntityManagerModeAccess().getRule();
 	}
 	
-	//enum ConditionAndOperator1:
+	//enum Operator:
 	//	equals='=' |
 	//	notequals='!=' |
 	//	greaterthen='>' |
@@ -2598,23 +3038,23 @@
 	//	lessthenorequalto='<=' |
 	//	isnull |
 	//	isnotnull;
-	public ConditionAndOperator1Elements getConditionAndOperator1Access() {
-		return eConditionAndOperator1;
+	public OperatorElements getOperatorAccess() {
+		return eOperator;
 	}
 	
-	public EnumRule getConditionAndOperator1Rule() {
-		return getConditionAndOperator1Access().getRule();
+	public EnumRule getOperatorRule() {
+		return getOperatorAccess().getRule();
 	}
 	
-	//enum ConditionAndOperator2:
+	//enum Junction:
 	//	and |
 	//	or;
-	public ConditionAndOperator2Elements getConditionAndOperator2Access() {
-		return eConditionAndOperator2;
+	public JunctionElements getJunctionAccess() {
+		return eJunction;
 	}
 	
-	public EnumRule getConditionAndOperator2Rule() {
-		return getConditionAndOperator2Access().getRule();
+	public EnumRule getJunctionRule() {
+		return getJunctionAccess().getRule();
 	}
 	
 	//@ Override XImportDeclaration OXImportDeclaration:
diff --git a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtext b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtext
index a5cd3c5..a701870 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtext
+++ b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/DataDSL.xtext
@@ -45,7 +45,7 @@
 	'file' fileEndpoint=DataInterchangeFile 'path' '{' (path+=DataInterchangeBean)* '}';
 
 DataInterchangeFile:
-	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI;
+	DataInterchangeFileXML | DataInterchangeFileCSV | DataInterchangeFileEDI | DataInterchangeFileFixed;
 	
 DataInterchangeFileXML:
 	{DataInterchangeFileXML} 'XML' fileURL=STRING ((byAttribute?='mapByAttribute')? & ('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
@@ -60,20 +60,24 @@
 DataInterchangeFileEDI:
 	{DataInterchangeFileEDI} 'EDI' fileURL=STRING  (('encoding' encoding=STRING)? & ('locale' locale=STRING)?) 'mappingModel' mappingModel=STRING (validate?='validate')?;
 
+DataInterchangeFileFixed:
+	{DataInterchangeFileFixed} 'Fixed' fileURL=STRING (('encoding' encoding=STRING)? & ('locale' locale=STRING)?);
+
 DataInterchangeBean:
 	{DataInterchangeBean} 
 	'entity' entity=[entity::LEntity|LFQN]
+	('referencedBy' refDataSource=[entity::LEntityFeature])?
 	('nodeName' nodeName=STRING)?
 	('createOn' elementMap=STRING)? 
 	(markLatestImport?='latestImport' latestProperty=[entity::LEntityAttribute])?
 	(markLatestExport?='latestExport' latestExpProperty=[entity::LEntityAttribute])?
-	('expression' '{' (expression+=DataInterchangeExpression)* '}')?
+	(('expression' '{' (expression+=DataInterchangeExpression)* '}')?
 	('lookup' '{' (lookup+=DataInterchangeLookup)* '}')?
 	('format' '{' (format+=DataInterchangeFormat)* '}')?
 	('expose' '{' (exportExposes+=DataInterchangeExpose)* '}')?
 	('mapping' '{' (mappings+=DataInterchangeMapping)* '}')?
 	('keys' '{' (lookupKeys+=DataInterchangeKey)* '}')?
-	('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?	
+	('exportFilter' '{' exportFilter=DataInterchangeExportFilter '}')?)	
 ;
 
 DataInterchangeKey:
@@ -82,16 +86,13 @@
 DataInterchangeLookup:
 	{DataInterchangeLookup}
 	'for' targetProperty=[entity::LEntityReference] 
-	'on' entity=[entity::LEntity]
-	('createOn' elementMap=STRING)?
-	'with' queryProperty=[entity::LEntityAttribute] 
-	(cached?='cacheSize' cacheSize=INT)? 
-	('mapTo' dataMap=STRING)?
-	(
-		(allowNoResult?='allowNoResult')? & 
-		(allowNonuniqueResult?='allowNonuniqueResult')? & 
-		(markerPath=DataInterchangeMarkerPath)?
-	);
+	'in' entity=[entity::LEntity]
+	'createOn' elementMap=STRING
+	'mapFrom' dataMap=STRING 
+	((allowNoResult?='allowNoResult')? & (markerPath=DataInterchangeMarkerPath)?)
+	'mapTo' queryProperty=[entity::LEntityAttribute] 
+	(cached?='cacheSize' cacheSize=INT)?
+	('where' '{' condition=DataInterchangeLookupFilterCondition'}')?; 
 	
 DataInterchangeMarkerPath:
 	{DataInterchangeMarkerPath} 
@@ -114,29 +115,41 @@
 
 DataInterchangeExpose:
 	{DataInterchangeExpose}
-	'ref' refEntity=[entity::LEntityReference] ('on' refProperty=[entity::LEntityAttribute] | 'expose' '{' subExpose=DataInterchangeExpose '}')
-;
+	'ref' refEntity=[entity::LEntityReference] ('on' refProperty=[entity::LEntityAttribute] | 'expose' '{' subExpose=DataInterchangeExpose '}');
 
 DataInterchangeExportFilter: 
 	{DataInterchangeExportFilter}
-	('where' '{' condition=DataInterchangeFilterCondition'}')?
-	('hide' hiddenproperties+=DataInterchangeExportHide*)?
-;
-DataInterchangeFilterCondition:  
-	refProperty=[entity::LEntityFeature] operator=ConditionAndOperator1 
+	('where' '{' condition=DataInterchangeExportFilterCondition'}')?
+	('hide' hiddenproperties+=DataInterchangeExportHide*)?;
+	
+DataInterchangeExportFilterCondition:  
+	refProperty=[entity::LEntityFeature] operator=Operator 
 	(value=STRING)?
-	(operator2=ConditionAndOperator2 subcondition=DataInterchangeFilterCondition )?
-;
+	(operator2=Junction subcondition=DataInterchangeExportFilterCondition )?;
+
+DataInterchangeLookupFilterCondition:  
+	refProperty=[entity::LEntityFeature] operator=Operator 
+	(operand=DataInterchangeLookupFilterOperand)?
+	(operator2=Junction subcondition=DataInterchangeLookupFilterCondition )?;
+
+DataInterchangeLookupFilterOperand:
+	DataInterchangeLookupFilterOperandString | DataInterchangeLookupFilterOperandProperty;
+
+DataInterchangeLookupFilterOperandProperty:
+	{DataInterchangeLookupFilterOperandProperty}
+	refProperty=[entity::LEntityFeature];
+
+DataInterchangeLookupFilterOperandString:
+	{DataInterchangeLookupFilterOperandString} value=STRING;
 
 DataInterchangeExportHide:
-{DataInterchangeExportHide} property=[entity::LEntityFeature]
-;
+{DataInterchangeExportHide} property=[entity::LEntityFeature];
 
 DataInterchangePredefinedExpression:
 	{DataInterchangePredefinedExpression} 'assign' targetProperty=[entity::LEntityAttribute] 'with' bean=PredefinedBeanEnum 'as' beanType=PredefinedBeanTypeEnum;
 
 DataInterchangeMapping:
-	DataInterchangeValueMapping | DataInterchangeBlobMapping;
+	DataInterchangeValueMapping | DataInterchangeBlobMapping | DataInterchangeFixedColumnMapping;
 
 DataInterchangeValueMapping:
 	{DataInterchangeValueMapping} 'map' property=[entity::LEntityAttribute] 'to' data=STRING;
@@ -145,7 +158,13 @@
 	{DataInterchangeBlobMapping} 'mapBlob' property=[entity::LEntityAttribute]
 	'to' data=STRING ('extension' blobFileExtension=STRING)? ('path' blobPath=STRING)?
 	'mimeType' mimeType=PredefinedBlobMimeTypeEnum ; // it would be better if the mime type can be optional and deduced from extension
-	
+
+DataInterchangeFixedColumnMapping:
+	{DataInterchangeFixedColumnMapping} 'mapFixedLength' property=[entity::LEntityAttribute] 'length' length=INT 
+	(
+		((trim?='trim') | (leftTrim?='leftTrim') | (rightTrim?='rightTrim'))? & 
+		((lowerCase?='lowerCase') | (upperCase?='upperCase') | (capFirst?='capitalizeFirstWord') | (uncapFirst?='uncapitalizeFirstWord') | (capitalize?='capitalize'))?
+	);
 
 LFQN:
 	ID ('.' ID)*;
@@ -181,8 +200,7 @@
 	merge		= 'merge'|
 	remove		= 'remove';
 
-
-enum ConditionAndOperator1:
+enum Operator:
 	equals = '=' |
 	notequals = '!=' |
 	greaterthen = '>' |
@@ -190,14 +208,8 @@
 	lessthen = '<' |
 	lessthenorequalto = '<=' |
 	isnull = 'isnull' |
-	isnotnull = 'isnotnull' 
-//	in = 'in' |
-//	between = 'between'| 
-//	exists = 'exists' |
-//	not = 'not 
-//	like = 'like'
-	;
+	isnotnull = 'isnotnull';
 	
-enum ConditionAndOperator2:
+enum Junction:
 	and = 'and'|
 	or = 'or';
\ No newline at end of file
diff --git a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLJvmModelInferrer.xtend b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLJvmModelInferrer.xtend
index c84284f..e66fadc 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLJvmModelInferrer.xtend
+++ b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLJvmModelInferrer.xtend
@@ -25,7 +25,6 @@
 import com.vaadin.ui.Panel
 import com.vaadin.ui.VerticalLayout
 import java.io.OutputStream
-import java.net.URL
 import java.nio.file.Path
 import java.util.ArrayList
 import java.util.HashMap
@@ -38,6 +37,7 @@
 import javax.persistence.EntityManager
 import javax.xml.transform.Transformer
 import javax.xml.transform.TransformerFactory
+import org.eclipse.core.runtime.IPath
 import org.eclipse.e4.core.contexts.IEclipseContext
 import org.eclipse.e4.ui.di.Focus
 import org.eclipse.e4.ui.model.application.MApplication
@@ -57,10 +57,7 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBlobMapping
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage
 import org.eclipse.osbp.xtext.datainterchange.EntityManagerMode
@@ -456,12 +453,13 @@
 			b = new NativeButton();
 			b.setHtmlContentAllowed(true);
 			buttons.put(b, new ArrayList<String>(Arrays.asList(new String[] {"«DataDSLModelGenerator.CAPTION__REPFIX_I18NKEY_IMPORT»", "«dataInterchange.name»","«dataInterchange.descriptionI18nKey»"})));
-			b.addStyleName("icon-download");
+			b.addStyleName("icon-download os-nocaption");
 			b.addClickListener(new ClickListener() {
 				@Override
 				public void buttonClick(ClickEvent event) {
 					log.debug("pressed «dataInterchange.name» import");
-					«dataInterchange.getBasicRunConfiguration(false, dataInterchange.getFileURL, WorkerThreadRunnable.Direction.IMPORT.name)»
+					«dataInterchange.getConfigFileURL»
+					«dataInterchange.getBasicRunConfiguration(false, WorkerThreadRunnable.Direction.IMPORT.name, null)»
 					«dataInterchange.defaultVariableName».setName(UUID.randomUUID().toString());
 					«dataInterchange.defaultVariableName».setEventDispatcher(eventDispatcher);
 					«dataInterchange.defaultVariableName».setUi(UI.getCurrent());
@@ -482,12 +480,13 @@
 			b = new NativeButton();
 			b.setHtmlContentAllowed(true);
 			buttons.put(b, new ArrayList<String>(Arrays.asList(new String[] {"«DataDSLModelGenerator.CAPTION__REPFIX_I18NKEY_EXPORT»", "«dataInterchange.name»","«dataInterchange.descriptionI18nKey»"})));
-			b.addStyleName("icon-upload");
+			b.addStyleName("icon-upload os-nocaption");
 			b.addClickListener(new ClickListener() {
 				@Override
 				public void buttonClick(ClickEvent event) {
 					log.debug("pressed «dataInterchange.name» export");
-					«dataInterchange.getBasicRunConfiguration(false, dataInterchange.getFileURL, WorkerThreadRunnable.Direction.EXPORT.name)»
+					«dataInterchange.getConfigFileURL»
+					«dataInterchange.getBasicRunConfiguration(false, WorkerThreadRunnable.Direction.EXPORT.name, null)»
 					«dataInterchange.defaultVariableName».setName(UUID.randomUUID().toString());
 					«dataInterchange.defaultVariableName».setEventDispatcher(eventDispatcher);
 					«dataInterchange.defaultVariableName».setUi(UI.getCurrent());
@@ -516,67 +515,77 @@
         return dataInterchange.name.toFirstLower
     }
     
-    def String getBasicRunConfiguration(DataInterchange dataInterchange, boolean fqClass, String fileURL, String direction) {
+    def String getBasicRunConfiguration(DataInterchange dataInterchange, boolean fqClass, String direction, DataInterchange baseInterchange) {
     	var className = ""
     	if	(fqClass) {
-    		className = DataDSLModelGenerator.pckgName+"."+dataInterchange.name
+    		className = (dataInterchange.eContainer.eContainer as DataInterchangePackage).name + "." + dataInterchange.name 
     	}
     	else {
     		className = dataInterchange.name
     	} 
+    	var URL = dataInterchange.produceAppropiateInterchangeURL
+    	
         return 
         '''
-			«className» «dataInterchange.getDefaultVariableName» = new «className»();
-			String url = ProductConfiguration.getDatainterchangeConfiguration();
-			if(url.isEmpty()) {
-				url = System.getProperty("user.home")+"/.osbee/"+"«(dataInterchange.eContainer as DataInterchangeGroup).name»Config.xml";
-			}
-			if(!url.endsWith(".xml") ) {
-				if(!(url.endsWith("/") || url.endsWith("\\")) ) {
-					url = url+File.separator;
-				}
-				url = url+"«(dataInterchange.eContainer as DataInterchangeGroup).name»Config.xml";
-			}
-			File file = new File(url);
-			if(file.exists()) {
-				FileInputStream fileInput;
-				try {
-					fileInput = new FileInputStream(file);
-					Properties properties = new Properties();
-					properties.loadFromXML(fileInput);
-					fileInput.close();
-					if(properties.getProperty("«dataInterchange.name»-«direction.toLowerCase()»") == null) {
-						«dataInterchange.getDefaultVariableName».setFileURL("«fileURL»");
-					} else {
-						«dataInterchange.getDefaultVariableName».setFileURL(properties.getProperty("«dataInterchange.name»-«direction.toLowerCase()»"));
-					}
-				} catch (IOException e) {
-					StringWriter sw = new StringWriter();
-					e.printStackTrace(new PrintWriter(sw));
-					log.error("{}", sw.toString());
-					return;
-				}
-			} else {
-				«dataInterchange.getDefaultVariableName».setFileURL("«fileURL»");
-			}
-			«dataInterchange.getDefaultVariableName».setPersistenceService(persistenceService);
-			«dataInterchange.getDefaultVariableName».setDataInterchange(dataInterchange);
-			«dataInterchange.getDefaultVariableName».setEventDispatcher(eventDispatcher);
-			«dataInterchange.getDefaultVariableName».setBlobService(blobService);
-				«if(direction.equals(Direction.IMPORT.name)){
-				'''«dataInterchange.getDefaultVariableName».setDeleteFileAfterImport(«dataInterchange.isDeleteFileAfterImport»);'''				
-			}»
+		«className» «dataInterchange.getDefaultVariableName» = new «className»();
+		«if(baseInterchange === null || (baseInterchange !== null && direction.equals(Direction.EXPORT.name))){
+			dataInterchange.getConfigFileURL
+			dataInterchange.getConfigFileURLA(URL, direction)     
+		}»
+		«dataInterchange.getDefaultVariableName».setPersistenceService(persistenceService);
+		«dataInterchange.getDefaultVariableName».setDataInterchange(dataInterchange);
+		«dataInterchange.getDefaultVariableName».setEventDispatcher(eventDispatcher);
+		«dataInterchange.getDefaultVariableName».setBlobService(blobService);
+		«if(direction.equals(Direction.IMPORT.name)){
+		'''«dataInterchange.getDefaultVariableName».setDeleteFileAfterImport(«dataInterchange.isDeleteFileAfterImport»);'''				
+		}»
         '''
     }
-
-	def String getFileURL(DataInterchange dataInterchange) {
-		switch(dataInterchange.fileEndpoint) {
-			DataInterchangeFileXML: return (dataInterchange.fileEndpoint as DataInterchangeFileXML).fileURL 
-			DataInterchangeFileCSV: return (dataInterchange.fileEndpoint as DataInterchangeFileCSV).fileURL 
-			DataInterchangeFileEDI: return (dataInterchange.fileEndpoint as DataInterchangeFileEDI).fileURL 
+    
+    def String getConfigFileURL(DataInterchange dataInterchange){
+    	return
+    	'''
+		String url = ProductConfiguration.getDatainterchangeConfiguration();
+		if(url == null || url.isEmpty()) {
+			url = System.getProperty("user.home")+"/.osbee/"+"«(dataInterchange.eContainer as DataInterchangeGroup).name»Config.xml";
 		}
-		return ""
-	}
+		if(!url.endsWith(".xml") ) {
+			if(!(url.endsWith("/") || url.endsWith("\\")) ) {
+				url = url+File.separator;
+			}
+			url = url+"«(dataInterchange.eContainer as DataInterchangeGroup).name»Config.xml";
+		}
+    	'''
+    }
+    
+    def String getConfigFileURLA(DataInterchange dataInterchange, String fileURL, String direction){
+    	return
+    	'''
+		File file = new File(url);
+		if(file.exists()) {
+			FileInputStream fileInput;
+			try {
+				fileInput = new FileInputStream(file);
+				Properties properties = new Properties();
+				properties.loadFromXML(fileInput);
+				fileInput.close();
+				if(properties.getProperty("«dataInterchange.name»-«direction.toLowerCase()»") == null) {
+					«dataInterchange.getDefaultVariableName».setFileURL("«fileURL»");
+				} else {
+					«dataInterchange.getDefaultVariableName».setFileURL(properties.getProperty("«dataInterchange.name»-«direction.toLowerCase()»"));
+				}
+			} catch (IOException e) {
+				StringWriter sw = new StringWriter();
+				e.printStackTrace(new PrintWriter(sw));
+				log.error("{}", sw.toString());
+				return;
+			}
+		} else {
+			«dataInterchange.getDefaultVariableName».setFileURL("«fileURL»");
+		}
+    	'''
+    }
+
 	
 	/**
 	 * <p>build the constructor for each class.</p> 
@@ -606,8 +615,6 @@
 		type.members += field
 		field = dataInterchange.toField("em", _typeReferenceBuilder.typeRef(EntityManager))
 		type.members += field
-		field = dataInterchange.toField("fileURL", _typeReferenceBuilder.typeRef(URL))
-		type.members += field
 		field = dataInterchange.toField("file", _typeReferenceBuilder.typeRef(OutputStream))
 		type.members += field
 		field = dataInterchange.toField("out", _typeReferenceBuilder.typeRef(OutputStream))
@@ -640,52 +647,9 @@
    			parameters += dataInterchange.toParameter("direction", _typeReferenceBuilder.typeRef(WorkerThreadRunnable.Direction))
    			body = [ append('''«dataInterchange.init»''')]
    		])
-   		type.members += dataInterchange.toMethod("setFileURL", _typeReferenceBuilder.typeRef(Void::TYPE), [
-   			parameters += dataInterchange.toParameter("filePath", _typeReferenceBuilder.typeRef(String))
-   			body = [ append('''«dataInterchange.fileUrl»''')]
-   		])
-   		type.members += dataInterchange.toMethod("getFileURL", _typeReferenceBuilder.typeRef(URL), [
-   			body = [ append('''«dataInterchange.getfileUrl»''')]
-   		])
 	}
 	
 	/**
-	 * Give the fileURL back
-	 */
-	def getfileUrl(DataInterchange interchange){
-		'''return this.fileURL;'''
-	}
-
-	/**
-	 * <p>create URL from filepath or other string.</p> 
-	 *
-	 * @param pkg
-	 *            the current datainterchange inferred {@link DataInterchange}
-	 * @return code fragment
-	 */
-	def fileUrl(DataInterchange dataInterchange)
-		'''
-		fileURL = null;
-		String path = filePath;
-		if	(filePath.startsWith("file://") && org.eclipse.osbp.utils.common.SystemInformation.isWindowsOS()) {
-			path = filePath.substring("file://".length());
-		}
-		try {
-			fileURL = new URL(path);
-		} catch (MalformedURLException e1) {
-			if(e1.getMessage().startsWith("unknown protocol") || e1.getMessage().startsWith("no protocol")) {
-				try {
-					fileURL = Paths.get(path).toUri().toURL();
-				} catch (MalformedURLException e2) {
-					StringWriter sw = new StringWriter();
-					e2.printStackTrace(new PrintWriter(sw));
-					log.error("{}", sw.toString());
-				}
-			}
-		}
-		'''
-
-	/**
 	 * init factory to create the core import process.
 	 * setup listeners for UI communication.
 	 * setup persistence layer.
@@ -707,7 +671,6 @@
 			transformer.setOutputProperty(OutputKeys.MEDIA_TYPE, "text/xml");
 			
 			// init
-			setProgressBarEnabled(true);
 			setProgressIndeterminated(true);
 			if (log.isDebugEnabled()) log.debug("initializing datainterchange factory");
 			// get entity manager
@@ -738,7 +701,8 @@
 			file = null;
 			URI uri = null;
 			try {
-				uri = fileURL.toURI();
+				uri = getFileURL().toURI();
+				uri = new URI(uri.toString()+"tmp");
 			} catch (URISyntaxException e) {
 				StringWriter sw = new StringWriter();
 				e.printStackTrace(new PrintWriter(sw));
@@ -746,20 +710,18 @@
 				return false;
 			}
 			do {
-				exportPath = null;
-				exportPath = Paths.get(uri);
 				try {
+					exportPath = Paths.get(uri);
 					// find a unique name - similar to given
 					file = Files.newOutputStream(exportPath, StandardOpenOption.CREATE_NEW);
 				} catch (FileAlreadyExistsException ae) {
 					openTry ++;
 					try {
-						uri = fileURL.toURI();
-						int pos = uri.getPath().lastIndexOf('.');
+						int pos = uri.toString().lastIndexOf('.');
 						if(pos == -1) {
-							uri = new URI(uri.getScheme()+":"+uri.getPath()+openTry);
+							uri = new URI(uri.toString()+openTry);
 						} else {
-							uri = new URI(uri.getScheme()+":"+uri.getPath().substring(0,pos)+openTry+"."+uri.getPath().substring(pos+1));
+							uri = new URI(uri.toString().substring(0,pos)+openTry+"."+uri.toString().substring(pos+1));
 						}
 					} catch (URISyntaxException e) {
 						StringWriter sw = new StringWriter();
@@ -774,6 +736,7 @@
 					return false;
 				}
 			}while(file == null);
+			log.debug("export temporary file ["+exportPath+"] created" );
 			out = new BufferedOutputStream(file);
 		}
 		return true;
@@ -792,8 +755,8 @@
 	 */
 	def String performInterchange(DataInterchange dataInterchange) {
 		var firstEntityBean = (dataInterchange.path.iterator.next as DataInterchangeBean)
-		firstEntityBean.hasBlobMapping = firstEntityBean.mappings.filter(DataInterchangeBlobMapping).size > 0
 		var body = '''
+		if (log.isDebugEnabled()) log.debug("{} - START - Task execution on [{}] ...", Thread.currentThread().getName().toUpperCase(), getFileURL().getPath().substring(1));
 		if(!init(getDirection())) {
 			return;
 		}
@@ -826,158 +789,43 @@
 		// import beans as list if no mark latest, other wise as a single bean
 		body = '''
 		«body»
+				«IF dataInterchange.mode!=EntityManagerMode.PERSIST || firstEntityBean.hasBlob || firstEntityBean.isMarkLatestImport»
 				Object result = null;
+				«ENDIF»
 				if (log.isDebugEnabled()) log.debug("filtering starts");
-				setProgressIndeterminated(false);
-				InputStream contents = dataInterchange.openStream(fileURL);
+				InputStream contents = dataInterchange.openStream(getFileURL());
 				setLength(contents.available());
 				setAvgElementSize(«IF dataInterchange.elementSize==0»10«ELSE»«dataInterchange.elementSize»«ENDIF»);
+				«IF dataInterchange.mode==EntityManagerMode.PERSIST && !firstEntityBean.hasBlob && !firstEntityBean.isMarkLatestImport»
+				em.getTransaction().begin();
+				dataInterchange.importSource(contents, null«IF dataInterchange.fileEndpoint.encoding !== null», "«dataInterchange.fileEndpoint.encoding»"«ENDIF»);
+				em.getTransaction().commit();
+				«ELSE»
 				result = dataInterchange.importSource(contents, "«firstEntityBean.entity.name»«IF !firstEntityBean.isMarkLatestImport»List«ENDIF»"«IF dataInterchange.fileEndpoint.encoding !== null», "«dataInterchange.fileEndpoint.encoding»"«ENDIF»);
+				«ENDIF»
 				if (log.isDebugEnabled()) log.debug("filtering finished");
-				em.clear();		// detach eventually attached objects
 		'''
 
 		if (!firstEntityBean.isMarkLatestImport) {
-			body = '''
-		«body»
-				if(result != null) {
-					List<«firstEntityBean.entity.fullyQualifiedName»> «firstEntityBean.entity.name.toFirstLower»List = Arrays.asList((«firstEntityBean.entity.fullyQualifiedName»[]) result);
-					em.getTransaction().begin();
-					if (log.isDebugEnabled()) log.debug("persisting results");
-					int total = «firstEntityBean.entity.name.toFirstLower»List.size();
-					int count = 0;
-					long lastStep = System.currentTimeMillis();
-					if	(importListener != null) {
-						importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
-					}
-					for(«firstEntityBean.entity.fullyQualifiedName» «firstEntityBean.entity.name.toFirstLower»:«firstEntityBean.entity.name.toFirstLower»List) {
-			'''
-			if(firstEntityBean.hasBlobMapping && dataInterchange.mode!=EntityManagerMode.REMOVE){
-				for(mapping:firstEntityBean.mappings){
-					if(mapping instanceof DataInterchangeBlobMapping){
-						var m = (mapping as DataInterchangeBlobMapping)
-						var blobFileName = '''«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»()«IF m.blobFileExtension !== null» + ".«m.blobFileExtension»"«ENDIF»'''
-						body = '''
-		«body»
-						try (InputStream inputStream = new BufferedInputStream(
-							«IF m.blobPath === null»
-								this.getClass().getClassLoader().getResourceAsStream("/«firstEntityBean.entity.name»/" + «blobFileName»)
-							«ELSE»
-								new FileInputStream("«m.blobPath»/" + «blobFileName»)«ENDIF»)) {
-							String «firstEntityBean.entity.name.toFirstLower»_«m.property.name»Id = getBlobService().createBlobMapping(
-								inputStream,
-								«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»(),
-								"«m.mimeType»"
-							);
-			                «firstEntityBean.entity.name.toFirstLower».set«m.property.name.toFirstUpper»(«firstEntityBean.entity.name.toFirstLower»_«m.property.name»Id);
-						} catch (IOException e) {
-							log.error(e.getLocalizedMessage());
-						}
-		'''
-					}
-				}
+			if(dataInterchange.mode!=EntityManagerMode.PERSIST || firstEntityBean.hasBlob) {
+				body = '''«body»«dataInterchange.persistPart1(firstEntityBean)»'''
+				body = '''«body»«dataInterchange.createBlob(firstEntityBean)»'''
+				body = '''«body»«dataInterchange.persistPart2(firstEntityBean)»''' 
 			}
-			body = 
-			'''
-			«body»
-							try {
-								«IF dataInterchange.mode==EntityManagerMode.PERSIST»em.persist(«firstEntityBean.entity.name.toFirstLower»);
-								«ELSEIF dataInterchange.mode==EntityManagerMode.MERGE»em.merge(«firstEntityBean.entity.name.toFirstLower»);
-								«ELSEIF dataInterchange.mode==EntityManagerMode.REMOVE»«firstEntityBean.entity.fullyQualifiedName» toBeRemoved = em.merge(«firstEntityBean.entity.name.toFirstLower»);
-								em.remove(toBeRemoved);«ENDIF»
-							}
-							catch (ConstraintViolationException cve) {
-								log.error("«firstEntityBean.entity.name.toFirstLower» #"+(count+1)+"/"+total+": "+cve.getLocalizedMessage());
-								for	(ConstraintViolation<?> violation : cve.getConstraintViolations()) {
-									Object value = violation.getInvalidValue();
-									if	(value == null) {
-										value = "<null>";
-									}
-									log.error("- property:"
-										+violation.getLeafBean().toString()+"."+violation.getPropertyPath().toString()
-										+" value:'"+value.toString()
-										+" violation:"+violation.getMessage());
-								}
-							}
-							count++;
-							long thisStep = System.currentTimeMillis();
-							if	((importListener != null) && ((count % importListener.getInitializationSubStepNotifySize() == 0) || (thisStep-lastStep > 2500))) {
-								lastStep = System.currentTimeMillis();
-								importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
-							}
-						}
-						if	(importListener != null) {
-							importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
-						}
-						if (log.isDebugEnabled()) log.debug("committing results");
-						
-						em.getTransaction().commit();
-			'''
-		} else {
-			body = '''
-			«body»
-					if(result != null) {
-						«firstEntityBean.entity.fullyQualifiedName» «firstEntityBean.entity.name.toFirstLower» = («firstEntityBean.entity.fullyQualifiedName») result;
-						«firstEntityBean.entity.name.toFirstLower».set«firstEntityBean.latestProperty.name.toFirstUpper»(true);
-			'''
-			if(firstEntityBean.hasBlobMapping && dataInterchange.mode!=EntityManagerMode.REMOVE){
-				for(mapping:firstEntityBean.mappings){
-					if(mapping instanceof DataInterchangeBlobMapping){
-						var m = (mapping as DataInterchangeBlobMapping)
-						var blobFileName = '''«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»()«IF m.blobFileExtension !== null» + "." + "«m.blobFileExtension»"«ENDIF»'''
-						body = '''
-			«body»
-						try (InputStream inputStream = new BufferedInputStream(
-							«IF m.blobPath === null»
-								this.getClass().getClassLoader().getResourceAsStream("/«firstEntityBean.entity.name»/" + «blobFileName»)
-							«ELSE»
-								new FileInputStream("«m.blobPath»/" + «blobFileName»)«ENDIF»)) {
-							String «m.property.name.toFirstLower»Id = blobUpload.createBlobMapping(
-								inputStream,
-								«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»(),
-								"«m.mimeType»",
-								blobAPI
-							);
-			                «firstEntityBean.entity.name.toFirstLower».set«m.property.name.toFirstUpper»(«m.property.name.toFirstLower»Id);
-						} catch (IOException e) {
-							log.error(e.getLocalizedMessage());
-						}
-						'''
-					}
-				}
-			}
-			body = '''
-			«body»
-						em.getTransaction().begin();
-						if (log.isDebugEnabled()) log.debug("storing results");
-						«IF dataInterchange.mode==EntityManagerMode.PERSIST»em.persist(«firstEntityBean.entity.name.toFirstLower»);
-						«ELSEIF dataInterchange.mode==EntityManagerMode.MERGE»em.merge(«firstEntityBean.entity.name.toFirstLower»);
-						«ELSEIF dataInterchange.mode==EntityManagerMode.REMOVE»«firstEntityBean.entity.fullyQualifiedName» toBeRemoved = em.merge(«firstEntityBean.entity.name.toFirstLower»);
-						em.remove(toBeRemoved);«ENDIF»
-						if (log.isDebugEnabled()) log.debug("committing results");
-						em.getTransaction().commit();
-			'''
 		}
 		if (firstEntityBean.isMarkLatestImport) {
 			body = '''
 			«body»
-						if (log.isDebugEnabled()) log.debug("mark results as latest import");
-						em.setProperty(QueryHints.PESSIMISTIC_LOCK, PessimisticLock.Lock);
-						em.getTransaction().begin();
-						em.createQuery("update «firstEntityBean.entity.name» set «firstEntityBean.latestProperty.name» = 0").executeUpdate();
-						em.createQuery("update «firstEntityBean.entity.name» set «firstEntityBean.latestProperty.name» = 1 where id= :id").setParameter("id", «firstEntityBean.entity.name.toFirstLower».getId()).executeUpdate();
-						if (log.isDebugEnabled()) log.debug("committing mark");
-						em.getTransaction().commit();			
+					if(result != null) {
+						«firstEntityBean.entity.fullyQualifiedName» «firstEntityBean.entity.name.toFirstLower» = («firstEntityBean.entity.fullyQualifiedName») result;
 			'''
+			body = '''«body»«dataInterchange.createBlob(firstEntityBean)»'''
+			body = '''«body»«dataInterchange.persistPart3(firstEntityBean)»'''
 		}		
 		body = '''
 		«body»
-					if (log.isDebugEnabled()) log.debug("results persisted");
-				} else {
-					if (log.isDebugEnabled()) log.debug("no results found");
-				}
 				if(isDeleteFileAfterImport()){
-					deleteFile(Paths.get(getFileURL().getPath().substring(1))); // interchange file
+					deleteFile(Paths.get(getFileURL().getPath().substring(1)), "DeleteFileAfterImport -"); // interchange file
 				}
 		'''
 
@@ -994,24 +842,30 @@
 					Long count = em.createQuery(countQuery).getSingleResult();
 					CriteriaQuery<«root.entity.fullyQualifiedName»> criteriaQuery = criteriaBuilder.createQuery(«root.entity.fullyQualifiedName».class);
 					Root<«root.entity.fullyQualifiedName»> from = criteriaQuery.from(«root.entity.fullyQualifiedName».class);
-					«dataInterchange.buildJoins»
+«««					«dataInterchange.buildJoins»	// only needed without explicit cascading
 					CriteriaQuery<«root.entity.fullyQualifiedName»> select = criteriaQuery.multiselect(from);
 					«IF root.exportFilter !== null»
 					select«root.exportFilter.buildExportFilterWhereClause("from")»;
 					«ENDIF»
 					TypedQuery<«root.entity.fullyQualifiedName»> typedQuery = em.createQuery(select);
-					setProgressIndeterminated(false);
 					List<«root.entity.fullyQualifiedName»> allResults = typedQuery.getResultList();
 					if (log.isDebugEnabled()) log.debug("evaluate root entity count");
 					setLength(count*«IF dataInterchange.elementSize==0»10«ELSE»«dataInterchange.elementSize»«ENDIF»);
 					setAvgElementSize(1);
 					if (log.isDebugEnabled()) log.debug("root entity count is "+count.toString());
-					StringWriter writer = new StringWriter();
-					if(dataInterchange != null) {
-						dataInterchange.exportSource(allResults, writer);
+					if(count > 0) { 
+						StringWriter writer = new StringWriter();
+						if(dataInterchange != null) {
+							dataInterchange.exportSource(allResults, writer);
+						}
+						out.write(writer.toString().getBytes(«IF dataInterchange.fileEndpoint.encoding !== null»"«dataInterchange.fileEndpoint.encoding»"«ENDIF»));
+						String newname = exportPath.getFileName().toString();
+						renameFile(exportPath, newname.substring(0, newname.length()-3));
 					}
-					if(count > 0){ out.write(writer.toString().getBytes(«IF dataInterchange.fileEndpoint.encoding !== null»"«dataInterchange.fileEndpoint.encoding»"«ENDIF»));}
-					else{deleteFile(exportPath);}
+					else{
+						deleteFile(exportPath, "EXPORT - ");
+						log.info("created file ["+exportPath.getFileName()+"] has been deleted for having no data!");
+					}
 					«IF firstEntityBean.markLatestExport»
 					if(allResults != null && !allResults.isEmpty()){ 
 						CriteriaQuery cq = criteriaBuilder.createQuery();
@@ -1039,18 +893,24 @@
 			body = '''
 			«body»
 				if(getEventDispatcher() != null) {
-					EventDispatcherEvent «entity.name.toLowerCase»Event = new EventDispatcherEvent(EventDispatcherCommand.REFRESH, "«entity.fullyQualifiedName»", "«dataInterchange.fullyQualifiedName»");
+					EventDispatcherEvent «entity.name.toLowerCase»Event = new EventDispatcherEvent(null, EventDispatcherCommand.REFRESH, "«entity.fullyQualifiedName»", "«dataInterchange.fullyQualifiedName»");
 					getEventDispatcher().sendEvent(«entity.name.toLowerCase»Event);
 				}
 			'''
 		}
 		body = '''
 		«body»
-		} catch (DataInterchangeException | IllegalArgumentException | IOException e) {
+		} catch (RuntimeException | IOException e) {
 			StringWriter sw = new StringWriter();
 			e.printStackTrace(new PrintWriter(sw));
 			log.error(getDirection().name()+" Execution of «dataInterchange.name»: failed due to: {}", sw.toString());
 			setExecutionFailed(true);
+			Path filePath = Paths.get(getFileURL().getPath().substring(1));
+			«IF dataInterchange.isDeleteFileAfterImport»
+			if(Files.exists(filePath) && getDirection()==WorkerThreadRunnable.Direction.IMPORT) {
+				renameFile(filePath, "FAILEDIMPORT"+ getFormatter().format(new Date(System.currentTimeMillis())) + filePath.getFileName().toString()+ ".LOCKED");
+			}
+			«ENDIF»
 		} finally {
 			if(file != null) {
 				try {
@@ -1070,14 +930,133 @@
 			}
 			// remove progress bar
 			if(getEventDispatcher() != null) {
-				EventDispatcherEvent evnt = new EventDispatcherEvent(EventDispatcherCommand.FINISHED, getName(), "DataInterchangeWorkerThread");
+				EventDispatcherEvent evnt = new EventDispatcherEvent(null, EventDispatcherCommand.FINISHED, getName(), "DataInterchangeWorkerThread");
 				getEventDispatcher().sendEvent(evnt);
 			}
 			if (log.isDebugEnabled()) log.debug("datainterchange finished");
 		}
+		setProgressIndeterminated(false);
+		setExecutionDone(true);
+		if (log.isDebugEnabled()) log.debug("{} - END - Task execution on [{}].", Thread.currentThread().getName().toUpperCase(), getFileURL().getPath().substring(1));
 		'''
 		return body
 	}
+	
+	def createBlob(DataInterchange dataInterchange, DataInterchangeBean firstEntityBean) {
+		var body = ""
+		if(firstEntityBean.hasBlob && dataInterchange.mode!=EntityManagerMode.REMOVE){
+			for(mapping:firstEntityBean.mappings){
+				if(mapping instanceof DataInterchangeBlobMapping){
+					var m = (mapping as DataInterchangeBlobMapping)
+					var blobFileName = '''«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»()«IF m.blobFileExtension !== null» + ".«m.blobFileExtension»"«ENDIF»'''
+					body = '''		
+					
+									try (InputStream inputStream = new BufferedInputStream(
+										«IF m.blobPath === null»
+											this.getClass().getClassLoader().getResourceAsStream("/«firstEntityBean.entity.name»/" + «blobFileName»)
+										«ELSE»
+											new FileInputStream("«m.blobPath»/" + «blobFileName»)«ENDIF»)) {
+										String «firstEntityBean.entity.name.toFirstLower»_«m.property.name»Id = getBlobService().createBlobMapping(
+											inputStream,
+											«firstEntityBean.entity.name.toFirstLower».get«m.property.name.toFirstUpper»(),
+											"«m.mimeType»"
+										);
+										«firstEntityBean.entity.name.toFirstLower».set«m.property.name.toFirstUpper»(«firstEntityBean.entity.name.toFirstLower»_«m.property.name»Id);
+									} catch (IOException e) {
+										log.error(e.getLocalizedMessage());
+									}
+					'''
+				}
+			}
+		}
+		return body
+	}
+	
+	protected def boolean hasBlob(DataInterchangeBean path) {
+		for(mapping : path.mappings) {
+			if(mapping instanceof DataInterchangeBlobMapping) {
+				return true
+			}
+		}
+	}
+
+	def persistPart1(DataInterchange dataInterchange, DataInterchangeBean firstEntityBean) 
+		'''	
+		
+				em.clear();		// detach eventually attached objects
+				if(result != null) {
+					List<«firstEntityBean.entity.fullyQualifiedName»> «firstEntityBean.entity.name.toFirstLower»List = Arrays.asList((«firstEntityBean.entity.fullyQualifiedName»[]) result);
+					em.getTransaction().begin();
+					if (log.isDebugEnabled()) log.debug("persisting results");
+					int total = «firstEntityBean.entity.name.toFirstLower»List.size();
+					int count = 0;
+					long lastStep = System.currentTimeMillis();
+					if	(importListener != null) {
+						importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
+					}
+					for(«firstEntityBean.entity.fullyQualifiedName» «firstEntityBean.entity.name.toFirstLower»:«firstEntityBean.entity.name.toFirstLower»List) {
+		'''
+
+	def persistPart2(DataInterchange dataInterchange, DataInterchangeBean firstEntityBean)
+		'''	
+		
+						try {
+							«IF dataInterchange.mode==EntityManagerMode.PERSIST»em.persist(«firstEntityBean.entity.name.toFirstLower»);
+							«ELSEIF dataInterchange.mode==EntityManagerMode.MERGE»em.merge(«firstEntityBean.entity.name.toFirstLower»);
+							«ELSEIF dataInterchange.mode==EntityManagerMode.REMOVE»«firstEntityBean.entity.fullyQualifiedName» toBeRemoved = em.merge(«firstEntityBean.entity.name.toFirstLower»);
+							em.remove(toBeRemoved);«ENDIF»
+						}
+						catch (ConstraintViolationException cve) {
+							log.error("«firstEntityBean.entity.name.toFirstLower» #"+(count+1)+"/"+total+": "+cve.getLocalizedMessage());
+							for	(ConstraintViolation<?> violation : cve.getConstraintViolations()) {
+								Object value = violation.getInvalidValue();
+								if	(value == null) {
+									value = "<null>";
+								}
+								log.error("- property:"
+									+violation.getLeafBean().toString()+"."+violation.getPropertyPath().toString()
+									+" value:'"+value.toString()
+									+" violation:"+violation.getMessage());
+							}
+						}
+						count++;
+						long thisStep = System.currentTimeMillis();
+						if	((importListener != null) && ((count % importListener.getInitializationSubStepNotifySize() == 0) || (thisStep-lastStep > 2500))) {
+							lastStep = System.currentTimeMillis();
+							importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
+						}
+					}
+					if	(importListener != null) {
+						importListener.notifyInitializationStep("datainterchange «dataInterchange.name.toFirstUpper»", 0.4, 0.5, count, total);
+					}
+					if (log.isDebugEnabled()) log.debug("committing results");
+					
+					em.getTransaction().commit();
+					if (log.isDebugEnabled()) log.debug("results persisted");
+				}
+		'''
+
+	def persistPart3(DataInterchange dataInterchange, DataInterchangeBean firstEntityBean) 
+		'''			
+		
+					em.getTransaction().begin();
+					if (log.isDebugEnabled()) log.debug("storing results");
+					«IF dataInterchange.mode==EntityManagerMode.PERSIST»em.persist(«firstEntityBean.entity.name.toFirstLower»);
+					«ELSEIF dataInterchange.mode==EntityManagerMode.MERGE»em.merge(«firstEntityBean.entity.name.toFirstLower»);
+					«ELSEIF dataInterchange.mode==EntityManagerMode.REMOVE»«firstEntityBean.entity.fullyQualifiedName» toBeRemoved = em.merge(«firstEntityBean.entity.name.toFirstLower»);
+					em.remove(toBeRemoved);«ENDIF»
+					if (log.isDebugEnabled()) log.debug("committing results");
+					em.getTransaction().commit();
+					if (log.isDebugEnabled()) log.debug("mark results as latest import");
+					em.setProperty(QueryHints.PESSIMISTIC_LOCK, PessimisticLock.Lock);
+					em.getTransaction().begin();
+					em.createQuery("update «firstEntityBean.entity.name» set «firstEntityBean.latestProperty.name» = 0").executeUpdate();
+					em.createQuery("update «firstEntityBean.entity.name» set «firstEntityBean.latestProperty.name» = 1 where id= :id").setParameter("id", «firstEntityBean.entity.name.toFirstLower».getId()).executeUpdate();
+					if (log.isDebugEnabled()) log.debug("committing mark");
+					em.getTransaction().commit();			
+					if (log.isDebugEnabled()) log.debug("results persisted");
+				}
+		'''
 
 	/**
 	 * handle the worker progress bar. provide the appropriate code.
@@ -1139,7 +1118,7 @@
 		return body
 	}
 	
-	def String buildSubCondition(DataInterchangeFilterCondition condition, String rootname){
+	def String buildSubCondition(DataInterchangeExportFilterCondition condition, String rootname){
 		var part1 = ""
 		
 		if(condition !== null && condition.getOperator !== null){
@@ -1229,4 +1208,26 @@
 		]
 		return output.toString
 	}
+	
+	
+	/**
+	* Gives the file path of a data interchange unit  without its file name.
+	*/
+	def String getDataInterchangeDirectoryUrlPath(DataInterchange  interchange){
+		return dg.getDataInterchangeDirectoryUrlPath(interchange)
+	}	
+	
+	/**
+	 * Returns the path of the given file name or directory name.  
+	  */
+	def IPath findProjectFileOrFolderLocation(String projectname, String fname, boolean isFile) {
+		return dg.findProjectFileOrFolderLocation(projectname, fname, isFile)
+	}
+	
+	    /**
+	 * Gives the file name of a data interchange unit.
+	 */
+	def String getDataInterchangeFileName(DataInterchange  interchange){
+		return dg.getDataInterchangeFileName(interchange)
+	}
 }
diff --git a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLModelGenerator.xtend b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLModelGenerator.xtend
index 1812528..ed986de 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLModelGenerator.xtend
+++ b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/jvmmodel/DataDSLModelGenerator.xtend
@@ -50,11 +50,11 @@
 import java.nio.file.Paths
 import java.nio.file.StandardOpenOption
 import java.text.MessageFormat
-import java.util.ArrayList
 import java.util.Arrays
 import java.util.Date
 import java.util.HashMap
 import java.util.List
+import java.util.Map
 import java.util.MissingResourceException
 import java.util.Properties
 import java.util.UUID
@@ -80,6 +80,8 @@
 import javax.xml.transform.stream.StreamSource
 import org.apache.commons.lang.StringEscapeUtils
 import org.apache.log4j.lf5.util.StreamUtils
+import org.eclipse.core.resources.ResourcesPlugin
+import org.eclipse.core.runtime.IPath
 import org.eclipse.e4.core.di.extensions.EventUtils
 import org.eclipse.e4.core.services.events.IEventBroker
 import org.eclipse.emf.common.util.EList
@@ -88,7 +90,6 @@
 import org.eclipse.emf.ecore.util.EcoreUtil
 import org.eclipse.osbp.blob.service.BlobService
 import org.eclipse.osbp.blob.service.BlobTypingAPI
-import org.eclipse.osbp.datainterchange.api.DataInterchangeException
 import org.eclipse.osbp.datainterchange.api.IDataInterchange
 import org.eclipse.osbp.dsl.entity.xtext.extensions.EntityTypesBuilder
 import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
@@ -97,12 +98,18 @@
 import org.eclipse.osbp.dsl.semantic.common.types.LDataType
 import org.eclipse.osbp.dsl.semantic.common.types.LFeature
 import org.eclipse.osbp.dsl.semantic.common.types.LReference
+import org.eclipse.osbp.dsl.semantic.entity.LBean
+import org.eclipse.osbp.dsl.semantic.entity.LBeanAttribute
 import org.eclipse.osbp.dsl.semantic.entity.LEntity
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
-import org.eclipse.osbp.dsl.semantic.entity.LEntityFeature
 import org.eclipse.osbp.dsl.semantic.entity.LEntityReference
 import org.eclipse.osbp.eventbroker.EventBrokerMsg
 import org.eclipse.osbp.preferences.ProductConfiguration
+import org.eclipse.osbp.runtime.common.annotations.CreateAt
+import org.eclipse.osbp.runtime.common.annotations.CreateBy
+import org.eclipse.osbp.runtime.common.annotations.Dirty
+import org.eclipse.osbp.runtime.common.annotations.UpdateAt
+import org.eclipse.osbp.runtime.common.annotations.UpdateBy
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent
 import org.eclipse.osbp.runtime.common.event.EventDispatcherEvent.EventDispatcherCommand
 import org.eclipse.osbp.ui.api.datamart.IDataMart.EType
@@ -113,12 +120,18 @@
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBean
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeBlobMapping
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeEntityExpression
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFile
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFixedColumnMapping
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFormat
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookup
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandProperty
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterOperandString
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangeMapping
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangePackage
 import org.eclipse.osbp.xtext.datainterchange.DataInterchangePredefinedExpression
@@ -132,7 +145,6 @@
 import org.eclipse.persistence.config.PessimisticLock
 import org.eclipse.persistence.config.QueryHints
 import org.eclipse.xtext.generator.IFileSystemAccess
-import org.eclipse.xtext.generator.IOutputConfigurationProvider
 import org.eclipse.xtext.naming.IQualifiedNameProvider
 import org.eclipse.xtext.naming.QualifiedName
 import org.eclipse.xtext.xbase.compiler.GeneratorConfig
@@ -148,17 +160,6 @@
 import org.w3c.dom.Document
 import org.w3c.dom.Element
 import org.xml.sax.SAXException
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportHide
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilter
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeGroup
-import org.eclipse.xtext.common.types.JvmAnnotationReference
-import org.eclipse.xtext.common.types.JvmGenericType
-import org.eclipse.osbp.runtime.common.annotations.CreateBy
-import org.eclipse.xtext.common.types.JvmAnnotationType
-import org.eclipse.osbp.runtime.common.annotations.Dirty
-import org.eclipse.osbp.runtime.common.annotations.UpdateAt
-import org.eclipse.osbp.runtime.common.annotations.UpdateBy
-import org.eclipse.osbp.runtime.common.annotations.CreateAt
 
 class ParameterValue {
 	var public HashMap<String,String> modifiers = <String,String>newHashMap() 
@@ -169,7 +170,6 @@
 	@Inject extension IQualifiedNameProvider
 	@Inject extension ModelExtensions
 	@Inject extension EntityTypesBuilder
-	@Inject extension IOutputConfigurationProvider outputConfig
 	@Inject extension BasicDslGeneratorUtils
 
 	@Inject
@@ -240,8 +240,25 @@
 	        	file.createNewFile
 			    val properties = new Properties();
 		        it.datInts.forEach[
-		        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.EXPORT.toString().toLowerCase()»'''.toString, it.getUrl)
-		        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.IMPORT.toString().toLowerCase()»'''.toString, it.getUrl)
+		        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.EXPORT.toString().toLowerCase()»'''.toString, it.produceAppropiateInterchangeURL)
+		        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.IMPORT.toString().toLowerCase()»'''.toString, it.produceAppropiateInterchangeURL)
+		        ]
+		        var fileOutput = new FileOutputStream(file);
+				properties.storeToXML(fileOutput, "dataInterchange file URLs");
+				fileOutput.close
+		    }
+		    else {
+		    	var fileInput = new FileInputStream(file);
+		    	val properties = new Properties();
+				properties.loadFromXML(fileInput)
+				fileInput.close
+		        it.datInts.forEach[
+		        	if(!properties.containsKey('''«it.name»-«WorkerThreadRunnable.Direction.EXPORT.toString().toLowerCase()»'''.toString)){
+			        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.EXPORT.toString().toLowerCase()»'''.toString, it.produceAppropiateInterchangeURL)		        		
+		        	}
+		        	if(!properties.containsKey('''«it.name»-«WorkerThreadRunnable.Direction.IMPORT.toString().toLowerCase()»'''.toString)){
+			        	properties.put('''«it.name»-«WorkerThreadRunnable.Direction.IMPORT.toString().toLowerCase()»'''.toString, it.produceAppropiateInterchangeURL)		        		
+		        	}
 		        ]
 		        var fileOutput = new FileOutputStream(file);
 				properties.storeToXML(fileOutput, "dataInterchange file URLs");
@@ -250,6 +267,105 @@
         ]
 	}
 	
+	/**
+	 * Generates the right file url for both absolute and relative paths.
+	 */
+	def String produceAppropiateInterchangeURL(DataInterchange interchange) {
+		var givenurl = interchange.fileURL
+		var filename = interchange.dataInterchangeFileName
+		var directory = interchange.getDataInterchangeDirectoryUrlPath
+
+		try {
+			var url = new URL(givenurl)	
+			if(url.protocol.equals("file")){
+				// for relative path 
+				if(!Paths.get(directory).absolute){
+					var projectname = interchange.eResource.URI.segment(1)
+					var location = findProjectFileOrFolderLocation(projectname, directory, false)
+					givenurl = location.append(filename).toString
+				}
+			}
+		}
+		catch (Exception e1) {
+			if(e1.getMessage().startsWith("unknown protocol") || e1.getMessage().startsWith("no protocol")) {
+				try{
+					// check for relative path
+					if(!Paths.get(directory).absolute){
+						var projectname = interchange.eResource.URI.segment(1)
+						var location = findProjectFileOrFolderLocation(projectname, directory, false)
+						givenurl = location.append(filename).toString
+					}
+				}
+				catch (Exception e2) {}
+			}
+		}
+		// if the path is absolute or from another protocol like http, ftp ...
+		return givenurl
+	}
+	
+	/**
+	 * Returns the path of the given file name or directory name.  
+	  */
+	def IPath findProjectFileOrFolderLocation(String projectname, String fname, boolean isFile) {
+		if(projectname !== null && !projectname.empty && fname !== null && !fname.empty){
+			var project = ResourcesPlugin.workspace.root.getProject(projectname);
+			if(isFile){
+				return project.getFile(fname).location
+			}
+			return project.getFolder(fname).location
+		}
+		return null
+	}
+	
+	
+	def String getFileURL(DataInterchange dataInterchange) {
+		switch(dataInterchange.fileEndpoint) {
+			DataInterchangeFileXML: return (dataInterchange.fileEndpoint as DataInterchangeFileXML).fileURL 
+			DataInterchangeFileCSV: return (dataInterchange.fileEndpoint as DataInterchangeFileCSV).fileURL 
+			DataInterchangeFileEDI: return (dataInterchange.fileEndpoint as DataInterchangeFileEDI).fileURL 
+			DataInterchangeFileFixed: return (dataInterchange.fileEndpoint as DataInterchangeFileFixed).fileURL 
+		}
+		return ""
+	}
+	
+	/**
+	* Gives the file path of a data interchange unit  without its file name.
+	*/
+	def String getDataInterchangeDirectoryUrlPath(DataInterchange  interchange){
+		var modelurl = ""
+		if(interchange !== null){
+			var index = interchange.fileURL.lastIndexOf("/")
+			if( index !== -1) {
+				modelurl = interchange.fileURL.substring(0, index + 1)
+			}else{
+				index = interchange.fileURL.lastIndexOf("\\")
+				if(index !== -1){
+					modelurl = interchange.fileURL.substring(0, index + 1)	
+				}						
+			}
+		}
+		return modelurl
+	}
+    
+    /**
+	 * Gives the file name of a data interchange unit.
+	 */
+	def String getDataInterchangeFileName(DataInterchange  interchange){
+		var filename = ""
+		if(interchange !== null){
+			var index = interchange.fileURL.lastIndexOf("/")
+			if( index !== -1) {
+				filename = interchange.fileURL.substring(index + 1, interchange.fileURL.length)
+			}else{
+				index = interchange.fileURL.lastIndexOf("\\")
+				if(index !== -1){
+					filename = interchange.fileURL.substring(index + 1, interchange.fileURL.length)	
+				}						
+			}
+		}
+		return filename
+	}
+	
 	def getUrl(DataInterchange di) {
 		switch(di.fileEndpoint) {
 			DataInterchangeFileXML:
@@ -258,6 +374,8 @@
 				return (di.fileEndpoint as DataInterchangeFileCSV).fileURL
 			DataInterchangeFileEDI:
 				return (di.fileEndpoint as DataInterchangeFileEDI).fileURL
+			DataInterchangeFileFixed:
+				return (di.fileEndpoint as DataInterchangeFileFixed).fileURL
 		}
 	}
 
@@ -301,6 +419,10 @@
 			}
 			DataInterchangeFileEDI: {
 			}
+			DataInterchangeFileFixed: {
+				cartridges.put("xmlns:ftl", "http://www.milyn.org/xsd/smooks/freemarker-1.1.xsd")
+				dataInterchange.generateExportConfig(document, dataInterchange.fileEndpoint, null, null)
+			}
 		}
 		for(cdg:cartridges.keySet) {
 			document.documentElement.setAttributeNS("http://www.w3.org/2000/xmlns/", cdg, cartridges.get(cdg))			
@@ -320,7 +442,7 @@
         var domImpl = db.DOMImplementation
         var document = domImpl.createDocument("http://www.milyn.org/xsd/smooks-1.1.xsd", "smooks-resource-list", null)
 	
-		var fieldList = <LEntityFeature>newArrayList()
+		var fieldList = <LFeature>newArrayList()
 		var cartridges = <String,String>newHashMap()
 		var parameters = <String,ParameterValue>newHashMap()
 		// for the meaning of cartridges see: http://www.smooks.org/mediawiki/index.php?title=V1.5:Smooks_v1.5_User_Guidecartridges  
@@ -374,6 +496,18 @@
 				dataInterchange.generateImportConfig(fieldList, document, dataInterchange.fileEndpoint)
 				(dataInterchange.fileEndpoint as DataInterchangeFileEDI).input(dataInterchange, document)
 			}
+			DataInterchangeFileFixed: {
+				cartridges.put("xmlns:fl", "http://www.milyn.org/xsd/smooks/fixed-length-1.3.xsd")
+				pval = new ParameterValue
+				pval.value = "input.txt"
+				parameters.put("inputType", pval) 
+				pval = new ParameterValue
+				pval.value = (dataInterchange.fileEndpoint as DataInterchangeFileFixed).fileURL
+				pval.modifiers.put("type", "input.type.actived")
+				parameters.put("input.txt", pval)
+				dataInterchange.generateImportConfig(fieldList, document, dataInterchange.fileEndpoint)
+				(dataInterchange.fileEndpoint as DataInterchangeFileFixed).input(dataInterchange, fieldList, document)
+			}
 		}
 		for(cdg:cartridges.keySet) {
 			document.documentElement.setAttributeNS("http://www.w3.org/2000/xmlns/", cdg, cartridges.get(cdg))			
@@ -404,35 +538,46 @@
 	def input(DataInterchangeFileXML xml, DataInterchange interchange, Document doc) {
 	}
 	
-	def input(DataInterchangeFileCSV csv, DataInterchange interchange, List<LEntityFeature> fieldList, Document doc) {
+	def input(DataInterchangeFileCSV csv, DataInterchange interchange, List<LFeature> fieldList, Document doc) {
 		var reader = doc.createElement("csv:reader")
 		var fields = doc.createAttribute("fields")
 		var fldList = <String>newArrayList
 		var mappingInterchanges = interchange.path.filter[it.hasAttributeMapping]
 		var lookupInterchanges = interchange.path.filter[it.hasReferenceLookup]
-		for(f:fieldList) {
-			if(f instanceof LEntityAttribute){
-				if(mappingInterchanges.length > 0){
-					for(mi:mappingInterchanges){
-						for(mapping:mi.mappings){
-							if(!fldList.contains(mapping.data) && f.name.equals(mapping.data)){
+		if(mappingInterchanges.empty){
+			for(f:fieldList) {
+				if(f instanceof LEntityAttribute || f instanceof LBeanAttribute){
+					fldList.add(f.toName)
+				}else if(f instanceof LEntityReference && lookupInterchanges.length > 0){
+					//add reference only if they are specified by lookup
+					for(li:lookupInterchanges){
+						for(lup:li.lookup){
+							if(!fldList.contains(lup.dataMap) && f.name.equals(lup.dataMap)){
 								fldList.add(f.toName)
 							}
 						}
 					}
-				}else{
-					fldList.add(f.toName)
 				}
-			}else if(f instanceof LEntityReference && lookupInterchanges.length > 0){
-				//add reference only if they are specified by lookup
-				for(li:lookupInterchanges){
-					for(lup:li.lookup){
-						if(!fldList.contains(lup.dataMap) && f.name.equals(lup.dataMap)){
-							fldList.add(f.toName)
+			}
+			// do the references
+			for(li:lookupInterchanges){
+				for(lup:li.lookup){
+					for(f:fieldList) {
+						if(f instanceof LEntityReference && f.name.equals(lup.dataMap)){
+							//add reference only if they are specified by lookup
+							if(!fldList.contains(lup.dataMap)){
+								fldList.add(f.toName)
+							}
 						}
 					}
 				}
 			}
+		} else {
+			for(mi:mappingInterchanges){
+				for(mapping:mi.mappings){
+					fldList.add(mapping.data)
+				}
+			}
 		}
 
 		fields.textContent = fldList.join(",")
@@ -474,6 +619,61 @@
 		doc.documentElement.appendChild(reader)
 	}
 
+	def input(DataInterchangeFileFixed fixed, DataInterchange interchange, List<LFeature> fieldList, Document doc) {
+		var reader = doc.createElement("fl:reader")
+		var fields = doc.createAttribute("fields")
+		var fldList = <String>newArrayList
+		var iter = interchange.path.iterator
+		if(iter.hasNext) {
+			var path = iter.next
+			for(map:path.mappings) {
+				var column = map as DataInterchangeFixedColumnMapping
+				fldList.add(column.createFixedLengthField)
+			}
+			fields.textContent = fldList.join(",")
+			reader.attributeNode = fields
+		}
+		doc.documentElement.appendChild(reader)
+	}
+	
+	def String createFixedLengthField(DataInterchangeFixedColumnMapping f) {
+		var body = '''«f.property.toName»[«f.length»]'''
+		var isFirst = true
+		if(f.trim) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»trim'''
+			isFirst = false
+		}
+		if(f.leftTrim) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»left_trim'''
+			isFirst = false
+		}
+		if(f.rightTrim) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»right_trim'''
+			isFirst = false
+		}
+		if(f.upperCase) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»upper_case'''
+			isFirst = false
+		}
+		if(f.lowerCase) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»lower_case'''
+			isFirst = false
+		}
+		if(f.capFirst) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»cap_first'''
+			isFirst = false
+		}
+		if(f.uncapFirst) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»uncap_first'''
+			isFirst = false
+		}
+		if(f.capitalize) {
+			body = '''«body»«IF isFirst»?«ELSE».«ENDIF»capitalize'''
+			isFirst = false
+		}
+		return body
+	}
+
 	def createFreemarker(Document doc, String templateString, DataInterchangeFile endPoint) {
 		var freemarker = doc.createElement("ftl:freemarker")
 		var apply = doc.createAttribute("applyOnElement")
@@ -509,8 +709,14 @@
 		var Element value = null
 		// try to find a value element, or create a new one
 		var node = parent.firstChild
-		while(node !== null && (!node.nodeName.equals("jb:value") || (node.attributes.getNamedItem("property") !== null && !node.attributes.getNamedItem("property").nodeValue.equals(propertyName)))) {
-			node = node.nextSibling
+		var done = false
+		while(node !== null && (!node.nodeName.equals("jb:value") || (node.attributes.getNamedItem("property") !== null) && !done)) { /* && !node.attributes.getNamedItem("property").nodeValue.equals(propertyName)))) {*/
+			var nval = node.attributes.getNamedItem("property")?.nodeValue
+			if(propertyName.equals(nval)) {
+				done = true
+			} else {
+				node = node.nextSibling
+			}
 		}
 		if(node === null) {
 			value = doc.createElement("jb:value")
@@ -558,8 +764,8 @@
 		value.attributeNode = data
 	}
 	
-	def Element createDecodeParam(Document doc, Element parent, String paramName, String paramValue) {
-		var param = doc.createElement("jb:decodeParam")
+	def Element createDecodeParam(String prefix, Document doc, Element parent, String paramName, String paramValue) {
+		var param = doc.createElement(prefix+":decodeParam")
 		parent.appendChild(param)
 		var name = doc.createAttribute("name")
 		name.textContent = paramName
@@ -599,7 +805,7 @@
 		return expression
 	}
 
-	def Element createDaoLocator(Document doc, Element parent, String beanIdName, String elementMap, boolean allowNoResult, boolean allowNonuniqueResult) {
+	def Element createDaoLocator(Document doc, Element parent, String beanIdName, String elementMap, boolean allowNoResult) {
 		var locator = doc.createElement("dao:locator")
 		if (parent === null) {
 			doc.documentElement.appendChild(locator)
@@ -622,7 +828,7 @@
 			locator.attributeNode = onNoResult
 		}
 		var uniqueResult = doc.createAttribute("uniqueResult")
-		uniqueResult.textContent = (!allowNonuniqueResult).booleanValue.toString
+		uniqueResult.textContent = "true"
 		locator.attributeNode = uniqueResult
 		return locator
 	}
@@ -658,6 +864,7 @@
 			paramContent = "Integer"
 		}
 		decoder.textContent = paramContent
+		
 		daoValue.attributeNode = decoder
 		// mapping given?
 		if(dataMap !== null) {
@@ -665,14 +872,28 @@
 			data.textContent = '''«elementMap»/«IF byAttribute»@«ENDIF»«dataMap»'''
 			daoValue.attributeNode = data
 		}
-		return daoParams
+		return daoValue
+	}
+	
+	def Element createDaoInserter(Document doc, String beanIdName, String elementMap) {
+		var inserter = doc.createElement("dao:inserter")
+		doc.documentElement.appendChild(inserter)
+		var beanId = doc.createAttribute("beanId")
+		beanId.textContent = beanIdName
+		inserter.attributeNode = beanId
+		if(elementMap !== null) {
+			var create = doc.createAttribute("insertOnElement")
+			create.textContent = elementMap
+			inserter.attributeNode = create
+		}
+		return inserter
 	}
 	
 	def generateExportConfig(DataInterchange dataInterchange, Document doc, DataInterchangeFile endPoint, String delimiter, String quote) {
 		var substitutionMap = <String,String>newHashMap
 		var vectorMap = <String,String>newHashMap
 		var substitutionCount = 0
-		var fieldList = <LEntityFeature>newArrayList 
+		var fieldList = <LFeature>newArrayList 
 		var String rootEntityName = null
 		var Document ftlDocument = null
 		var Element bean = null
@@ -682,9 +903,6 @@
 		var LEntity previousEntity = null
 		// iterate through all path (bean) listed under `path` keyword 
 		for(path : dataInterchange.path) {
-			// are there any mappings?
-			var mappingFound = hasAttributeMapping(path)
-
 			if (rootEntityName === null && !path.isMarkLatestImport) {
 				rootEntityName = (path.entity as LAnnotationTarget).toName.toString
 			}
@@ -707,36 +925,12 @@
 				previousEntity = path.entity
 			}
 
-			for (f : path.entity.allFeatures) {
-				if(f instanceof LAttribute && !f.toMany && 
-					path.getExportFilter !== null && 
-					path.getExportFilter.hiddenproperties !== null && 
-					!path.getExportFilter.hiddenproperties.empty &&
-					!path.getExportFilter.hiddenproperties.toList.containsFeature(f)) {
-					if (!isInternal(f) &&				// don't export version
-						!path.isMarkLatestImport &&
-						((!(f as LEntityAttribute).id && !(f as LEntityAttribute).uuid) || (path.lookupKeys.empty && dataInterchange.mode != EntityManagerMode.PERSIST)) &&
-						(!mappingFound || path.mappings.isMapped(f))) {
-						fieldList.add(f as LEntityAttribute)
-					}
-				}
-				if(f instanceof LReference && !f.toMany && path.lookupKeys.empty) {
-					fieldList.add(f as LEntityReference)
-				}
-				// if a feature is a 1-* reference, find if the referenced entity is also under this path.
-				if(f instanceof LReference && f.toMany && !path.isMarkLatestImport) {
-					var iter = dataInterchange.path.iterator
-					var next = iter.next
-					// find current entity
-					while (iter.hasNext && next.entity.toName != path.entity.toName) {
-						next = iter.next
-					} 
-					while (iter.hasNext) {
-						// move to next entity
-						next = iter.next
-						if (next !== null && next.entity.toName == (f.type as LEntity).toName) {
-							vectorMap.put(next.entity.toName, '''«path.entity.toName».«f.name»''')
-						}
+			for (f : path.entity.allAttributes) {
+				createExportAttribute(dataInterchange, path, f, fieldList, vectorMap)
+				if(f.type instanceof LBean) {
+					var beanAttr = (f as LEntityAttribute).type as LBean
+					for(ba : beanAttr.allAttributes) {
+						createExportAttribute(dataInterchange, path, ba, fieldList, vectorMap)
 					}
 				}
 			}			
@@ -747,6 +941,46 @@
 		if(endPoint instanceof DataInterchangeFileXML) {
 			createFreemarker(doc, createXmlTemplate(ftlDocument, substitutionMap, dataInterchange.path), endPoint)
 		}
+		if(endPoint instanceof DataInterchangeFileFixed) {
+			createFreemarker(doc, createFixedTemplate(rootEntityName, fieldList, dataInterchange.path), endPoint)
+		}
+	}
+	
+	def createExportAttribute(DataInterchange dataInterchange, DataInterchangeBean path, LFeature f, List<LFeature> fieldList, Map<String, String> vectorMap) {
+		if(path.getExportFilter === null && f instanceof LAttribute && !f.toMany || 
+			path.getExportFilter !== null && 
+			f instanceof LAttribute && !f.toMany &&
+			path.getExportFilter.hiddenproperties !== null && 
+			!path.getExportFilter.hiddenproperties.empty &&
+			!path.getExportFilter.hiddenproperties.toList.containsFeature(f)) {
+			if(useFeature(f, path, dataInterchange)) {
+				fieldList.add(f)
+			}
+		}
+		if(f instanceof LReference && !f.toMany && path.lookupKeys.empty) {
+			fieldList.add(f as LEntityReference)
+		}
+		// if a feature is a 1-* reference, find if the referenced entity is also under this path.
+		if(f instanceof LReference && f.toMany && !path.isMarkLatestImport) {
+			var iter = dataInterchange.path.iterator
+			var next = iter.next
+			// find current entity
+			while (iter.hasNext && next.entity.toName != path.entity.toName) {
+				next = iter.next
+			} 
+			while (iter.hasNext) {
+				// move to next entity
+				next = iter.next
+				if (next !== null && next.entity.toName == (f.type as LEntity).toName) {
+					if(next.refDataSource !== null){								
+						vectorMap.put(next.entity.toName, '''«path.entity.toName».«next.refDataSource.name»''')
+					}
+					else{
+						vectorMap.put(next.entity.toName, '''«path.entity.toName».«f.name»''')
+					}
+				}
+			}
+		}		
 	}
 	
 	def boolean hasRelation(LEntity root, LEntity entity) {
@@ -754,19 +988,22 @@
 		return !result.empty
 	}
 	
-	def generateImportConfig(DataInterchange dataInterchange, List<LEntityFeature> fieldList, Document doc, DataInterchangeFile endPoint) {
+	def generateImportConfig(DataInterchange dataInterchange, List<LFeature> fieldList, Document doc, DataInterchangeFile endPoint) {
 		var isFirst = true
-		var hasMarker = false
 		var autoMapping = ""
 		var byAttribute = false
-		if(endPoint instanceof DataInterchangeFileCSV) {
-			autoMapping = "/csv-set"
-		} else if(endPoint instanceof DataInterchangeFileXML) {
-			autoMapping = '''«IF dataInterchange.vectorName !== null»«dataInterchange.vectorName»«ELSE»vector«ENDIF»'''
-			byAttribute = endPoint.byAttribute 
+		var isMarked = false
+		switch(endPoint) {
+			DataInterchangeFileCSV:
+				autoMapping = "/csv-set"
+			DataInterchangeFileXML: {
+				autoMapping = '''«IF dataInterchange.vectorName !== null»«dataInterchange.vectorName»«ELSE»vector«ENDIF»'''
+				byAttribute = endPoint.byAttribute
+			}
+			DataInterchangeFileEDI: {} 
+			DataInterchangeFileFixed:
+				autoMapping = "/set"
 		}
-		var depth = 0
-		var oldMapping = ""
 		for(path : dataInterchange.path) {
 			var map = ""
 			if(path.elementMap === null) {
@@ -774,26 +1011,26 @@
 			} else {
 				map = path.elementMap
 			}
-			if(path.isMarkLatestImport) {
-				hasMarker = true
-			}
 			var Element bean = null
-			if(!path.isMarkLatestImport && !hasMarker && isFirst) {
+			if(!path.isMarkLatestImport && isFirst) {
 				var rootBean = createBean(doc, path.entity.toName+"List", path.entity.fullyQualifiedName.toString, map, true)
 				createWiring(doc, rootBean, path.entity.toName, null, null)
 				isFirst = false
+			} else {
+				isMarked = true
 			}
-			if(!path.isMarkLatestImport && endPoint instanceof DataInterchangeFileCSV) {
-				autoMapping = autoMapping + "/csv-record"
-			}
-
-			if(endPoint instanceof DataInterchangeFileXML) {
-				if(depth < 1) {
+			switch(endPoint) {
+				DataInterchangeFileCSV: {
+					if(!path.isMarkLatestImport) {
+						autoMapping = autoMapping + "/csv-record"
+					}
+				}
+				DataInterchangeFileXML: {
 					autoMapping = '''«autoMapping»/«IF path.nodeName !== null»«path.nodeName»«ELSE»«path.entity.toName»«ENDIF»'''
-					oldMapping = autoMapping
-					depth++
-				}else{
-					autoMapping = '''«oldMapping»/«IF path.nodeName !== null»«path.nodeName»«ELSE»«path.entity.toName»«ENDIF»'''
+				}
+				DataInterchangeFileEDI: {} 
+				DataInterchangeFileFixed: {
+					autoMapping = autoMapping + "/record"
 				}
 			}
 			if(path.elementMap === null) {
@@ -809,19 +1046,18 @@
 					if(path.entity.versionAttribute !== null) {
 						createExpression(doc, bean, path.entity.versionAttributeName, "?"+path.entity.toName+"Merger."+path.entity.versionAttributeName)
 					}
-					var locator = createDaoLocator(doc, null, path.entity.toName+"Merger", map, true, false)
+					var locator = createDaoLocator(doc, null, path.entity.toName+"Merger", map, true)
 					createDaoQuery(doc, locator, path.queryKeys)
-					var pCnt = 0
-					for(key:path.lookupKeys) {
-						createDaoParam(doc, locator, '''param«pCnt++»''', key.property.decoder, map, path.mappings.mapElement(key.property.name), byAttribute)
-					}
+					createLookupKeys(path, doc, locator, map, byAttribute, endPoint)
 				}
 				else if(path.entity.versionAttribute !== null) {
 					createExpression(doc, bean, path.entity.versionAttributeName, "?"+path.entity.toName+"Merger."+path.entity.versionAttributeName)
-					var locator = createDaoLocator(doc, null, path.entity.toName+"Merger", map, true, false)
+					var locator = createDaoLocator(doc, null, path.entity.toName+"Merger", map, true)
 					createDaoQuery(doc, locator, path.queryVersion)
 					createDaoParam(doc, locator, '''param''', path.entity.primaryKeyAttribute.decoder, map, path.entity.idAttributeName, byAttribute)
 				}
+			} else if(!isMarked && !path.hasBlob) {
+				createDaoInserter(doc, path.entity.toName, map)
 			}
 			// are there any mappings?
 			var mappingFound = hasAttributeMapping(path)
@@ -831,116 +1067,31 @@
 						if (!f.toMany) {
 							// enable mapping for this field
 							// if not disposed and not latest marker and not id except no lookup keys given and mode is not persist
-							if (!isInternal(f)
-								    &&
-									((!(f as LEntityAttribute).id && !(f as LEntityAttribute).uuid)
-								      ||
-									  (path.lookupKeys.empty && dataInterchange.mode != EntityManagerMode.PERSIST))
-									&& 
-									(!path.isMarkLatestImport  || !path.latestProperty.toName.equals(f.toName))
-								) {
+							if (!isInternal(f) && (!isId(f) || (path.lookupKeys.empty && dataInterchange.mode != EntityManagerMode.PERSIST))
+								&& (!path.isMarkLatestImport  || !path.latestProperty.toName.equals(f.toName))) {
 								// add to the level's field list
 								if (!path.isMarkLatestImport) {
-									fieldList.add(f as LEntityAttribute)
-								}
-								var expressionFound = false
-								// scan expressions for this field
-								for (expr : path.expression) {
-									switch(expr) {
-										DataInterchangeEntityExpression: {
-											// is there an entity expression for this attribute ?
-											if (f.toName.equals((expr as DataInterchangeEntityExpression).targetProperty.toName)) {
-												createExpression(doc, bean, f.toName, (expr as DataInterchangeEntityExpression).entity.toName+"."+(expr as DataInterchangeEntityExpression).property.toName)
-												expressionFound = true
-											}
+									if((f as LEntityAttribute).type instanceof LBean) {
+										var beanAttr = (f as LEntityAttribute).type as LBean
+										for(ba : beanAttr.allAttributes) {
+											fieldList.add(ba)
 										}
-										DataInterchangePredefinedExpression: {
-											// is there an predefined expression modeled for this attribute ?
-											if (f.toName.equals((expr as DataInterchangePredefinedExpression).targetProperty.toName)) {
-												if("UUID".equals((expr as DataInterchangePredefinedExpression).bean.literal)) {
-													createExpression(doc, bean, f.toName, "PUUID."+(expr as DataInterchangePredefinedExpression).beanType.getName)
-												} else {
-													createExpression(doc, bean, f.toName, "PTIME."+(expr as DataInterchangePredefinedExpression).bean.getName+(expr as DataInterchangePredefinedExpression).beanType.getName)
-												}
-												expressionFound = true
-											}
-										}
+									} else {
+										fieldList.add(f)
 									}
 								}
-								// scan formats for this field
-								var formatFound = false
-								for (format : path.format) {
-									// is there a format modeled for this attribute ?
-									if (f.toName.equals(format.targetProperty.toName)) {
-										var value = createProperty(doc, bean, f.toName, f.decoder, dtType.getBasicType(f as LEntityAttribute))
-										if(format.format !== null) {
-											createDecodeParam(doc, value, "format", format.format)
-
-											if (endPoint.locale !== null) {
-												createDecodeParam(doc, value, "locale-language", endPoint.locale.split("_").get(0))
-												if(endPoint.locale.split("_").size > 1) {
-													createDecodeParam(doc, value, "locale-country", endPoint.locale.split("_").get(1))
-												}
-											}
-
+								if(bean !== null) {
+									if((f as LEntityAttribute).type instanceof LBean) {
+										var beanAttr = (f as LEntityAttribute).type as LBean
+										var subBean = createBean(doc, beanAttr.toName, beanAttr.fullyQualifiedName.toString, map, false)
+										for(ba : beanAttr.allAttributes) {
+											createImportAttribute(path, ba, doc, subBean, byAttribute, endPoint, mappingFound)
 										}
-										formatFound = true
+										createWiring(doc, bean, beanAttr.toName, null, f.toSetter.simpleName)
+									} else {
+										createImportAttribute(path, f, doc, bean, byAttribute, endPoint, mappingFound)
 									}
 								}
-								// default for mapping purposes
-								if (!expressionFound && !formatFound) {
-									// create no property for unmapped marker entities
-									if (!(endPoint instanceof DataInterchangeFileCSV) || !path.isMarkLatestImport) {
-										// create no property if mapping is used and this attribute is unmapped
-										if(!mappingFound || path.mappings.isMapped(f)) {
-											var etype = dtType.getBasicType(f as LEntityAttribute)
-											
-											// add enum decoder
-											if(etype == EType.LENUM){
-												var value = createProperty(doc, bean, f.toName, "Enum", etype)
-												createDecodeParam(doc, value, "enumType", f.type.toQualifiedName.toString)
-												
-												var enumsliterals = f.type.eContents;
-												for(literal : enumsliterals){
-													val enumname = literal.fullyQualifiedName.lastSegment
-													// extra fileds
-													createDecodeParam(doc, value, enumsliterals.indexOf(literal).toString, enumname) 
-													// mandatory fields 
-													createDecodeParam(doc, value, enumname, enumname)
-												}
-											}
-											else{
-												// add format decoder
-												var value = createProperty(doc, bean, f.toName, f.decoder, etype) 
-												if (etype == EType.DATE) {
-													createDecodeParam(doc, value, "format", "yyyy-MM-dd'T'HH:mm:ss")
-												} else if((etype == EType.DOUBLE || etype == EType.FLOAT) && endPoint.locale !== null) {
-													createDecodeParam(doc, value, "format", "#.######")
-													if (endPoint.locale !== null) {
-														createDecodeParam(doc, value, "locale-language", endPoint.locale.split("_").get(0))
-														if(endPoint.locale.split("_").size > 1) {
-															createDecodeParam(doc, value, "locale-country", endPoint.locale.split("_").get(1))
-														}
-													}
-												}
-											}
-										}
-									}
-								}
-								// if mapping given
-								path.hasBlobMapping = false
-								for(mapping : path.mappings) {
-									if(f.name.equals(mapping.property.name)) {
-										addMapping(doc, bean, f.toName, mapping.data, byAttribute)
-										if(mapping instanceof DataInterchangeBlobMapping) {
-											path.hasBlobMapping = true
-										}
-									}
-								}
-								// default mapping for xml
-								if (!mappingFound && !path.isMarkLatestImport && endPoint instanceof DataInterchangeFileXML) {
-									addMapping(doc, bean, f.toName, f.toName, byAttribute)
-								}
 							}
 						}
 					}
@@ -970,7 +1121,6 @@
 								var etype = dtType.getBasicType(field)
 
 								for(mapping : path.mappings) {
-									// might be buggy for xml
 									if(f.name.equals(mapping.property.name)) {
 										createProperty(doc, bean, f.toName, field.decoder, etype)
 										addMapping(doc, bean, f.toName, mapping.data, byAttribute)
@@ -979,6 +1129,7 @@
 
 							} else {
 								// generate possible lookups for this many to one relationship
+								var paramCnt = 0
 								for (lookup : path.lookup) {
 									// entity and property must match
 									if (lookup.targetProperty.toName.equals((f as LReference).name)) {
@@ -987,9 +1138,26 @@
 											fieldList.add(f as LEntityReference)
 										}
 										createWiring(doc, bean, (f.type as LEntity).toName, (f as LReference).name, null)
-										var locator = createDaoLocator(doc, null, (f.type as LEntity).toName, lookup.elementMap, lookup.allowNoResult, lookup.allowNonuniqueResult)
-										createDaoQuery(doc, locator, (f.type as LEntity).query(lookup))
-										createDaoParam(doc, locator, "param", lookup.queryProperty.type.name.toFirstUpper, lookup.elementMap, lookup.dataMap, byAttribute)									
+										var locator = createDaoLocator(doc, null, (f.type as LEntity).toName, lookup.elementMap, lookup.allowNoResult)
+										createDaoQuery(doc, locator, (f.type as LEntity).query(lookup, paramCnt))
+										createDaoParam(doc, locator, '''param«paramCnt»''', lookup.queryProperty.type.name.toFirstUpper, lookup.elementMap, lookup.dataMap, byAttribute)
+										paramCnt ++
+										if(lookup.condition !== null && lookup.condition.operand instanceof DataInterchangeLookupFilterOperandProperty && !lookup.condition.operator.literal.startsWith("is")) {
+											var prop = (lookup.condition.operand as DataInterchangeLookupFilterOperandProperty).refProperty
+											for(mapping:path.mappings) {
+												if(mapping.property.equals(prop)) {
+													if(mapping.data === null) {
+														createDaoParam(doc, locator, '''param«paramCnt»''', prop.type.name.toFirstUpper, autoMapping, prop.toName, byAttribute)
+													} else {
+														createDaoParam(doc, locator, '''param«paramCnt»''', prop.type.name.toFirstUpper, mapping.data, prop.toName, byAttribute)
+													}
+													paramCnt ++
+												}
+											}
+										}
+										if(lookup.condition !== null && lookup.condition.subcondition !== null) {
+											lookup.condition.subcondition.iterateConditionParameter(doc, locator, path.mappings, autoMapping, paramCnt, byAttribute)
+										}									
 									}
 								}
 							}
@@ -997,19 +1165,167 @@
 					}
 				}
 			}
-			//for CSV file, if no mapping were found, simply map all attributes
-			if (!mappingFound && !path.isMarkLatestImport && endPoint instanceof DataInterchangeFileCSV) {
-				for(fld : fieldList) {
-					if(fld instanceof LEntityAttribute){
-						addMapping(doc, bean, fld.toName, fld.toName, byAttribute)
-					}
+		}
+	}
+	
+	def createImportAttribute(DataInterchangeBean path, LAttribute f, Document doc, Element parentElement, boolean byAttribute, DataInterchangeFile endPoint, boolean mappingFound) {
+		// scan expressions for this field
+		var expressionFound = path.createAttributeExpression(f, doc, parentElement)
+		// scan formats for this field
+		var formatFound = path.createAttributeFormat(f, doc, parentElement, endPoint)
+		// default for mapping purposes
+		if (!expressionFound && !formatFound) {
+			// create no property for unmapped marker entities
+			if (!(endPoint instanceof DataInterchangeFileCSV) || !path.isMarkLatestImport) {
+				// create no property if mapping is used and this attribute is unmapped
+				if(!mappingFound || path.mappings.isMapped(f)) {
+					path.createAttributeMapping(f as LAttribute, doc, parentElement, endPoint)
+				}
+			}
+		}
+		createAttributeMapping(path, f, doc, parentElement, byAttribute)
+		// default mapping for xml and csv
+		if (!mappingFound && !path.isMarkLatestImport && (endPoint instanceof DataInterchangeFileXML||endPoint instanceof DataInterchangeFileCSV)) {
+			addMapping(doc, parentElement, f.toName, f.toName, byAttribute)
+		}
+	}
+	
+	def boolean isId(LFeature f) {
+		if(f instanceof LEntityAttribute) {
+			return (f as LEntityAttribute).id || (f as LEntityAttribute).uuid
+		}
+		return false
+	}
+	
+	protected def boolean hasBlob(DataInterchangeBean path) {
+		for(mapping : path.mappings) {
+			if(mapping instanceof DataInterchangeBlobMapping) {
+				return true
+			}
+		}
+	}
+
+	protected def void createAttributeMapping(DataInterchangeBean path, LAttribute f, Document doc, Element parentElement, boolean byAttribute) {
+		for(mapping : path.mappings) {
+			if(f.name.equals(mapping.property.name)) {
+				if(mapping.data === null || mapping.data.empty) {
+					addMapping(doc, parentElement, f.toName, f.toName, byAttribute)
+				} else {
+					addMapping(doc, parentElement, f.toName, mapping.data, byAttribute)
 				}
 			}
 		}
 	}
 	
+	def createAttributeMapping(DataInterchangeBean path, LAttribute f, Document doc, Element parentElement, DataInterchangeFile endPoint) {
+		var etype = dtType.getBasicType(f)
+		// add enum decoder
+		if(etype == EType.LENUM){
+			var value = createProperty(doc, parentElement, f.toName, "Enum", etype)
+			createDecodeParam("jb", doc, value, "enumType", f.type.toQualifiedName.toString)
+			
+			var enumsliterals = f.type.eContents;
+			for(literal : enumsliterals){
+				val enumname = literal.fullyQualifiedName.lastSegment
+				// extra fileds
+				createDecodeParam("jb", doc, value, enumsliterals.indexOf(literal).toString, enumname) 
+				// mandatory fields 
+				createDecodeParam("jb", doc, value, enumname, enumname)
+			}
+		}
+		else{
+			// add format decoder
+			var Element value = null
+			value = createProperty(doc, parentElement, f.toName, f.decoder, etype)
+			createDefaultDecoderFormat("jb", doc, value, f, endPoint)
+		}
+	}
+	
+	protected def createDefaultDecoderFormat(String prefix, Document doc, Element parentElement, LAttribute f, DataInterchangeFile endPoint) {
+		var etype = dtType.getBasicType(f)
+		if (etype == EType.DATE) {
+			createDecodeParam(prefix, doc, parentElement, "format", "yyyy-MM-dd'T'HH:mm:ss")
+		} else if((etype == EType.DOUBLE || etype == EType.FLOAT) && endPoint.locale !== null) {
+			createDecodeParam(prefix, doc, parentElement, "format", "#.######")
+			if (endPoint.locale !== null) {
+				createDecodeParam(prefix, doc, parentElement, "locale-language", endPoint.locale.split("_").get(0))
+				if(endPoint.locale.split("_").size > 1) {
+					createDecodeParam(prefix, doc, parentElement, "locale-country", endPoint.locale.split("_").get(1))
+				}
+			}
+		}
+	}
+	
+	protected def boolean createAttributeFormat(DataInterchangeBean path, LAttribute f, Document doc, Element parentElement, DataInterchangeFile endPoint) {
+		var formatFound = false
+		for (format : path.format) {
+			// is there a format modeled for this attribute ?
+			if (f.toName.equals(format.targetProperty.toName)) {
+				var value = createProperty(doc, parentElement, f.toName, f.decoder, dtType.getBasicType(f))
+				if(format.format !== null) {
+					createDecodeParam("jb", doc, value, "format", format.format)
+			
+					if (endPoint.locale !== null) {
+						createDecodeParam("jb", doc, value, "locale-language", endPoint.locale.split("_").get(0))
+						if(endPoint.locale.split("_").size > 1) {
+							createDecodeParam("jb", doc, value, "locale-country", endPoint.locale.split("_").get(1))
+						}
+					}
+			
+				}
+				formatFound = true
+			}
+		}
+		return formatFound
+	}
+	
+	protected def boolean createAttributeExpression(DataInterchangeBean path, LAttribute f, Document doc, Element parentElement) {
+		var expressionFound = false
+		for (expr : path.expression) {
+			switch(expr) {
+				DataInterchangeEntityExpression: {
+					// is there an entity expression for this attribute ?
+					if (f.toName.equals((expr as DataInterchangeEntityExpression).targetProperty.toName)) {
+						createExpression(doc, parentElement, f.toName, (expr as DataInterchangeEntityExpression).entity.toName+"."+(expr as DataInterchangeEntityExpression).property.toName)
+						expressionFound = true
+					}
+				}
+				DataInterchangePredefinedExpression: {
+					// is there an predefined expression modeled for this attribute ?
+					if (f.toName.equals((expr as DataInterchangePredefinedExpression).targetProperty.toName)) {
+						if("UUID".equals((expr as DataInterchangePredefinedExpression).bean.literal)) {
+							createExpression(doc, parentElement, f.toName, "PUUID."+(expr as DataInterchangePredefinedExpression).beanType.getName)
+						} else {
+							createExpression(doc, parentElement, f.toName, "PTIME."+(expr as DataInterchangePredefinedExpression).bean.getName+(expr as DataInterchangePredefinedExpression).beanType.getName)
+						}
+						expressionFound = true
+					}
+				}
+			}
+		}
+		return expressionFound
+	}
+	
+	protected def void createLookupKeys(DataInterchangeBean path, Document doc, Element locator, String map, boolean byAttribute, DataInterchangeFile endPoint) {
+		var pCnt = 0
+		for(key:path.lookupKeys) {
+			if(key.property.eContainer.equals(path.entity)) {
+				var daoValue = createDaoParam(doc, locator, '''param«pCnt»''', key.property.decoder, map, path.mappings.mapElement(key.property.name), byAttribute)
+				createDefaultDecoderFormat("dao", doc, daoValue, key.property, endPoint)
+			} else {
+				for(lookup:path.lookup) {
+					if(lookup.queryProperty.equals(key.property)) {
+						var daoValue = createDaoParam(doc, locator, '''param«pCnt»''', key.property.decoder, map, lookup.elementMap.replace(map, "").replace("//", ""), byAttribute)
+						createDefaultDecoderFormat("dao", doc, daoValue, key.property, endPoint)
+					}
+				}
+			}
+			pCnt ++
+		}
+	}
+	
 	def boolean hasAnnotation(LFeature feature, Class<?> annotationType) {
-		for(anno:(feature as LEntityAttribute).annotationInfo.annotations) {
+		for(anno:(feature).annotationInfo.annotations) {
 			if (anno.annotation.annotationType.fullyQualifiedName.toString.equals(annotationType.name)) {
 				return true;
 			}
@@ -1021,11 +1337,13 @@
 		if("disposed".equals(f.toName)) {
 			return true
 		}
-		if((f as LEntityAttribute).version) {
-			return true
-		}
-		if(f.hasAnnotation(Dirty) || f.hasAnnotation(UpdateAt) || f.hasAnnotation(UpdateBy) || f.hasAnnotation(CreateAt) || f.hasAnnotation(CreateBy)) {
-			return true
+		if(f instanceof LEntityAttribute) {
+			if((f as LEntityAttribute).version) {
+				return true
+			}
+			if(f.hasAnnotation(Dirty) || f.hasAnnotation(UpdateAt) || f.hasAnnotation(UpdateBy) || f.hasAnnotation(CreateAt) || f.hasAnnotation(CreateBy)) {
+				return true
+			}
 		}
 		return false
 	}
@@ -1079,8 +1397,7 @@
 	}
 	
 	def Element createXmlBean(Document doc, Element parent, LEntity entity, EList<DataInterchangeFormat> formats, String currentKey, DataInterchangeBean path, DataInterchange dataInterchange) {
-		// are there any mappings?
-		var mappingFound = hasAttributeMapping(path)
+		var LAttribute prevAttr = null
 		var bean = doc.createElement('''«IF path.nodeName !== null»«path.nodeName»«ELSE»«entity.toName»«ENDIF»''')
 		var pi = doc.createProcessingInstruction(currentKey, "")
 		if(parent === null) {
@@ -1092,21 +1409,23 @@
 			parent.appendChild(bean)
 		}
 		for(p:entity.allAttributes) {
-			if(!isInternal(p) && // don't export version
-				((!p.id && !p.uuid) || (path.lookupKeys.empty && dataInterchange.mode != EntityManagerMode.PERSIST)) && 
-				(!mappingFound || path.mappings.isMapped(p))) { 
-				var format = null as DataInterchangeFormat
-				for (step : formats) {
-					// is there a format modeled for this attribute ?
-					if ((p as LEntityFeature).toName.equals(step.targetProperty.toName)) {
-						if	(step.format !== null) {
-							format = step
+			if(useFeature(p, path, dataInterchange)) {
+				if(p instanceof LAttribute && p.type instanceof LBean) {
+					prevAttr = p as LAttribute
+				} else {
+					var format = null as DataInterchangeFormat
+					for (step : formats) {
+						// is there a format modeled for this attribute ?
+						if ((p as LFeature).toName.equals(step.targetProperty.toName)) {
+							if	(step.format !== null) {
+								format = step
+							}
 						}
 					}
+					var property = doc.createElement(p.toName)
+					property.textContent = encodeFreemarker(entity.toName, p, format, "", true, -1, prevAttr?.toName)
+					bean.appendChild(property)
 				}
-				var property = doc.createElement(p.toName)
-				property.textContent = encodeFreemarker(entity.toName, p, format, "", true)
-				bean.appendChild(property)
 			}
 		}
 		for(e : path.exportExposes){
@@ -1121,7 +1440,7 @@
 			var property = doc.createElement(expose.refProperty.toName)
 			var pathToProperty = segments.join(".")
 
-			property.textContent = encodeFreemarker('''«entity.toName».«pathToProperty»''', expose.refProperty, null as DataInterchangeFormat, "", true);
+			property.textContent = encodeFreemarker('''«entity.toName».«pathToProperty»''', expose.refProperty, null as DataInterchangeFormat, "", true, -1, "");
 			bean.appendChild(property)
 		}
 		var pa = doc.createProcessingInstruction(currentKey, "")
@@ -1133,15 +1452,31 @@
 		return bean
 	}
 	
-	def String decoder(LEntityFeature f) {
-		return getPrimitiveDataTypeName(f as LEntityAttribute)
+	def boolean useFeature(LFeature f, DataInterchangeBean path, DataInterchange dataInterchange) {
+		var mappingFound = hasAttributeMapping(path)
+		if (!isInternal(f) &&				// don't export version etc.
+			!path.isMarkLatestImport &&	(!mappingFound || path.mappings.isMapped(f))) {
+				if(dataInterchange.mode == EntityManagerMode.PERSIST) {
+					if(isId(f)) {
+						return false
+					}
+					return true
+				} else {
+					return true
+				}
+		}
+		return false
+	}
+	
+	def String decoder(LFeature f) {
+		return getPrimitiveDataTypeName(f as LAttribute)
 	}
 
 	def String decoder(LEntityAttribute f) {
 		return getPrimitiveDataTypeName(f)
 	}
 
-	def String getPrimitiveDataTypeName(LEntityAttribute attribute) {
+	def String getPrimitiveDataTypeName(LAttribute attribute) {
 		var eType = dtType.getBasicType(attribute)
 		var String typeName = null
 		if	(eType == EType.DATE) {
@@ -1209,12 +1544,17 @@
         return result.replace("&lt;","<").replace("&gt;",">").replace("<?","<").replace("?>",">")//.replace("</#","\n</#") 
 	}
 	
-	def String createCsvTemplate(String rootEntityName, List<LEntityFeature> fieldList, String delimiter, String quote, EList<DataInterchangeBean> paths)	{
+	def String createCsvTemplate(String rootEntityName, List<LFeature> fieldList, String delimiter, String quote, EList<DataInterchangeBean> paths)	{
 		var tmpList = <String>newArrayList()
 		var fldList = <String>newArrayList
+		var LAttribute prevAttr = null
 		for(field:fieldList) {
-			tmpList.add(encodeFreemarker(rootEntityName, field, paths, quote, false))
-			fldList.add(field.toName)
+			if(field instanceof LAttribute && field.type instanceof LBean) {
+				prevAttr = field as LAttribute
+			} else {
+				tmpList.add(encodeFreemarker(rootEntityName, field, paths, quote, false, -1, prevAttr?.toName))
+				fldList.add(field.toName)
+			}
 		}
 		var body = '''
 		«fldList.join(delimiter)»
@@ -1224,60 +1564,100 @@
         return body
 	}
 
-	def String encodeFreemarker(String entityName, LEntityFeature field, EList<DataInterchangeBean> paths, String quote, boolean encodeHtml) {
+	def String createFixedTemplate(String rootEntityName, List<LFeature> fieldList, EList<DataInterchangeBean> paths)	{
+		var tmpList = <String>newArrayList()
+		for(path:paths) {		
+			for(map:path.mappings) {
+				var column = map as DataInterchangeFixedColumnMapping
+				tmpList.add(encodeFreemarker(rootEntityName, column.property, paths, null, false, column.length, null))
+			}
+		}		
+		var body = '''
+		<#list vector as «rootEntityName»>
+		«tmpList.join()»
+		</#list>'''
+        return body
+	}
+
+	def String encodeFreemarker(String entityName, LFeature field, EList<DataInterchangeBean> paths, String quote, boolean encodeHtml, int length, String beanPrefix) {
 		var format = null as DataInterchangeFormat
-		val entity = field.eContainer as LEntity
-		for	(path : paths) {
-			if	(path.entity.equals(entity)) {
-				for (step : path.format) {
-					// is there a format modeled for this attribute ?
-					if (field.toName.equals(step.targetProperty.toName)) {
-						if	(step.format !== null) {
-							format = step
+		var LEntity entity = null
+		if(field.eContainer instanceof LEntity) {
+			entity = field.eContainer as LEntity
+			for	(path : paths) {
+				if (path.entity.equals(entity)) {
+					for (step : path.format) {
+						// is there a format modeled for this attribute ?
+						if (field.toName.equals(step.targetProperty.toName)) {
+							if	(step.format !== null) {
+								format = step
+							}
 						}
 					}
 				}
 			}
 		}
-		return encodeFreemarker(entityName, field, format, quote, encodeHtml)
+		return encodeFreemarker(entityName, field, format, quote, encodeHtml, length, beanPrefix)
 	}
 
-	def String encodeFreemarker(String entityName, LEntityFeature field, DataInterchangeFormat format, String quote, boolean encodeHtml) {
+	def String encodeFreemarker(String entityName, LFeature field, DataInterchangeFormat format, String quote, boolean encodeHtml, int length, String beanPrefix) {
+		var EType etype = null
+		var String fldName = null
 		if(field instanceof LEntityAttribute) {
-			var etype = dtType.getBasicType(field)
+			fldName = '''«entityName».«field.toName»'''
+			etype = dtType.getBasicType(field)
+		} 
+		if(field instanceof LBeanAttribute) {
+			fldName = '''«entityName».«beanPrefix».«field.toName»'''
+			etype = dtType.getBasicType(field)
+		}
+		if(field instanceof LEntityAttribute || field instanceof LBeanAttribute) {
 			if	(etype == EType.BOOLEAN) {
-				return '''${(«entityName».«field.toName»?c)!}'''
+				return '''${(«fldName»?c«fixedLength(length)»)!«fixedLength(length)»}'''
 			}
 			else if	(format !== null) {
-				return '''${(«entityName».«field.toName»?string["«format.format»"])!}'''
+				return '''${(«fldName»?string["«format.format»"]«fixedLength(length)»)!«fixedLength(length)»}'''
 			}
 			else if	(etype == EType.DATE) {
-				return '''${(«entityName».«field.toName»?datetime?iso_local_ms_nz)!}'''
+				return '''${(«fldName»?datetime?iso_local_ms_nz)«fixedLength(length)»!«fixedLength(length)»}'''
 			}
 			else if	(etype == EType.STRING) {
-				return '''«quote»${(«entityName».«field.toName»«IF encodeHtml»?html«ENDIF»)!}«quote»'''
+				return '''«quote»${(«fldName»«IF encodeHtml»?html«ENDIF»«fixedLength(length)»)!«fixedLength(length)»}«quote»'''
 			} 
 			else {
-				return '''${(«entityName».«field.toName»)!}'''
+				return '''${(«fldName»)«fixedLength(length)»!«fixedLength(length)»}'''
 			}
-		} else {
-			var etype = dtType.getBasicType((field as LEntityReference).type.primaryKeyAttribute)
+		} 
+		if(field instanceof LEntityReference) {
+			etype = dtType.getBasicType((field as LEntityReference).type.primaryKeyAttribute)
 			if	(etype == EType.STRING) {
-				return '''«quote»${(«entityName».«field.toName».«(field as LEntityReference).type.primaryKeyAttribute.name»)!}«quote»'''
+				return '''«quote»${(«entityName».«field.toName».«(field as LEntityReference).type.primaryKeyAttribute.name»«fixedLength(length)»)!«fixedLength(length)»}«quote»'''
 			} else {
-				return '''${(«entityName».«field.toName».«(field as LEntityReference).type.primaryKeyAttribute.name»)!}'''
+				return '''${(«entityName».«field.toName».«(field as LEntityReference).type.primaryKeyAttribute.name»«fixedLength(length)»)!«fixedLength(length)»}'''
 			}
 		}
 	}	
 	
+	def fixedLength(int length)
+		'''«IF length > 0»?right_pad(«length»)[0..*«length»]«ENDIF»'''
+	
 	/* create a multistage left joined query to climb up along the one to many relations until import marker */
-	def String query(LEntity entity, DataInterchangeLookup lookup) {
+	def String query(LEntity entity, DataInterchangeLookup lookup, int paramCnt) {
+		var pCnt = paramCnt
 		var aliasCnt = 0
 		var select = '''«entity.toName» x«aliasCnt»'''
 		var joinList = <String>newArrayList
 		var whereList = <String>newArrayList
-		var qstr = '''x«aliasCnt».«lookup.queryProperty.toName» = :param'''
+		var qstr = '''x«aliasCnt».«lookup.queryProperty.toName» = :param«pCnt++»'''
 		whereList.add(qstr)
+		if(lookup.condition !== null) {
+			var lstr = '''x«aliasCnt».«lookup.condition.refProperty.toName» «lookup.condition.operator» «IF lookup.condition.operand instanceof DataInterchangeLookupFilterOperandString»'«(lookup.condition.operand as DataInterchangeLookupFilterOperandString).value»'«ELSE»:param«pCnt++»«ENDIF»'''
+			if(lookup.condition.subcondition !== null) {
+				lstr = lstr + " " + lookup.condition.operator2.literal + " "
+				lstr = lookup.condition.subcondition.iterateCondition(lstr, aliasCnt, pCnt)
+			}
+			whereList.add("("+lstr+")")
+		}
 		if (lookup.markerPath !== null) {
 			for(markerEntity:lookup.markerPath.path) {
 				aliasCnt = aliasCnt + 1
@@ -1297,14 +1677,66 @@
 		}
 		return '''from «select»«IF joinList.size>0» left join «ENDIF»«joinList.join(" left join ")» where «whereList.join(" and ")»'''
 	}
+	
+	def String iterateCondition(DataInterchangeLookupFilterCondition condition, String input, int aliasCnt, int paramCnt) {
+		var pCnt = paramCnt
+		var lstr = '''«input»x«aliasCnt».«condition.refProperty.toName» «condition.operator» «IF condition.operand instanceof DataInterchangeLookupFilterOperandString»'«(condition.operand as DataInterchangeLookupFilterOperandString).value»'«ELSEIF !condition.operator.literal.startsWith("is")»:param«pCnt++»«ENDIF»'''
+		if(condition.subcondition !== null) {
+			lstr = lstr + " " + condition.operator2.literal + " "
+			lstr = condition.subcondition.iterateCondition(lstr, aliasCnt, pCnt)
+		}
+		return lstr
+	}
 
+	def void iterateConditionParameter(DataInterchangeLookupFilterCondition condition, Document doc, Element locator, EList<DataInterchangeMapping> mappings, String autoMapping, int paramCnt, boolean byAttribute) {
+		var pCnt = paramCnt
+		if(condition.operand instanceof DataInterchangeLookupFilterOperandProperty && !condition.operator.literal.startsWith("is")) {
+			var prop = (condition.operand as DataInterchangeLookupFilterOperandProperty).refProperty
+			for(mapping:mappings) {
+				if(mapping.property.equals(prop)) {
+					if(mapping.data === null) {
+						createDaoParam(doc, locator, '''param«paramCnt»''', prop.type.name.toFirstUpper, autoMapping, prop.toName, byAttribute)
+					} else {
+						createDaoParam(doc, locator, '''param«paramCnt»''', prop.type.name.toFirstUpper, mapping.data, prop.toName, byAttribute)
+					}
+					pCnt ++
+				}
+			}
+		}
+		if(condition.subcondition !== null) {
+			condition.subcondition.iterateConditionParameter(doc, locator, mappings, autoMapping, pCnt, byAttribute)
+		}
+	}
+	
 	def String queryKeys(DataInterchangeBean bean) {
 		var pCnt = 0
-		var select = '''«bean.entity.toName» x'''
+		var eCnt = -1
+		var LEntity oldEntity = null
+		var select = '''«bean.entity.toName» x«pCnt»'''
+		var rootAlias = '''x«pCnt»'''
 		var whereList = <String>newArrayList
 		for(key:bean.lookupKeys) {
-			var qstr = '''x.«key.property.toName» = :param«pCnt++»'''
-			whereList.add(qstr)
+			if(key.property.eContainer.equals(bean.entity)) {
+				if(!key.property.eContainer.equals(oldEntity)) {
+					eCnt ++
+					oldEntity = key.property.eContainer as LEntity
+				}
+				var qstr = '''x«eCnt».«key.property.toName» = :param«pCnt»'''
+				whereList.add(qstr)
+			} else {
+				for(lookup:bean.lookup) {
+					if(lookup.queryProperty.equals(key.property)) {
+						if(!lookup.queryProperty.equals(oldEntity)) {
+							eCnt ++
+							oldEntity = lookup.queryProperty as LEntity
+						}
+						select = '''«select» left join «lookup.entity.toName» x«pCnt» on(x«pCnt»=«rootAlias».«lookup.targetProperty.toName»)'''
+						var qstr = '''x«eCnt».«key.property.toName» = :param«pCnt»'''
+						whereList.add(qstr)
+					}
+				}
+			}
+			pCnt ++;
 		}
 		return '''from «select» where «whereList.join(" and ")»'''
 	}
@@ -1315,7 +1747,7 @@
 		return '''from «select» where «qstr»'''
 	}
 	
-	def boolean containsFeature(List<DataInterchangeExportHide> list, LEntityFeature f){
+	def boolean containsFeature(List<DataInterchangeExportHide> list, LFeature f){
 		for(exclude : list){
 			if(exclude.property.equals(f)){
 				return true
@@ -1391,7 +1823,6 @@
 			, ConstraintViolation
 			, EventDispatcherEvent
 			, EventDispatcherCommand
-			, DataInterchangeException
 			, TransformerConfigurationException
 			, SAXException
 			, IOException
diff --git a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/scoping/DataDSLScopeProvider.xtend b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/scoping/DataDSLScopeProvider.xtend
index c8b3997..9ff3da4 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/scoping/DataDSLScopeProvider.xtend
+++ b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/scoping/DataDSLScopeProvider.xtend
@@ -24,6 +24,7 @@
 import org.eclipse.emf.ecore.EReference
 import org.eclipse.osbp.dsl.entity.xtext.extensions.ModelExtensions
 import org.eclipse.osbp.dsl.semantic.common.types.LAttribute
+import org.eclipse.osbp.dsl.semantic.common.types.LFeature
 import org.eclipse.osbp.dsl.semantic.common.types.LReference
 import org.eclipse.osbp.dsl.semantic.entity.LEntity
 import org.eclipse.osbp.dsl.semantic.entity.LEntityAttribute
@@ -41,87 +42,91 @@
 import org.eclipse.xtext.resource.IEObjectDescription
 import org.eclipse.xtext.scoping.IScope
 import org.eclipse.xtext.scoping.impl.MapBasedScope
-import org.eclipse.osbp.dsl.entity.xtext.services.EntityGrammarGrammarAccess.EntityModelElements
 
 class DataDSLScopeProvider extends AbstractDataDSLScopeProvider {
 	@Inject extension ModelExtensions
 
 	override getScope(EObject context, EReference reference) {
 		if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__LATEST_PROPERTY) {
-			
 			return getScope_Data_Entity_latest(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__LATEST_EXP_PROPERTY) {
-			
 			return getScope_Data_Entity_latest(context, reference)
-			
-		}
-		else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__REF_PROPERTY){				
-			return getScope_Data_ExportFilterAttributes_entity(context, reference)			
-		}
-		else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_HIDE__PROPERTY)  {
-			return getScope_Data_ExportFilterAttributes_hide(context, reference)
-		}
-		else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__OPERATOR2)  {
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__REF_PROPERTY) {
 			return getScope_Data_ExportFilterAttributes_entity(context, reference)
-		}
-		else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPRESSION__TARGET_PROPERTY) {
-			
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_HIDE__PROPERTY) {
+			return getScope_Data_ExportFilterAttributes_hide(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__OPERATOR2) {
+			return getScope_Data_ExportFilterAttributes_entity(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__REF_PROPERTY) {
+			return getScope_Data_LookupFilterAttributes_entity(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_OPERAND_PROPERTY__REF_PROPERTY) {
+			return getScope_Data_ExportFilterAttributes_entity(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERATOR2) {
+			return getScope_Data_LookupFilterAttributes_entity(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPRESSION__TARGET_PROPERTY) {
 			return getScope_Data_Target_property(context, reference, true)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_FORMAT__TARGET_PROPERTY) {
-			
 			return getScope_Data_Target_property(context, reference, true)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_ENTITY_EXPRESSION__PROPERTY) {
-			
 			return getScope_Data_Expression_entity(context, reference, false)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__TARGET_PROPERTY) {
-			
 			return getScope_Data_Target_property(context, reference, false)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__QUERY_PROPERTY) {
-			
 			return getScope_Data_Lookup_queryProperty(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP__ENTITY) {
-			
 			return getScope_Data_Lookup_lookupEntity(context, reference)
-			
-		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPOSE__REF_ENTITY){
-			
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPOSE__REF_ENTITY) {
 			return getScope_Data_Expose_entity(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_EXPOSE__REF_PROPERTY) {
-			
 			return getScope_Data_Expose_queryProperty(context, reference)
-
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MAPPING__PROPERTY) {
-			
 			return getScope_Data_Target_property(context, reference, true)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_ENTITY) {
-			
 			return getScope_Data_Markerpath_entity(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_MARKER_ENTITY__MARKER_PROPERTY) {
-			
 			return getScope_Data_Entity_latest(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__ENTITY) {
-			
 			return getScope_Data_Entity_next(context, reference)
-			
 		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_KEY__PROPERTY) {
-			
 			return getScope_keyProperty(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE) {
+			return getScope_Data_Bean_Entity_ReferenceAttribut(context, reference)
+		} else if (reference == DataDSLPackage.Literals.DATA_INTERCHANGE_BEAN__REF_DATA_SOURCE) {
 			
 		} else {
-			
 			super.getScope(context, reference)
 		}
 	}
+	
+	def getScope_Data_Bean_Entity_ReferenceAttribut(EObject context, EReference reference) {
+		var result = <IEObjectDescription>newArrayList
+		var eObj = context.eContainer
+		while (!(eObj instanceof DataInterchange)) {
+			eObj = eObj.eContainer
+		}
+		if (eObj !== null) {
+			var rootentity = (eObj as DataInterchange).path.get(0).entity
+			
+			if (rootentity !== null) {
+				var currententityRef = (context as DataInterchangeBean).entity 
+				if(rootentity !== null && rootentity.name !== currententityRef.name){
+					// check all reference of root entity
+					// from the same type as the currententityRef
+					for(f : rootentity.features){
+						if(f instanceof LReference){
+							if (f.toMany) {
+								var ref = (f as LEntityReference)
+								if(ref.typeName.equals(currententityRef.name)){
+									result.add(EObjectDescription.create((ref as LFeature).name, (ref as LFeature)))
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
 
 	def getScope_Data_Bean_Entity(EObject context, EReference reference) {
 		var result = <IEObjectDescription>newArrayList
@@ -171,8 +176,17 @@
 			eObj = eObj.eContainer
 		}
 		if (eObj !== null && eObj instanceof DataInterchangeBean) {
-			var entity = (eObj as DataInterchangeBean).entity
-			entity.allAttributes.forEach[result.add(EObjectDescription.create(it.name, it))]
+			var bean = eObj as DataInterchangeBean
+			var entity = bean.entity
+			entity.normalFeatures.forEach[result.add(EObjectDescription.create(it.name, it))]
+			for(lookup : bean.lookup) {
+				var queryProp = lookup.queryProperty
+				if(queryProp !== null && queryProp.name !== null) {
+					result.add(EObjectDescription.create(queryProp.name, queryProp))
+				} else {
+					System.out.println("got problem");
+				}
+			}
 		}
 		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
 	}
@@ -361,7 +375,7 @@
 			var entity = (eObj as DataInterchangeBean).entity
 			var marker = (eObj as DataInterchangeBean).latestProperty
 			
-			for (prop : entity.allFeatures) {
+			for (prop : entity.normalFeatures) {
 				if(prop instanceof LEntityAttribute && (marker === null || !prop.toName.equals(marker.toName))) {
 					result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LAttribute)))
 				}
@@ -372,6 +386,26 @@
 		}
 		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
 	}
+
+	def getScope_Data_LookupFilterAttributes_entity(EObject context, EReference reference) {
+		var result = <IEObjectDescription>newArrayList
+		var eObj = context.eContainer
+		while (!(eObj instanceof DataInterchangeBean)) {
+			eObj = eObj.eContainer
+		}
+		if((eObj as DataInterchangeBean).lookup !== null) {
+			for(lookup : (eObj as DataInterchangeBean).lookup) {
+				var entity = lookup.entity
+				for (prop : entity.normalFeatures) {
+					if(prop instanceof LEntityAttribute) {
+						result.add(EObjectDescription.create((prop as LEntityFeature).name, (prop as LAttribute)))
+					}
+				}
+			}
+		}
+		return MapBasedScope.createScope(IScope.NULLSCOPE, result)
+	}
+	
 	def getScope_Data_ExportFilterAttributes_hide(EObject context, EReference reference) {
 		var result = <IEObjectDescription>newArrayList
 		var eObj = context.eContainer
@@ -385,7 +419,7 @@
 			if(eObj.eContainer instanceof DataInterchange){
 				mode = (eObj.eContainer as DataInterchange).mode
 			}
-			for (prop : entity.allFeatures) {
+			for (prop : entity.normalFeatures) {
 				if(prop instanceof LEntityAttribute && (marker === null || !prop.toName.equals(marker.toName))) {
 					if(mode.equals(EntityManagerMode.PERSIST) && prop.isUUID || (prop as LEntityAttribute).isId){
 						// do nothing
diff --git a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/validation/DataDSLValidator.xtend b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/validation/DataDSLValidator.xtend
index cb8b48e..2a7232a 100644
--- a/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/validation/DataDSLValidator.xtend
+++ b/org.eclipse.osbp.xtext.datainterchange/src/org/eclipse/osbp/xtext/datainterchange/validation/DataDSLValidator.xtend
@@ -3,10 +3,22 @@
  */
 package org.eclipse.osbp.xtext.datainterchange.validation
 
-import org.eclipse.xtext.validation.Check
-import org.eclipse.osbp.xtext.datainterchange.ConditionAndOperator1
+import java.net.MalformedURLException
+import java.net.URL
+import java.nio.file.Paths
+import javax.inject.Inject
 import org.eclipse.osbp.xtext.datainterchange.DataDSLPackage
-import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFilterCondition
+import org.eclipse.osbp.xtext.datainterchange.DataInterchange
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeExportFilterCondition
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFile
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileCSV
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileEDI
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileFixed
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeFileXML
+import org.eclipse.osbp.xtext.datainterchange.DataInterchangeLookupFilterCondition
+import org.eclipse.osbp.xtext.datainterchange.Operator
+import org.eclipse.osbp.xtext.datainterchange.jvmmodel.DataDSLJvmModelInferrer
+import org.eclipse.xtext.validation.Check
 
 /**
  * This class contains custom validation rules. 
@@ -15,32 +27,192 @@
  */
 class DataDSLValidator extends AbstractDataDSLValidator {
 	
-//	public static val INVALID_NAME = 'invalidName'
-//
-//	@Check
-//	def checkGreetingStartsWithCapital(Greeting greeting) {
-//		if (!Character.isUpperCase(greeting.name.charAt(0))) {
-//			warning('Name should start with a capital', 
-//					DataDSLPackage.Literals.GREETING__NAME,
-//					INVALID_NAME)
-//		}
-//	}
+	@Inject extension DataDSLJvmModelInferrer df
+
+	public val CSV_EXTENSION = ".csv";
+	public val XML_EXTENSION = ".xml";
+	public val EDI_EXTENSION = ".edi";
+	public val FIX_EXTENSION = ".txt";
+	static val ERROR_MESSAGE = "The directory you've chosen does not exist or is not accessible. Please adapt the url."
 	
 	@Check
-	def checkFilterConditionValidity(DataInterchangeFilterCondition condition){
+	def checkFilterConditionValidity(DataInterchangeExportFilterCondition condition){
 		if(condition !== null && condition.getRefProperty !== null && condition.getOperator !== null){
 			
-			if(condition.getOperator.equals(ConditionAndOperator1.ISNOTNULL) 
-			|| condition.getOperator.equals(ConditionAndOperator1.ISNULL)){
+			if(condition.getOperator.equals(Operator.ISNOTNULL) 
+			|| condition.getOperator.equals(Operator.ISNULL)){
 				if(condition.getValue !== null && !condition.getValue.empty){
-					error("no value option expected/allowed for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__VALUE, condition.getValue)
+					error("no value option expected/allowed for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE, condition.getValue)
 				}
 			}
-			else if(condition.getValue === null && !(condition.getOperator.equals(ConditionAndOperator1.ISNOTNULL) 
-			|| condition.getOperator.equals(ConditionAndOperator1.ISNULL))){
-				error("value option missing for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_FILTER_CONDITION__VALUE, condition.getValue)
+			else if(condition.getValue === null && !(condition.getOperator.equals(Operator.ISNOTNULL) 
+			|| condition.getOperator.equals(Operator.ISNULL))){
+				error("value option missing for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_EXPORT_FILTER_CONDITION__VALUE, condition.getValue)
 			}
-			//no value needed
 		}
 	}
+
+	@Check
+	def checkFilterConditionValidity2(DataInterchangeLookupFilterCondition condition){
+		if(condition !== null && condition.getRefProperty !== null && condition.getOperator !== null){
+			
+			if(condition.getOperator.equals(Operator.ISNOTNULL) 
+			|| condition.getOperator.equals(Operator.ISNULL)){
+				if(condition.operand !== null) {
+					error("no value option expected/allowed for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND)
+				}
+			}
+			else if(condition.operand === null && !(condition.getOperator.equals(Operator.ISNOTNULL) 
+			|| condition.getOperator.equals(Operator.ISNULL))){
+				error("value option missing for this condition.", DataDSLPackage.Literals.DATA_INTERCHANGE_LOOKUP_FILTER_CONDITION__OPERAND)
+			}
+		}
+	}
+	
+	@Check
+	def void checkFileNameValidity(DataInterchange interchange) {
+		if (interchange !== null && interchange.fileEndpoint !== null){
+			var allowed_extension = getValidExtensionToInterchange(interchange.fileEndpoint)
+			var filename = interchange.getDataInterchangeFileName
+			
+			if (allowed_extension !== null) {
+				if(allowed_extension.equals(CSV_EXTENSION) && !isExtensionAllowedForInterchange(filename, allowed_extension)){
+					error("The file name ["+filename+"] you have entered is not valid. Only file names with the extension "+allowed_extension+" are allowed for this interchange unit!",
+					interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_CSV__FILE_URL)						
+				}
+				else if (allowed_extension.equals(EDI_EXTENSION) && !isExtensionAllowedForInterchange(filename, allowed_extension)){
+					error("The file name ["+filename+"] you have entered is not valid. Only file names with the extension "+allowed_extension+" are allowed for this interchange unit!",
+					interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_EDI__FILE_URL)
+				}
+				else if (allowed_extension.equals(XML_EXTENSION) && !isExtensionAllowedForInterchange(filename, allowed_extension)){
+					error("The file name ["+filename+"] you have entered is not valid. Only file names with the extension "+allowed_extension+" are allowed for this interchange unit!",
+					interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_XML__FILE_URL)					
+				}
+				else if (allowed_extension.equals(FIX_EXTENSION) && !isExtensionAllowedForInterchange(filename, allowed_extension)){
+					error("The file name ["+filename+"] you have entered is not valid. Only file names with the extension "+allowed_extension+" are allowed for this interchange unit!",
+					interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_FIXED__FILE_URL)					
+				}
+			}
+			else {
+				error("The file name extension you have entered is not currently supported. Only file names with either one of following extension are allowed: '.csv' '.edi' '.txt' or '.xml' .",
+					interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE__FILE_ENDPOINT)
+			}
+		}
+	}
+	
+	def boolean isExtensionValid(String filename) {
+		return (filename.endsWith(CSV_EXTENSION) || filename.endsWith(CSV_EXTENSION.toUpperCase) ||
+			filename.endsWith(EDI_EXTENSION) || filename.endsWith(EDI_EXTENSION.toUpperCase) ||
+			filename.endsWith(FIX_EXTENSION) || filename.endsWith(FIX_EXTENSION.toUpperCase) ||
+			filename.endsWith(XML_EXTENSION) || filename.endsWith(XML_EXTENSION.toUpperCase)
+		)
+	}
+
+	def boolean isExtensionAllowedForInterchange(String filename, String allowedextension) {
+		return (filename.endsWith(allowedextension) || filename.endsWith(allowedextension.toUpperCase))
+	}
+
+	def String getValidExtensionToInterchange(DataInterchangeFile file) {
+		if (file instanceof DataInterchangeFileCSV) {
+			return CSV_EXTENSION
+		} else if (file instanceof DataInterchangeFileEDI) {
+			return EDI_EXTENSION
+		} else if (file instanceof DataInterchangeFileXML) {
+			return XML_EXTENSION
+		} else if (file instanceof DataInterchangeFileFixed) {
+			return FIX_EXTENSION
+		}
+		return null
+	}
+	
+	@Check
+	def checkDirectoryOrURLValidity(DataInterchange interchange) {
+		var directory = interchange.getDataInterchangeDirectoryUrlPath
+		if(directory.trim.length !== directory.length){
+			error("The path you've given shouldn't contains blank space.", interchange, DataDSLPackage.Literals.DATA_INTERCHANGE__FILE_ENDPOINT)
+		}
+		else{ 
+			try {
+				checkDirectoryURL(new URL(directory), interchange)	
+			}
+			catch (MalformedURLException e1) {
+				if(e1.getMessage().startsWith("unknown protocol") || e1.getMessage().startsWith("no protocol")) {
+					try {
+						// check for relative path
+						if(!Paths.get(directory).absolute){
+							var projectname = interchange.eResource.URI.segment(1)
+							if(!existsDirectory(projectname, directory)){
+								showDirectoryError(interchange)
+//								var os = FileSystems.^default.class.canonicalName
+//								if(os.endsWith("WindowsFileSystem")){
+//									// TODO fill appropriate tool tip or info message									
+//								}
+//								else if(os.endsWith("MacOSXFileSystem")){
+//									// TODO fill appropriate tool tip or info message	
+//								}
+//								else{
+//									// TODO fill appropriate tool tip or info message	
+//								}
+							}
+						}
+						else{
+							// check for absolute path 
+							checkDirectoryURL(Paths.get(directory).toUri().toURL(), interchange)
+						}
+					} catch (Exception e2) {
+						showDirectoryError(interchange)				
+					}
+				}
+			}
+		}
+	}
+	
+	def boolean existsDirectory(String projectname, String directory) {
+		var path = findProjectFileOrFolderLocation(projectname, directory, false).toOSString
+		var file = Paths.get(path).toFile
+		if(file !== null && file.exists){
+			if(!file.directory){
+				return false
+			}
+			return true
+		}
+		return false
+	}
+	
+	def boolean existsDirectory(String path) {
+		var file = Paths.get(path).toFile
+		if(file !== null && file.exists){
+			if(!file.directory){
+				return false
+			}
+			return true
+		}
+		return false
+	}
+	
+	def checkDirectoryURL(URL url, DataInterchange interchange){
+		if(url !== null && url.protocol.equals("file") && !existsDirectory(interchange.getDataInterchangeDirectoryUrlPath)){
+			showDirectoryError(interchange)
+		}
+		//TODO add additional url protocol validity check here for later
+	}
+	
+	private def showDirectoryError(DataInterchange interchange){
+		if(interchange.fileEndpoint instanceof DataInterchangeFileCSV){
+			error(ERROR_MESSAGE, interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_CSV__FILE_URL)
+		}
+		else if(interchange.fileEndpoint instanceof DataInterchangeFileEDI){
+			error(ERROR_MESSAGE, interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_EDI__FILE_URL)
+		}
+		else if(interchange.fileEndpoint instanceof DataInterchangeFileXML){
+			error(ERROR_MESSAGE, interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_XML__FILE_URL)
+		}
+		else if(interchange.fileEndpoint instanceof DataInterchangeFileFixed){
+			error(ERROR_MESSAGE, interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE_FILE_FIXED__FILE_URL)
+		}
+		else{
+			error(ERROR_MESSAGE, interchange.fileEndpoint, DataDSLPackage.Literals.DATA_INTERCHANGE__FILE_ENDPOINT)
+		}
+	}
+	
 }
