//Generated with EGF 1.3.0.qualifier
package org.eclipse.egf.emf.pattern.model;

import org.eclipse.egf.emf.pattern.base.*;
import org.eclipse.emf.codegen.ecore.genmodel.*;
import org.eclipse.emf.codegen.ecore.genmodel.impl.*;
import org.eclipse.emf.codegen.ecore.genmodel.generator.*;
import org.eclipse.emf.codegen.util.*;
import org.eclipse.emf.ecore.util.*;
import org.eclipse.emf.common.util.*;
import org.eclipse.egf.common.helper.*;
import java.util.*;
import org.eclipse.emf.ecore.*;
import org.eclipse.egf.model.pattern.*;
import org.eclipse.egf.pattern.execution.*;
import org.eclipse.egf.pattern.query.*;

public class PackageClass extends org.eclipse.egf.emf.pattern.base.GenPackageJava {
	protected static String nl;

	public static synchronized PackageClass create(String lineSeparator) {
		nl = lineSeparator;
		PackageClass result = new PackageClass();
		nl = null;
		return result;
	}

	public final String NL = nl == null ? (System.getProperties().getProperty("line.separator")) : nl;
	protected final String TEXT_1 = "";
	protected final String TEXT_2 = NL + "package ";
	protected final String TEXT_3 = ";";
	protected final String TEXT_4 = NL + "package ";
	protected final String TEXT_5 = ";";
	protected final String TEXT_6 = NL;
	protected final String TEXT_7 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
			+ " * The <b>Package</b> for the model." + NL + " * It contains accessors for the meta objects to represent"
			+ NL + " * <ul>" + NL + " *   <li>each class,</li>" + NL + " *   <li>each feature of each class,</li>";
	protected final String TEXT_8 = NL + " *   <li>each operation of each class,</li>";
	protected final String TEXT_9 = NL + " *   <li>each enum,</li>" + NL + " *   <li>and each data type</li>" + NL
			+ " * </ul>" + NL + " * <!-- end-user-doc -->";
	protected final String TEXT_10 = NL + " * <!-- begin-model-doc -->" + NL + " * ";
	protected final String TEXT_11 = NL + " * <!-- end-model-doc -->";
	protected final String TEXT_12 = NL + " * @see ";
	protected final String TEXT_13 = NL + " * @model ";
	protected final String TEXT_14 = NL + " *        ";
	protected final String TEXT_15 = NL + " * @model";
	protected final String TEXT_16 = NL + " * @generated" + NL + " */";
	protected final String TEXT_17 = NL + NL + "/**" + NL + " * <!-- begin-user-doc -->" + NL
			+ " * An implementation of the model <b>Package</b>." + NL + " * <!-- end-user-doc -->" + NL
			+ " * @generated" + NL + " */";
	protected final String TEXT_18 = NL + "public class ";
	protected final String TEXT_19 = " extends ";
	protected final String TEXT_20 = " implements ";
	protected final String TEXT_21 = NL + "public interface ";
	protected final String TEXT_22 = " extends ";
	protected final String TEXT_23 = NL + "{";
	protected final String TEXT_24 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_25 = " copyright = ";
	protected final String TEXT_26 = ";";
	protected final String TEXT_27 = NL;
	protected final String TEXT_28 = NL + "\t/**" + NL + "\t * The package name." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_29 = " eNAME = \"";
	protected final String TEXT_30 = "\";";
	protected final String TEXT_31 = NL + NL + "\t/**" + NL + "\t * The package namespace URI." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_32 = " eNS_URI = \"";
	protected final String TEXT_33 = "\";";
	protected final String TEXT_34 = NL + NL + "\t/**" + NL + "\t * The package namespace name." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_35 = " eNS_PREFIX = \"";
	protected final String TEXT_36 = "\";";
	protected final String TEXT_37 = NL + NL + "\t/**" + NL + "\t * The package content type ID." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_38 = " eCONTENT_TYPE = \"";
	protected final String TEXT_39 = "\";";
	protected final String TEXT_40 = NL + NL + "\t/**" + NL + "\t * The singleton instance of the package." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\t";
	protected final String TEXT_41 = " eINSTANCE = ";
	protected final String TEXT_42 = ".init();" + NL;
	protected final String TEXT_43 = NL + "\t/**";
	protected final String TEXT_44 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_45 = " <em>";
	protected final String TEXT_46 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_47 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_48 = " <em>";
	protected final String TEXT_49 = "</em>}' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_50 = NL + "\t * The meta object id for the '{@link ";
	protected final String TEXT_51 = " <em>";
	protected final String TEXT_52 = "</em>}' enum." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @see ";
	protected final String TEXT_53 = NL + "\t * The meta object id for the '<em>";
	protected final String TEXT_54 = "</em>' data type." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->";
	protected final String TEXT_55 = NL + "\t * @see ";
	protected final String TEXT_56 = NL + "\t * @see ";
	protected final String TEXT_57 = "#get";
	protected final String TEXT_58 = "()" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_59 = "int ";
	protected final String TEXT_60 = " = ";
	protected final String TEXT_61 = ";" + NL;
	protected final String TEXT_62 = NL + "\t/**" + NL + "\t * The feature id for the '<em><b>";
	protected final String TEXT_63 = "</b></em>' ";
	protected final String TEXT_64 = "." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_65 = "int ";
	protected final String TEXT_66 = " = ";
	protected final String TEXT_67 = ";" + NL;
	protected final String TEXT_68 = NL + "\t/**" + NL + "\t * The number of structural features of the '<em>";
	protected final String TEXT_69 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_70 = "int ";
	protected final String TEXT_71 = " = ";
	protected final String TEXT_72 = ";" + NL;
	protected final String TEXT_73 = NL + "\t/**" + NL + "\t * The operation id for the '<em>";
	protected final String TEXT_74 = "</em>' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_75 = "int ";
	protected final String TEXT_76 = " = ";
	protected final String TEXT_77 = ";" + NL;
	protected final String TEXT_78 = NL + "\t/**" + NL + "\t * The number of operations of the '<em>";
	protected final String TEXT_79 = "</em>' class." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t * @ordered" + NL + "\t */" + NL + "\t";
	protected final String TEXT_80 = "int ";
	protected final String TEXT_81 = " = ";
	protected final String TEXT_82 = ";" + NL;
	protected final String TEXT_83 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprotected String packageFilename = \"";
	protected final String TEXT_84 = "\";";
	protected final String TEXT_85 = NL;
	protected final String TEXT_86 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprivate ";
	protected final String TEXT_87 = " ";
	protected final String TEXT_88 = " = null;" + NL;
	protected final String TEXT_89 = NL + "\t/**" + NL
			+ "\t * Creates an instance of the model <b>Package</b>, registered with" + NL
			+ "\t * {@link org.eclipse.emf.ecore.EPackage.Registry EPackage.Registry} by the package" + NL
			+ "\t * package URI value." + NL + "\t * <p>Note: the correct way to create the package is via the static"
			+ NL + "\t * factory method {@link #init init()}, which also performs" + NL
			+ "\t * initialization of the package, or returns the registered package," + NL
			+ "\t * if one already exists." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
			+ NL + "\t * @see org.eclipse.emf.ecore.EPackage.Registry" + NL + "\t * @see ";
	protected final String TEXT_90 = "#eNS_URI" + NL + "\t * @see #init()" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate ";
	protected final String TEXT_91 = "()" + NL + "\t{" + NL + "\t\tsuper(eNS_URI, ";
	protected final String TEXT_92 = ");" + NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate static boolean isInited = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends."
			+ NL + "\t * " + NL + "\t * <p>This method is used to initialize {@link ";
	protected final String TEXT_93 = "#eINSTANCE} when that field is accessed." + NL
			+ "\t * Clients should not invoke it directly. Instead, they should simply access that field to obtain the package."
			+ NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @see #eNS_URI";
	protected final String TEXT_94 = NL + "\t * @see #createPackageContents()" + NL
			+ "\t * @see #initializePackageContents()";
	protected final String TEXT_95 = NL + "\t * @generated" + NL + "\t */" + NL + "\tpublic static ";
	protected final String TEXT_96 = " init()" + NL + "\t{" + NL + "\t\tif (isInited) return (";
	protected final String TEXT_97 = ")";
	protected final String TEXT_98 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_99 = ".eNS_URI);" + NL;
	protected final String TEXT_100 = NL + "\t\tinitializeRegistryHelpers();" + NL;
	protected final String TEXT_101 = NL + "\t\t// Obtain or create and register package" + NL + "\t\t";
	protected final String TEXT_102 = " the";
	protected final String TEXT_103 = " = (";
	protected final String TEXT_104 = ")(";
	protected final String TEXT_105 = ".Registry.INSTANCE.get(eNS_URI) instanceof ";
	protected final String TEXT_106 = " ? ";
	protected final String TEXT_107 = ".Registry.INSTANCE.get(eNS_URI) : new ";
	protected final String TEXT_108 = "());" + NL + "" + NL + "\t\tisInited = true;" + NL;
	protected final String TEXT_109 = NL + "\t\t// Initialize simple dependencies";
	protected final String TEXT_110 = NL + "\t\t";
	protected final String TEXT_111 = ".eINSTANCE.eClass();";
	protected final String TEXT_112 = NL;
	protected final String TEXT_113 = NL + "\t\t// Obtain or create and register interdependencies";
	protected final String TEXT_114 = NL + "\t\t";
	protected final String TEXT_115 = " ";
	protected final String TEXT_116 = " = (";
	protected final String TEXT_117 = ")(";
	protected final String TEXT_118 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_119 = ".eNS_URI) instanceof ";
	protected final String TEXT_120 = " ? ";
	protected final String TEXT_121 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_122 = ".eNS_URI) : ";
	protected final String TEXT_123 = ".eINSTANCE);";
	protected final String TEXT_124 = NL;
	protected final String TEXT_125 = NL + "\t\t// Load packages";
	protected final String TEXT_126 = NL + "\t\tthe";
	protected final String TEXT_127 = ".loadPackage();";
	protected final String TEXT_128 = NL + "\t\t";
	protected final String TEXT_129 = ".loadPackage();";
	protected final String TEXT_130 = NL;
	protected final String TEXT_131 = NL + "\t\t// Create package meta-data objects";
	protected final String TEXT_132 = NL + "\t\tthe";
	protected final String TEXT_133 = ".createPackageContents();";
	protected final String TEXT_134 = NL + "\t\t";
	protected final String TEXT_135 = ".createPackageContents();";
	protected final String TEXT_136 = NL + NL + "\t\t// Initialize created meta-data";
	protected final String TEXT_137 = NL + "\t\tthe";
	protected final String TEXT_138 = ".initializePackageContents();";
	protected final String TEXT_139 = NL + "\t\t";
	protected final String TEXT_140 = ".initializePackageContents();";
	protected final String TEXT_141 = NL;
	protected final String TEXT_142 = NL + "\t\t// Fix loaded packages";
	protected final String TEXT_143 = NL + "\t\tthe";
	protected final String TEXT_144 = ".fixPackageContents();";
	protected final String TEXT_145 = NL + "\t\t";
	protected final String TEXT_146 = ".fixPackageContents();";
	protected final String TEXT_147 = NL;
	protected final String TEXT_148 = NL + "\t\t// Register package validator" + NL + "\t\t";
	protected final String TEXT_149 = ".Registry.INSTANCE.put" + NL + "\t\t\t(the";
	protected final String TEXT_150 = ", " + NL + "\t\t\t new ";
	protected final String TEXT_151 = ".Descriptor()" + NL + "\t\t\t {" + NL + "\t\t\t\t public ";
	protected final String TEXT_152 = " getEValidator()" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return ";
	protected final String TEXT_153 = ".INSTANCE;" + NL + "\t\t\t\t }" + NL + "\t\t\t });" + NL;
	protected final String TEXT_154 = NL + "\t\t// Mark meta-data to indicate it can't be changed" + NL + "\t\tthe";
	protected final String TEXT_155 = ".freeze();" + NL;
	protected final String TEXT_156 = NL + "  " + NL + "\t\t// Update the registry and return the package" + NL
			+ "\t\t";
	protected final String TEXT_157 = ".Registry.INSTANCE.put(";
	protected final String TEXT_158 = ".eNS_URI, the";
	protected final String TEXT_159 = ");" + NL + "\t\treturn the";
	protected final String TEXT_160 = ";" + NL + "\t}";
	protected final String TEXT_161 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tpublic static void initializeRegistryHelpers()" + NL + "\t{";
	protected final String TEXT_162 = NL + "\t\t";
	protected final String TEXT_163 = ".register" + NL + "\t\t\t(";
	protected final String TEXT_164 = ".class, " + NL + "\t\t\t new ";
	protected final String TEXT_165 = ".Helper() " + NL + "\t\t\t {" + NL
			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
			+ "\t\t\t\t\t return instance instanceof ";
	protected final String TEXT_166 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {" + NL + "\t\t\t\t\t return new ";
	protected final String TEXT_167 = "[size];" + NL + "\t\t\t\t }" + NL + "\t\t\t });";
	protected final String TEXT_168 = NL + "\t\t";
	protected final String TEXT_169 = ".register" + NL + "\t\t\t(";
	protected final String TEXT_170 = ".class, " + NL + "\t\t\t new ";
	protected final String TEXT_171 = ".Helper() " + NL + "\t\t\t {" + NL
			+ "\t\t\t\t public boolean isInstance(Object instance)" + NL + "\t\t\t\t {" + NL
			+ "\t\t\t\t\t return instance instanceof ";
	protected final String TEXT_172 = ";" + NL + "\t\t\t\t }" + NL + "" + NL
			+ "\t\t\t\t public Object newArrayInstance(int size)" + NL + "\t\t\t\t {";
	protected final String TEXT_173 = NL + "\t\t\t\t\t return new ";
	protected final String TEXT_174 = "[size]";
	protected final String TEXT_175 = ";";
	protected final String TEXT_176 = NL + "\t\t\t\t\t return new ";
	protected final String TEXT_177 = "[size];";
	protected final String TEXT_178 = NL + "\t\t\t\t }" + NL + "\t\t});";
	protected final String TEXT_179 = NL + "\t}" + NL + "" + NL + "" + NL + "\t/**" + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic static class WhiteList implements ";
	protected final String TEXT_180 = ", EBasicWhiteList" + NL + "\t{";
	protected final String TEXT_181 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_182 = " ";
	protected final String TEXT_183 = ";" + NL;
	protected final String TEXT_184 = NL + "\t\t/**" + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\tprotected ";
	protected final String TEXT_185 = " ";
	protected final String TEXT_186 = ";" + NL;
	protected final String TEXT_187 = NL + "\t}";
	protected final String TEXT_188 = NL;
	protected final String TEXT_189 = NL;
	protected final String TEXT_190 = NL + "\t/**";
	protected final String TEXT_191 = NL + "\t * Returns the meta object for class '{@link ";
	protected final String TEXT_192 = " <em>";
	protected final String TEXT_193 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for class '<em>";
	protected final String TEXT_194 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_195 = NL + "\t * @model ";
	protected final String TEXT_196 = NL + "\t *        ";
	protected final String TEXT_197 = NL + "\t * @model";
	protected final String TEXT_198 = NL + "\t * Returns the meta object for enum '{@link ";
	protected final String TEXT_199 = " <em>";
	protected final String TEXT_200 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for enum '<em>";
	protected final String TEXT_201 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_202 = NL + "\t * Returns the meta object for data type '<em>";
	protected final String TEXT_203 = "</em>'.";
	protected final String TEXT_204 = NL + "\t * Returns the meta object for data type '{@link ";
	protected final String TEXT_205 = " <em>";
	protected final String TEXT_206 = "</em>}'.";
	protected final String TEXT_207 = NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @return the meta object for data type '<em>";
	protected final String TEXT_208 = "</em>'.";
	protected final String TEXT_209 = NL + "\t * @see ";
	protected final String TEXT_210 = NL + "\t * @model ";
	protected final String TEXT_211 = NL + "\t *        ";
	protected final String TEXT_212 = NL + "\t * @model";
	protected final String TEXT_213 = NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_214 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_215 = NL + "\tpublic ";
	protected final String TEXT_216 = " get";
	protected final String TEXT_217 = "()" + NL + "\t{";
	protected final String TEXT_218 = NL + "\t\tif (";
	protected final String TEXT_219 = " == null)" + NL + "\t\t{" + NL + "\t\t\t";
	protected final String TEXT_220 = " = (";
	protected final String TEXT_221 = ")";
	protected final String TEXT_222 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_223 = ".eNS_URI).getEClassifiers().get(";
	protected final String TEXT_224 = ");" + NL + "\t\t}";
	protected final String TEXT_225 = NL + "\t\treturn ";
	protected final String TEXT_226 = ";" + NL + "\t}" + NL;
	protected final String TEXT_227 = NL + "\t";
	protected final String TEXT_228 = " get";
	protected final String TEXT_229 = "();" + NL;
	protected final String TEXT_230 = NL + "\t/**" + NL + "\t * Returns the meta object for the ";
	protected final String TEXT_231 = " '{@link ";
	protected final String TEXT_232 = "#";
	protected final String TEXT_233 = " <em>";
	protected final String TEXT_234 = "</em>}'." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the ";
	protected final String TEXT_235 = " '<em>";
	protected final String TEXT_236 = "</em>'." + NL + "\t * @see ";
	protected final String TEXT_237 = "#";
	protected final String TEXT_238 = "()";
	protected final String TEXT_239 = NL + "\t * @see #get";
	protected final String TEXT_240 = "()" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_241 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_242 = NL + "\tpublic ";
	protected final String TEXT_243 = " get";
	protected final String TEXT_244 = "()" + NL + "\t{";
	protected final String TEXT_245 = NL + "\t\treturn (";
	protected final String TEXT_246 = ")";
	protected final String TEXT_247 = ".getEStructuralFeatures().get(";
	protected final String TEXT_248 = ");";
	protected final String TEXT_249 = NL + "        return (";
	protected final String TEXT_250 = ")get";
	protected final String TEXT_251 = "().getEStructuralFeatures().get(";
	protected final String TEXT_252 = ");";
	protected final String TEXT_253 = NL + "\t}";
	protected final String TEXT_254 = NL + "\t";
	protected final String TEXT_255 = " get";
	protected final String TEXT_256 = "();";
	protected final String TEXT_257 = NL;
	protected final String TEXT_258 = NL + "\t/**" + NL + "\t * Returns the meta object for the '{@link ";
	protected final String TEXT_259 = "#";
	protected final String TEXT_260 = "(";
	protected final String TEXT_261 = ") <em>";
	protected final String TEXT_262 = "</em>}' operation." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @return the meta object for the '<em>";
	protected final String TEXT_263 = "</em>' operation." + NL + "\t * @see ";
	protected final String TEXT_264 = "#";
	protected final String TEXT_265 = "(";
	protected final String TEXT_266 = ")" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_267 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_268 = NL + "\tpublic ";
	protected final String TEXT_269 = " get";
	protected final String TEXT_270 = "()" + NL + "\t{";
	protected final String TEXT_271 = NL + "\t\treturn ";
	protected final String TEXT_272 = ".getEOperations().get(";
	protected final String TEXT_273 = ");";
	protected final String TEXT_274 = NL + "        return get";
	protected final String TEXT_275 = "().getEOperations().get(";
	protected final String TEXT_276 = ");";
	protected final String TEXT_277 = NL + "\t}";
	protected final String TEXT_278 = NL + "\t";
	protected final String TEXT_279 = " get";
	protected final String TEXT_280 = "();";
	protected final String TEXT_281 = NL;
	protected final String TEXT_282 = NL + "\t/**" + NL
			+ "\t * Returns the factory that creates the instances of the model." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL
			+ "\t * @return the factory that creates the instances of the model." + NL + "\t * @generated" + NL
			+ "\t */";
	protected final String TEXT_283 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_284 = NL + "\tpublic ";
	protected final String TEXT_285 = " get";
	protected final String TEXT_286 = "()" + NL + "\t{" + NL + "\t\treturn (";
	protected final String TEXT_287 = ")getEFactoryInstance();" + NL + "\t}";
	protected final String TEXT_288 = NL + "\t";
	protected final String TEXT_289 = " get";
	protected final String TEXT_290 = "();";
	protected final String TEXT_291 = NL;
	protected final String TEXT_292 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isCreated = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Creates the meta-model objects for the package.  This method is" + NL
			+ "\t * guarded to have no affect on any invocation but its first." + NL + "\t * <!-- begin-user-doc -->"
			+ NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tpublic void createPackageContents()" + NL + "\t{" + NL + "\t\tif (isCreated) return;" + NL
			+ "\t\tisCreated = true;";
	protected final String TEXT_293 = NL + NL + "\t\t// Create classes and their features";
	protected final String TEXT_294 = NL + "\t\t";
	protected final String TEXT_295 = " = create";
	protected final String TEXT_296 = "(";
	protected final String TEXT_297 = ");";
	protected final String TEXT_298 = NL + "\t\tcreate";
	protected final String TEXT_299 = "(";
	protected final String TEXT_300 = ", ";
	protected final String TEXT_301 = ");";
	protected final String TEXT_302 = NL + "\t\tcreateEOperation(";
	protected final String TEXT_303 = ", ";
	protected final String TEXT_304 = ");";
	protected final String TEXT_305 = NL;
	protected final String TEXT_306 = NL + NL + "\t\t// Create enums";
	protected final String TEXT_307 = NL + "\t\t";
	protected final String TEXT_308 = " = createEEnum(";
	protected final String TEXT_309 = ");";
	protected final String TEXT_310 = NL + NL + "\t\t// Create data types";
	protected final String TEXT_311 = NL + "\t\t";
	protected final String TEXT_312 = " = createEDataType(";
	protected final String TEXT_313 = ");";
	protected final String TEXT_314 = NL + "\t}" + NL + "" + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isInitialized = false;" + NL;
	protected final String TEXT_315 = NL + "\t/**" + NL
			+ "\t * Complete the initialization of the package and its meta-model.  This" + NL
			+ "\t * method is guarded to have no affect on any invocation but its first." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void initializePackageContents()" + NL + "\t{" + NL + "\t\tif (isInitialized) return;" + NL
			+ "\t\tisInitialized = true;" + NL + "" + NL + "\t\t// Initialize package" + NL + "\t\tsetName(eNAME);" + NL
			+ "\t\tsetNsPrefix(eNS_PREFIX);" + NL + "\t\tsetNsURI(eNS_URI);";
	protected final String TEXT_316 = NL + NL + "\t\t// Obtain other dependent packages";
	protected final String TEXT_317 = NL + "\t\t";
	protected final String TEXT_318 = " ";
	protected final String TEXT_319 = " = (";
	protected final String TEXT_320 = ")";
	protected final String TEXT_321 = ".Registry.INSTANCE.getEPackage(";
	protected final String TEXT_322 = ".eNS_URI);";
	protected final String TEXT_323 = NL + NL + "\t\t// Add subpackages";
	protected final String TEXT_324 = NL + "\t\tgetESubpackages().add(";
	protected final String TEXT_325 = ");";
	protected final String TEXT_326 = NL + NL + "\t\t// Create type parameters";
	protected final String TEXT_327 = NL + "\t\t";
	protected final String TEXT_328 = " ";
	protected final String TEXT_329 = "_";
	protected final String TEXT_330 = " = addETypeParameter(";
	protected final String TEXT_331 = ", \"";
	protected final String TEXT_332 = "\");";
	protected final String TEXT_333 = NL + "\t\taddETypeParameter(";
	protected final String TEXT_334 = ", \"";
	protected final String TEXT_335 = "\");";
	protected final String TEXT_336 = NL + NL + "\t\t// Set bounds for type parameters";
	protected final String TEXT_337 = NL + "\t\t";
	protected final String TEXT_338 = "g";
	protected final String TEXT_339 = " = createEGenericType(";
	protected final String TEXT_340 = ");";
	protected final String TEXT_341 = NL + "\t\tg";
	protected final String TEXT_342 = ".";
	protected final String TEXT_343 = "(g";
	protected final String TEXT_344 = ");";
	protected final String TEXT_345 = NL + "\t\t";
	protected final String TEXT_346 = "_";
	protected final String TEXT_347 = ".getEBounds().add(g1);";
	protected final String TEXT_348 = NL + NL + "\t\t// Add supertypes to classes";
	protected final String TEXT_349 = NL + "\t\t";
	protected final String TEXT_350 = ".getESuperTypes().add(";
	protected final String TEXT_351 = ".get";
	protected final String TEXT_352 = "());";
	protected final String TEXT_353 = NL + "\t\t";
	protected final String TEXT_354 = "g";
	protected final String TEXT_355 = " = createEGenericType(";
	protected final String TEXT_356 = ");";
	protected final String TEXT_357 = NL + "\t\tg";
	protected final String TEXT_358 = ".";
	protected final String TEXT_359 = "(g";
	protected final String TEXT_360 = ");";
	protected final String TEXT_361 = NL + "\t\t";
	protected final String TEXT_362 = ".getEGenericSuperTypes().add(g1);";
	protected final String TEXT_363 = NL + NL + "\t\t// Initialize classes";
	protected final String TEXT_364 = ", features, and operations; add parameters";
	protected final String TEXT_365 = " and features; add operations and parameters";
	protected final String TEXT_366 = NL + "\t\tinitEClass(";
	protected final String TEXT_367 = ", ";
	protected final String TEXT_368 = "null";
	protected final String TEXT_369 = ".class";
	protected final String TEXT_370 = ", \"";
	protected final String TEXT_371 = "\", ";
	protected final String TEXT_372 = ", ";
	protected final String TEXT_373 = ", ";
	protected final String TEXT_374 = ", \"";
	protected final String TEXT_375 = "\"";
	protected final String TEXT_376 = ");";
	protected final String TEXT_377 = NL + "\t\t";
	protected final String TEXT_378 = "g";
	protected final String TEXT_379 = " = createEGenericType(";
	protected final String TEXT_380 = ");";
	protected final String TEXT_381 = NL + "\t\tg";
	protected final String TEXT_382 = ".";
	protected final String TEXT_383 = "(g";
	protected final String TEXT_384 = ");";
	protected final String TEXT_385 = NL + "\t\tinitEReference(get";
	protected final String TEXT_386 = "(), ";
	protected final String TEXT_387 = "g1";
	protected final String TEXT_388 = ".get";
	protected final String TEXT_389 = "()";
	protected final String TEXT_390 = ", ";
	protected final String TEXT_391 = ", \"";
	protected final String TEXT_392 = "\", ";
	protected final String TEXT_393 = ", ";
	protected final String TEXT_394 = ", ";
	protected final String TEXT_395 = ", ";
	protected final String TEXT_396 = ", ";
	protected final String TEXT_397 = ", ";
	protected final String TEXT_398 = ", ";
	protected final String TEXT_399 = ", ";
	protected final String TEXT_400 = ", ";
	protected final String TEXT_401 = ", ";
	protected final String TEXT_402 = ", ";
	protected final String TEXT_403 = ", ";
	protected final String TEXT_404 = ", ";
	protected final String TEXT_405 = ");";
	protected final String TEXT_406 = NL + "\t\tget";
	protected final String TEXT_407 = "().getEKeys().add(";
	protected final String TEXT_408 = ".get";
	protected final String TEXT_409 = "());";
	protected final String TEXT_410 = NL + "\t\tinitEAttribute(get";
	protected final String TEXT_411 = "(), ";
	protected final String TEXT_412 = "g1";
	protected final String TEXT_413 = ".get";
	protected final String TEXT_414 = "()";
	protected final String TEXT_415 = ", \"";
	protected final String TEXT_416 = "\", ";
	protected final String TEXT_417 = ", ";
	protected final String TEXT_418 = ", ";
	protected final String TEXT_419 = ", ";
	protected final String TEXT_420 = ", ";
	protected final String TEXT_421 = ", ";
	protected final String TEXT_422 = ", ";
	protected final String TEXT_423 = ", ";
	protected final String TEXT_424 = ", ";
	protected final String TEXT_425 = ", ";
	protected final String TEXT_426 = ", ";
	protected final String TEXT_427 = ", ";
	protected final String TEXT_428 = ");";
	protected final String TEXT_429 = NL;
	protected final String TEXT_430 = NL + "\t\t";
	protected final String TEXT_431 = "initEOperation(get";
	protected final String TEXT_432 = "()";
	protected final String TEXT_433 = "addEOperation(";
	protected final String TEXT_434 = ", ";
	protected final String TEXT_435 = "null";
	protected final String TEXT_436 = ".get";
	protected final String TEXT_437 = "()";
	protected final String TEXT_438 = ", \"";
	protected final String TEXT_439 = "\", ";
	protected final String TEXT_440 = ", ";
	protected final String TEXT_441 = ", ";
	protected final String TEXT_442 = ", ";
	protected final String TEXT_443 = ");";
	protected final String TEXT_444 = NL + "\t\t";
	protected final String TEXT_445 = "initEOperation(get";
	protected final String TEXT_446 = "()";
	protected final String TEXT_447 = "addEOperation(";
	protected final String TEXT_448 = ", ";
	protected final String TEXT_449 = ".get";
	protected final String TEXT_450 = "(), \"";
	protected final String TEXT_451 = "\", ";
	protected final String TEXT_452 = ", ";
	protected final String TEXT_453 = ", ";
	protected final String TEXT_454 = ", ";
	protected final String TEXT_455 = ");";
	protected final String TEXT_456 = NL + "\t\t";
	protected final String TEXT_457 = "initEOperation(get";
	protected final String TEXT_458 = "()";
	protected final String TEXT_459 = "addEOperation(";
	protected final String TEXT_460 = ", ";
	protected final String TEXT_461 = ".get";
	protected final String TEXT_462 = "(), \"";
	protected final String TEXT_463 = "\", ";
	protected final String TEXT_464 = ", ";
	protected final String TEXT_465 = ");";
	protected final String TEXT_466 = NL + "\t\t";
	protected final String TEXT_467 = "initEOperation(get";
	protected final String TEXT_468 = "()";
	protected final String TEXT_469 = "addEOperation(";
	protected final String TEXT_470 = ", null, \"";
	protected final String TEXT_471 = "\");";
	protected final String TEXT_472 = NL + "\t\t";
	protected final String TEXT_473 = "addETypeParameter(op, \"";
	protected final String TEXT_474 = "\");";
	protected final String TEXT_475 = NL + "\t\t";
	protected final String TEXT_476 = "g";
	protected final String TEXT_477 = " = createEGenericType(";
	protected final String TEXT_478 = ");";
	protected final String TEXT_479 = NL + "\t\tg";
	protected final String TEXT_480 = ".";
	protected final String TEXT_481 = "(g";
	protected final String TEXT_482 = ");";
	protected final String TEXT_483 = NL + "\t\tt";
	protected final String TEXT_484 = ".getEBounds().add(g1);";
	protected final String TEXT_485 = NL + "\t\t";
	protected final String TEXT_486 = "g";
	protected final String TEXT_487 = " = createEGenericType(";
	protected final String TEXT_488 = ");";
	protected final String TEXT_489 = NL + "\t\tg";
	protected final String TEXT_490 = ".";
	protected final String TEXT_491 = "(g";
	protected final String TEXT_492 = ");";
	protected final String TEXT_493 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_494 = "g1";
	protected final String TEXT_495 = ".get";
	protected final String TEXT_496 = "()";
	protected final String TEXT_497 = ", \"";
	protected final String TEXT_498 = "\", ";
	protected final String TEXT_499 = ", ";
	protected final String TEXT_500 = ", ";
	protected final String TEXT_501 = ", ";
	protected final String TEXT_502 = ");";
	protected final String TEXT_503 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_504 = "g1";
	protected final String TEXT_505 = ".get";
	protected final String TEXT_506 = "()";
	protected final String TEXT_507 = ", \"";
	protected final String TEXT_508 = "\", ";
	protected final String TEXT_509 = ", ";
	protected final String TEXT_510 = ", ";
	protected final String TEXT_511 = ", ";
	protected final String TEXT_512 = ");";
	protected final String TEXT_513 = NL + "\t\taddEParameter(op, ";
	protected final String TEXT_514 = "g1";
	protected final String TEXT_515 = ".get";
	protected final String TEXT_516 = "()";
	protected final String TEXT_517 = ", \"";
	protected final String TEXT_518 = "\", ";
	protected final String TEXT_519 = ", ";
	protected final String TEXT_520 = ");";
	protected final String TEXT_521 = NL + "\t\t";
	protected final String TEXT_522 = "g";
	protected final String TEXT_523 = " = createEGenericType(";
	protected final String TEXT_524 = ");";
	protected final String TEXT_525 = NL + "\t\tg";
	protected final String TEXT_526 = ".";
	protected final String TEXT_527 = "(g";
	protected final String TEXT_528 = ");";
	protected final String TEXT_529 = NL + "\t\taddEException(op, g";
	protected final String TEXT_530 = ");";
	protected final String TEXT_531 = NL + "\t\taddEException(op, ";
	protected final String TEXT_532 = ".get";
	protected final String TEXT_533 = "());";
	protected final String TEXT_534 = NL + "\t\t";
	protected final String TEXT_535 = "g";
	protected final String TEXT_536 = " = createEGenericType(";
	protected final String TEXT_537 = ");";
	protected final String TEXT_538 = NL + "\t\tg";
	protected final String TEXT_539 = ".";
	protected final String TEXT_540 = "(g";
	protected final String TEXT_541 = ");";
	protected final String TEXT_542 = NL + "\t\tinitEOperation(op, g1);";
	protected final String TEXT_543 = NL;
	protected final String TEXT_544 = NL + NL + "\t\t// Initialize enums and add enum literals";
	protected final String TEXT_545 = NL + "\t\tinitEEnum(";
	protected final String TEXT_546 = ", ";
	protected final String TEXT_547 = ".class, \"";
	protected final String TEXT_548 = "\");";
	protected final String TEXT_549 = NL + "\t\taddEEnumLiteral(";
	protected final String TEXT_550 = ", ";
	protected final String TEXT_551 = ".";
	protected final String TEXT_552 = ");";
	protected final String TEXT_553 = NL;
	protected final String TEXT_554 = NL + NL + "\t\t// Initialize data types";
	protected final String TEXT_555 = NL + "\t\tinitEDataType(";
	protected final String TEXT_556 = ", ";
	protected final String TEXT_557 = ".class, \"";
	protected final String TEXT_558 = "\", ";
	protected final String TEXT_559 = ", ";
	protected final String TEXT_560 = ", \"";
	protected final String TEXT_561 = "\"";
	protected final String TEXT_562 = ");";
	protected final String TEXT_563 = NL + NL + "\t\t// Create resource" + NL + "\t\tcreateResource(";
	protected final String TEXT_564 = ");";
	protected final String TEXT_565 = NL + NL + "\t\t// Create annotations";
	protected final String TEXT_566 = NL + "\t\t// ";
	protected final String TEXT_567 = NL + "\t\tcreate";
	protected final String TEXT_568 = "Annotations();";
	protected final String TEXT_569 = NL + "\t}" + NL;
	protected final String TEXT_570 = NL + "\t/**" + NL + "\t * Initializes the annotations for <b>";
	protected final String TEXT_571 = "</b>." + NL + "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->"
			+ NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected void create";
	protected final String TEXT_572 = "Annotations()" + NL + "\t{" + NL + "\t\tString source = ";
	protected final String TEXT_573 = "null;";
	protected final String TEXT_574 = "\"";
	protected final String TEXT_575 = "\";";
	protected final String TEXT_576 = "\t" + NL + "\t\taddAnnotation" + NL + "\t\t  (";
	protected final String TEXT_577 = ", " + NL + "\t\t   source, " + NL + "\t\t   new String[] " + NL + "\t\t   {";
	protected final String TEXT_578 = NL + "\t\t\t ";
	protected final String TEXT_579 = ", ";
	protected final String TEXT_580 = NL + "\t\t   }";
	protected final String TEXT_581 = ");";
	protected final String TEXT_582 = ",";
	protected final String TEXT_583 = NL + "\t\t   new ";
	protected final String TEXT_584 = "[] " + NL + "\t\t   {";
	protected final String TEXT_585 = NL + "\t\t\t ";
	protected final String TEXT_586 = ".createURI(";
	protected final String TEXT_587 = ".";
	protected final String TEXT_588 = "eNS_URI).appendFragment(\"";
	protected final String TEXT_589 = "\")";
	protected final String TEXT_590 = ",";
	protected final String TEXT_591 = NL + "\t\t   });";
	protected final String TEXT_592 = NL + "\t\taddAnnotation" + NL + "\t\t  (";
	protected final String TEXT_593 = ", " + NL + "\t\t   ";
	protected final String TEXT_594 = "new boolean[] { ";
	protected final String TEXT_595 = " }";
	protected final String TEXT_596 = "," + NL + "\t\t   ";
	protected final String TEXT_597 = "null,";
	protected final String TEXT_598 = "\"";
	protected final String TEXT_599 = "\",";
	protected final String TEXT_600 = NL + "\t\t   new String[] " + NL + "\t\t   {";
	protected final String TEXT_601 = NL + "\t\t\t ";
	protected final String TEXT_602 = ", ";
	protected final String TEXT_603 = NL + "\t\t   }";
	protected final String TEXT_604 = ");";
	protected final String TEXT_605 = ",";
	protected final String TEXT_606 = NL + "\t\t   new ";
	protected final String TEXT_607 = "[] " + NL + "\t\t   {";
	protected final String TEXT_608 = NL + "\t\t\t ";
	protected final String TEXT_609 = ".createURI(";
	protected final String TEXT_610 = ".";
	protected final String TEXT_611 = "eNS_URI).appendFragment(\"";
	protected final String TEXT_612 = "\")";
	protected final String TEXT_613 = ",";
	protected final String TEXT_614 = NL + "\t\t   });";
	protected final String TEXT_615 = NL + "\t}" + NL;
	protected final String TEXT_616 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isLoaded = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Laods the package and any sub-packages from their serialized form." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void loadPackage()" + NL + "\t{" + NL + "\t\tif (isLoaded) return;" + NL
			+ "\t\tisLoaded = true;" + NL + "" + NL + "\t\t";
	protected final String TEXT_617 = " url = getClass().getResource(packageFilename);" + NL + "\t\tif (url == null)"
			+ NL + "\t\t{" + NL
			+ "\t\t\tthrow new RuntimeException(\"Missing serialized package: \" + packageFilename);";
	protected final String TEXT_618 = NL + "\t\t}" + NL + "\t\t";
	protected final String TEXT_619 = " uri = ";
	protected final String TEXT_620 = ".createURI(url.toString());" + NL + "\t\t";
	protected final String TEXT_621 = " resource = new ";
	protected final String TEXT_622 = "().createResource(uri);" + NL + "\t\ttry" + NL + "\t\t{" + NL
			+ "\t\t\tresource.load(null);" + NL + "\t\t}" + NL + "\t\tcatch (";
	protected final String TEXT_623 = " exception)" + NL + "\t\t{" + NL + "\t\t\tthrow new ";
	protected final String TEXT_624 = "(exception);" + NL + "\t\t}" + NL + "\t\tinitializeFromLoadedEPackage(this, (";
	protected final String TEXT_625 = ")resource.getContents().get(0));" + NL + "\t\tcreateResource(eNS_URI);" + NL
			+ "\t}" + NL;
	protected final String TEXT_626 = NL + NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL
			+ "\tprivate boolean isFixed = false;" + NL + "" + NL + "\t/**" + NL
			+ "\t * Fixes up the loaded package, to make it appear as if it had been programmatically built." + NL
			+ "\t * <!-- begin-user-doc -->" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */"
			+ NL + "\tpublic void fixPackageContents()" + NL + "\t{" + NL + "\t\tif (isFixed) return;" + NL
			+ "\t\tisFixed = true;" + NL + "\t\tfixEClassifiers();" + NL + "\t}" + NL + "" + NL + "\t/**" + NL
			+ "\t * Sets the instance class on the given classifier." + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */";
	protected final String TEXT_627 = NL + "\t@Override";
	protected final String TEXT_628 = NL + "\tprotected void fixInstanceClass(";
	protected final String TEXT_629 = " eClassifier)" + NL + "\t{" + NL
			+ "\t\tif (eClassifier.getInstanceClassName() == null)" + NL + "\t\t{";
	protected final String TEXT_630 = NL + "\t\t\teClassifier.setInstanceClassName(\"";
	protected final String TEXT_631 = ".\" + eClassifier.getName());";
	protected final String TEXT_632 = NL + "\t\t\tsetGeneratedClassName(eClassifier);";
	protected final String TEXT_633 = NL + "\t\t\tswitch (eClassifier.getClassifierID())" + NL + "\t\t\t{";
	protected final String TEXT_634 = NL + "\t\t\t\tcase ";
	protected final String TEXT_635 = ":";
	protected final String TEXT_636 = NL + "\t\t\t\t{" + NL + "\t\t\t\t\tbreak;" + NL + "\t\t\t\t}" + NL
			+ "\t\t\t\tdefault:" + NL + "\t\t\t\t{" + NL + "\t\t\t\t\teClassifier.setInstanceClassName(\"";
	protected final String TEXT_637 = ".\" + eClassifier.getName());";
	protected final String TEXT_638 = NL + "\t\t\t\t\tsetGeneratedClassName(eClassifier);" + NL + "\t\t\t\t\tbreak;"
			+ NL + "\t\t\t\t}" + NL + "\t\t\t}";
	protected final String TEXT_639 = NL + "\t\t}" + NL + "\t}" + NL;
	protected final String TEXT_640 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_641 = " addEOperation(";
	protected final String TEXT_642 = " owner, ";
	protected final String TEXT_643 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
			+ NL + "\t{" + NL + "\t\t";
	protected final String TEXT_644 = " o = addEOperation(owner, type, name, lowerBound, upperBound);" + NL
			+ "\t\to.setUnique(isUnique);" + NL + "\t\to.setOrdered(isOrdered);" + NL + "\t\treturn o;" + NL + "\t}"
			+ NL + "\t";
	protected final String TEXT_645 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\tprotected ";
	protected final String TEXT_646 = " addEParameter(";
	protected final String TEXT_647 = " owner, ";
	protected final String TEXT_648 = " type, String name, int lowerBound, int upperBound, boolean isUnique, boolean isOrdered)"
			+ NL + "\t{" + NL + "\t\t";
	protected final String TEXT_649 = " p = ecoreFactory.createEParameter();" + NL + "\t\tp.setEType(type);" + NL
			+ "\t\tp.setName(name);" + NL + "\t\tp.setLowerBound(lowerBound);" + NL + "\t\tp.setUpperBound(upperBound);"
			+ NL + "\t\tp.setUnique(isUnique);" + NL + "\t\tp.setOrdered(isOrdered);" + NL
			+ "\t\towner.getEParameters().add(p);" + NL + "\t\treturn p;" + NL + "\t}" + NL + "\t";
	protected final String TEXT_650 = NL + "\t/**" + NL + "\t * <!-- begin-user-doc -->" + NL
			+ "\t * Defines literals for the meta objects that represent" + NL + "\t * <ul>" + NL
			+ "\t *   <li>each class,</li>" + NL + "\t *   <li>each feature of each class,</li>";
	protected final String TEXT_651 = NL + "\t *   <li>each operation of each class,</li>";
	protected final String TEXT_652 = NL + "\t *   <li>each enum,</li>" + NL + "\t *   <li>and each data type</li>" + NL
			+ "\t * </ul>" + NL + "\t * <!-- end-user-doc -->" + NL + "\t * @generated" + NL + "\t */" + NL + "\t";
	protected final String TEXT_653 = "public ";
	protected final String TEXT_654 = "interface Literals" + NL + "\t{";
	protected final String TEXT_655 = NL + "\t\t/**";
	protected final String TEXT_656 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_657 = " <em>";
	protected final String TEXT_658 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_659 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_660 = " <em>";
	protected final String TEXT_661 = "</em>}' class." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_662 = NL + "\t\t * The meta object literal for the '{@link ";
	protected final String TEXT_663 = " <em>";
	protected final String TEXT_664 = "</em>}' enum." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @see ";
	protected final String TEXT_665 = NL + "\t\t * The meta object literal for the '<em>";
	protected final String TEXT_666 = "</em>' data type." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->";
	protected final String TEXT_667 = NL + "\t\t * @see ";
	protected final String TEXT_668 = NL + "\t\t * @see ";
	protected final String TEXT_669 = "#get";
	protected final String TEXT_670 = "()" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_671 = " ";
	protected final String TEXT_672 = " = eINSTANCE.get";
	protected final String TEXT_673 = "();" + NL;
	protected final String TEXT_674 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
	protected final String TEXT_675 = "</b></em>' ";
	protected final String TEXT_676 = " feature." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_677 = " ";
	protected final String TEXT_678 = " = eINSTANCE.get";
	protected final String TEXT_679 = "();" + NL;
	protected final String TEXT_680 = NL + "\t\t/**" + NL + "\t\t * The meta object literal for the '<em><b>";
	protected final String TEXT_681 = "</b></em>' operation." + NL + "\t\t * <!-- begin-user-doc -->" + NL
			+ "\t\t * <!-- end-user-doc -->" + NL + "\t\t * @generated" + NL + "\t\t */" + NL + "\t\t";
	protected final String TEXT_682 = " ";
	protected final String TEXT_683 = " = eINSTANCE.get";
	protected final String TEXT_684 = "();" + NL;
	protected final String TEXT_685 = NL + "\t}" + NL;
	protected final String TEXT_686 = NL + "} //";
	protected final String TEXT_687 = NL;
	protected final String TEXT_688 = NL;
	protected final String TEXT_689 = NL;

	public PackageClass() {
		//Here is the constructor
		StringBuffer stringBuffer = new StringBuffer();

		// add initialisation of the pattern variables (declaration has been already done).

	}

	public String generate(Object argument) throws Exception {
		final StringBuffer stringBuffer = new StringBuffer();

		InternalPatternContext ctx = (InternalPatternContext) argument;
		Map<String, String> queryCtx = null;
		IQuery.ParameterDescription paramDesc = null;
		Node.Container currentNode = ctx.getNode();

		List<Object> parameterList = null;
		//this pattern can only be called by another (i.e. it's not an entry point in execution)

		for (Object parameterParameter : parameterList) {

			this.parameter = (org.eclipse.emf.codegen.ecore.genmodel.GenPackage) parameterParameter;

			if (preCondition(ctx)) {
				ctx.setNode(new Node.Container(currentNode, getClass()));
				orchestration(ctx);
			}

		}
		ctx.setNode(currentNode);
		if (ctx.useReporter()) {
			ctx.getReporter().executionFinished(OutputManager.computeExecutionOutput(ctx), ctx);
		}

		stringBuffer.append(TEXT_688);
		stringBuffer.append(TEXT_689);
		return stringBuffer.toString();
	}

	public String orchestration(PatternContext ctx) throws Exception {
		InternalPatternContext ictx = (InternalPatternContext) ctx;

		super.orchestration(new SuperOrchestrationContext(ictx));

		method_preGenerate(new StringBuffer(), ictx);

		method_doGenerate(new StringBuffer(), ictx);
		{
			final Map<String, Object> parameters = getParameters();
			CallbackContext ctx_callback = new CallbackContext(ictx);
			CallHelper.callBack(ctx_callback, parameters);
		}

		method_postGenerate(new StringBuffer(), ictx);

		if (ictx.useReporter()) {
			Map<String, Object> parameterValues = new HashMap<String, Object>();
			parameterValues.put("parameter", this.parameter);
			String outputWithCallBack = OutputManager.computeLoopOutput(ictx);
			String loop = OutputManager.computeLoopOutputWithoutCallback(ictx);
			ictx.getReporter().loopFinished(loop, outputWithCallBack, ictx, parameterValues);
		}
		return null;
	}

	public Map<String, Object> getParameters() {
		final Map<String, Object> parameters = new HashMap<String, Object>();
		parameters.put("parameter", this.parameter);
		return parameters;
	}

	protected void method_setReporterVariables(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		GenPackage genPackage = parameter;
		targetPath = genPackage.getGenModel().getModelDirectory();
		packageName = genPackage.getReflectionClassPackageName();
		className = genPackage.getPackageClassName();

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setReporterVariables", stringBuffer.toString());
	}

	protected void method_setArgument(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		GenPackage genPackage = parameter;
		argument = ((Object[]) new Object[] {
				new Object[] { genPackage,
						genPackage.getGenModel().isSuppressEMFMetaData()
								|| genPackage.getGenModel().isSuppressInterfaces() ? Boolean.TRUE : Boolean.FALSE,
						Boolean.TRUE } })[0];

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "setArgument", stringBuffer.toString());
	}

	protected void method_ensureProjectExists(final StringBuffer stringBuffer, final PatternContext ctx)
			throws Exception {

		new CodegenGeneratorAdapter(parameter).ensureProjectExists(genModel.getModelDirectory(), genModel,
				GenBaseGeneratorAdapter.MODEL_PROJECT_TYPE, genModel.isUpdateClasspath(), new BasicMonitor());

		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "ensureProjectExists", stringBuffer.toString());
	}

	protected void method_doGenerate(final StringBuffer stringBuffer, final PatternContext ctx) throws Exception {

		/**
		 * Copyright (c) 2002-2010 IBM Corporation and others.
		 * All rights reserved.   This program and the accompanying materials
		 * are made available under the terms of the Eclipse Public License v1.0
		 * which accompanies this distribution, and is available at
		 * http://www.eclipse.org/legal/epl-v10.html
		 *
		 * Contributors:
		 *   IBM - Initial API and implementation
		 */

		final GenPackage genPackage = (GenPackage) ((Object[]) argument)[0];
		final GenModel genModel = genPackage.getGenModel();
		boolean isInterface = Boolean.TRUE.equals(((Object[]) argument)[1]);
		boolean isImplementation = Boolean.TRUE.equals(((Object[]) argument)[2]);
		String publicStaticFinalFlag = isImplementation ? "public static final " : "";
		boolean needsAddEOperation = false;
		boolean needsAddEParameter = false;
		stringBuffer.append(TEXT_1);
		{
			//<%@ egf:patternCall patternId="platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#LogicalName=org.eclipse.egf.emf.pattern.base.HeaderJava" args="parameter:argument"%>

			InternalPatternContext ictx = (InternalPatternContext) ctx;
			new Node.DataLeaf(ictx.getNode(), getClass(), null, stringBuffer.toString());
			stringBuffer.setLength(0);

			final Map<String, Object> callParameters = new HashMap<String, Object>();
			callParameters.put("argument", parameter);
			CallHelper.executeWithParameterInjection(
					"platform:/plugin/org.eclipse.egf.emf.pattern.base/egf/EMF_Pattern_Base.fcore#_XHLrsCwtEd-jc5T-XaRJlg",
					new ExecutionContext((InternalPatternContext) ctx), callParameters);
			stringBuffer.setLength(0);
		}

		if (isImplementation && !genModel.isSuppressInterfaces()) {
			stringBuffer.append(TEXT_2);
			stringBuffer.append(genPackage.getClassPackageName());
			stringBuffer.append(TEXT_3);
		} else {
			stringBuffer.append(TEXT_4);
			stringBuffer.append(genPackage.getReflectionPackageName());
			stringBuffer.append(TEXT_5);
		}
		stringBuffer.append(TEXT_6);
		genModel.markImportLocation(stringBuffer, genPackage);
		if (isImplementation) {
			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Registry");
			genModel.addPseudoImport("org.eclipse.emf.ecore.EPackage.Descriptor");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.EPackageImpl.EBasicWhiteList");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container");
			genModel.addPseudoImport("org.eclipse.emf.ecore.impl.MinimalEObjectImpl.Container.Dynamic");
			if (genPackage.isLiteralsInterface()) {
				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + ".Literals");
			}
			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers())
				genModel.addPseudoImport(genPackage.getQualifiedPackageInterfaceName() + "."
						+ genPackage.getClassifierID(genClassifier));
		}
		if (isInterface) {
			stringBuffer.append(TEXT_7);
			if (genModel.isOperationReflection()) {
				stringBuffer.append(TEXT_8);
			}
			stringBuffer.append(TEXT_9);
			if (genPackage.hasDocumentation()) {
				stringBuffer.append(TEXT_10);
				stringBuffer.append(genPackage.getDocumentation(genModel.getIndentation(stringBuffer)));
				stringBuffer.append(TEXT_11);
			}
			stringBuffer.append(TEXT_12);
			stringBuffer.append(genPackage.getQualifiedFactoryInterfaceName());
			if (!genModel.isSuppressEMFModelTags()) {
				boolean first = true;
				for (StringTokenizer stringTokenizer = new StringTokenizer(genPackage.getModelInfo(),
						"\n\r"); stringTokenizer.hasMoreTokens();) {
					String modelInfo = stringTokenizer.nextToken();
					if (first) {
						first = false;
						stringBuffer.append(TEXT_13);
						stringBuffer.append(modelInfo);
					} else {
						stringBuffer.append(TEXT_14);
						stringBuffer.append(modelInfo);
					}
				}
				if (first) {
					stringBuffer.append(TEXT_15);
				}
			}
			stringBuffer.append(TEXT_16);
		} else {
			stringBuffer.append(TEXT_17);
		}
		if (isImplementation) {
			stringBuffer.append(TEXT_18);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_19);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.impl.EPackageImpl"));
			if (!isInterface) {
				stringBuffer.append(TEXT_20);
				stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			}
		} else {
			stringBuffer.append(TEXT_21);
			stringBuffer.append(genPackage.getPackageInterfaceName());
			stringBuffer.append(TEXT_22);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
		}
		stringBuffer.append(TEXT_23);
		if (genModel.hasCopyrightField()) {
			stringBuffer.append(TEXT_24);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_25);
			stringBuffer.append(genModel.getCopyrightFieldLiteral());
			stringBuffer.append(TEXT_26);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_27);
		}
		if (isInterface) {
			stringBuffer.append(TEXT_28);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_29);
			stringBuffer.append(genPackage.getPackageName());
			stringBuffer.append(TEXT_30);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_31);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_32);
			stringBuffer.append(genPackage.getNSURI());
			stringBuffer.append(TEXT_33);
			stringBuffer.append(genModel.getNonNLS());
			stringBuffer.append(TEXT_34);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genModel.getImportedName("java.lang.String"));
			stringBuffer.append(TEXT_35);
			stringBuffer.append(genPackage.getNSName());
			stringBuffer.append(TEXT_36);
			stringBuffer.append(genModel.getNonNLS());
			if (genPackage.isContentType()) {
				stringBuffer.append(TEXT_37);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(genModel.getImportedName("java.lang.String"));
				stringBuffer.append(TEXT_38);
				stringBuffer.append(genPackage.getContentTypeIdentifier());
				stringBuffer.append(TEXT_39);
				stringBuffer.append(genModel.getNonNLS());
			}
			stringBuffer.append(TEXT_40);
			stringBuffer.append(publicStaticFinalFlag);
			stringBuffer.append(genPackage.getPackageInterfaceName());
			stringBuffer.append(TEXT_41);
			stringBuffer.append(genPackage.getQualifiedPackageClassName());
			stringBuffer.append(TEXT_42);
			for (GenClassifier genClassifier : genPackage.getOrderedGenClassifiers()) {
				stringBuffer.append(TEXT_43);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					if (!genClass.isInterface()) {
						stringBuffer.append(TEXT_44);
						stringBuffer.append(genClass.getQualifiedClassName());
						stringBuffer.append(TEXT_45);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_46);
						stringBuffer.append(genClass.getQualifiedClassName());
					} else {
						stringBuffer.append(TEXT_47);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						stringBuffer.append(TEXT_48);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_49);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_50);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_51);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_52);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					stringBuffer.append(TEXT_53);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_54);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_55);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
				}
				stringBuffer.append(TEXT_56);
				stringBuffer.append(genPackage.getQualifiedPackageClassName());
				stringBuffer.append(TEXT_57);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_58);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(TEXT_59);
				stringBuffer.append(genPackage.getClassifierID(genClassifier));
				stringBuffer.append(TEXT_60);
				stringBuffer.append(genPackage.getClassifierValue(genClassifier));
				stringBuffer.append(TEXT_61);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					for (GenFeature genFeature : genClass.getAllGenFeatures()) {
						stringBuffer.append(TEXT_62);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_63);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_64);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(TEXT_65);
						stringBuffer.append(genClass.getFeatureID(genFeature));
						stringBuffer.append(TEXT_66);
						stringBuffer.append(genClass.getFeatureValue(genFeature));
						stringBuffer.append(TEXT_67);
					}
					stringBuffer.append(TEXT_68);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_69);
					stringBuffer.append(publicStaticFinalFlag);
					stringBuffer.append(TEXT_70);
					stringBuffer.append(genClass.getFeatureCountID());
					stringBuffer.append(TEXT_71);
					stringBuffer.append(genClass.getFeatureCountValue());
					stringBuffer.append(TEXT_72);
					if (genModel.isOperationReflection()) {
						for (GenOperation genOperation : genClass.getAllGenOperations(false)) {
							if (genClass.getOverrideGenOperation(genOperation) == null) {
								stringBuffer.append(TEXT_73);
								stringBuffer.append(genOperation.getFormattedName());
								stringBuffer.append(TEXT_74);
								stringBuffer.append(publicStaticFinalFlag);
								stringBuffer.append(TEXT_75);
								stringBuffer.append(genClass.getOperationID(genOperation, false));
								stringBuffer.append(TEXT_76);
								stringBuffer.append(genClass.getOperationValue(genOperation));
								stringBuffer.append(TEXT_77);
							}
						}
						stringBuffer.append(TEXT_78);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_79);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(TEXT_80);
						stringBuffer.append(genClass.getOperationCountID());
						stringBuffer.append(TEXT_81);
						stringBuffer.append(genClass.getOperationCountValue());
						stringBuffer.append(TEXT_82);
					}
				}
			}
		}
		if (isImplementation) {
			if (genPackage.isLoadingInitialization()) {
				stringBuffer.append(TEXT_83);
				stringBuffer.append(genPackage.getSerializedPackageFilename());
				stringBuffer.append(TEXT_84);
				stringBuffer.append(genModel.getNonNLS());
				stringBuffer.append(TEXT_85);
			}
			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
				stringBuffer.append(TEXT_86);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_87);
				stringBuffer.append(genClassifier.getClassifierInstanceName());
				stringBuffer.append(TEXT_88);
			}
			stringBuffer.append(TEXT_89);
			stringBuffer.append(genPackage.getQualifiedPackageInterfaceName());
			stringBuffer.append(TEXT_90);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_91);
			stringBuffer.append(genPackage.getQualifiedEFactoryInstanceAccessor());
			stringBuffer.append(TEXT_92);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_93);
			if (!genPackage.isLoadedInitialization()) {
				stringBuffer.append(TEXT_94);
			}
			stringBuffer.append(TEXT_95);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_96);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_97);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_98);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_99);
			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
				stringBuffer.append(TEXT_100);
			}
			stringBuffer.append(TEXT_101);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_102);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_103);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_104);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_105);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_106);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_107);
			stringBuffer.append(genPackage.getPackageClassName());
			stringBuffer.append(TEXT_108);
			if (!genPackage.getPackageSimpleDependencies().isEmpty()) {
				stringBuffer.append(TEXT_109);
				for (GenPackage dep : genPackage.getPackageSimpleDependencies()) {
					stringBuffer.append(TEXT_110);
					stringBuffer.append(dep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_111);
				}
				stringBuffer.append(TEXT_112);
			}
			if (!genPackage.getPackageInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_113);
				for (GenPackage interdep : genPackage.getPackageInterDependencies()) {
					stringBuffer.append(TEXT_114);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_115);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_116);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_117);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_118);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_119);
					stringBuffer.append(interdep.getImportedPackageClassName());
					stringBuffer.append(TEXT_120);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_121);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_122);
					stringBuffer.append(interdep.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_123);
				}
				stringBuffer.append(TEXT_124);
			}
			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_125);
				if (genPackage.isLoadingInitialization()) {
					stringBuffer.append(TEXT_126);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_127);
				}
				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
					if (interdep.isLoadingInitialization()) {
						stringBuffer.append(TEXT_128);
						stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
						stringBuffer.append(TEXT_129);
					}
				}
				stringBuffer.append(TEXT_130);
			}
			if (!genPackage.isLoadedInitialization() || !genPackage.getPackageBuildInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_131);
				if (!genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_132);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_133);
				}
				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
					stringBuffer.append(TEXT_134);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_135);
				}
				stringBuffer.append(TEXT_136);
				if (!genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_137);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_138);
				}
				for (GenPackage interdep : genPackage.getPackageBuildInterDependencies()) {
					stringBuffer.append(TEXT_139);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_140);
				}
				stringBuffer.append(TEXT_141);
			}
			if (genPackage.isLoadedInitialization() || !genPackage.getPackageLoadInterDependencies().isEmpty()) {
				stringBuffer.append(TEXT_142);
				if (genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_143);
					stringBuffer.append(genPackage.getBasicPackageName());
					stringBuffer.append(TEXT_144);
				}
				for (GenPackage interdep : genPackage.getPackageLoadInterDependencies()) {
					stringBuffer.append(TEXT_145);
					stringBuffer.append(genPackage.getPackageInstanceVariable(interdep));
					stringBuffer.append(TEXT_146);
				}
				stringBuffer.append(TEXT_147);
			}
			if (genPackage.hasConstraints()) {
				stringBuffer.append(TEXT_148);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_149);
				stringBuffer.append(genPackage.getBasicPackageName());
				stringBuffer.append(TEXT_150);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_151);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EValidator"));
				stringBuffer.append(TEXT_152);
				stringBuffer.append(genPackage.getImportedValidatorClassName());
				stringBuffer.append(TEXT_153);
			}
			if (!genPackage.isEcorePackage()) {
				stringBuffer.append(TEXT_154);
				stringBuffer.append(genPackage.getBasicPackageName());
				stringBuffer.append(TEXT_155);
			}
			stringBuffer.append(TEXT_156);
			stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
			stringBuffer.append(TEXT_157);
			stringBuffer.append(genPackage.getImportedPackageInterfaceName());
			stringBuffer.append(TEXT_158);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_159);
			stringBuffer.append(genPackage.getBasicPackageName());
			stringBuffer.append(TEXT_160);
			if (genModel.getRuntimePlatform() == GenRuntimePlatform.GWT) {
				stringBuffer.append(TEXT_161);
				Set<String> helpers = new HashSet<String>();
				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
					if (genClassifier instanceof GenClass) {
						GenClass genClass = (GenClass) genClassifier;
						if (!genClass.isDynamic()) {
							String theClass = genClass.isMapEntry() ? genClass.getImportedClassName()
									: genClass.getRawImportedInterfaceName();
							if (helpers.add(theClass)) {
								stringBuffer.append(TEXT_162);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_163);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_164);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_165);
								stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
										: genClass.getRawImportedInterfaceName()
												+ genClass.getInterfaceWildTypeArguments());
								stringBuffer.append(TEXT_166);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_167);
							}
						}
					} else if (genClassifier instanceof GenDataType) {
						GenDataType genDataType = (GenDataType) genClassifier;
						if (!genDataType.isPrimitiveType() && !genDataType.isObjectType()) {
							String theClass = genDataType.getRawImportedInstanceClassName();
							if (helpers.add(theClass)) {
								stringBuffer.append(TEXT_168);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_169);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_170);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.Reflect"));
								stringBuffer.append(TEXT_171);
								stringBuffer.append(theClass);
								stringBuffer.append(TEXT_172);
								if (genDataType.isArrayType()) {
									String componentType = theClass;
									String indices = "";
									while (componentType.endsWith("[]")) {
										componentType = componentType.substring(0, componentType.length() - 2);
										indices += "[]";
									}
									stringBuffer.append(TEXT_173);
									stringBuffer.append(componentType);
									stringBuffer.append(TEXT_174);
									stringBuffer.append(indices);
									stringBuffer.append(TEXT_175);
								} else {
									stringBuffer.append(TEXT_176);
									stringBuffer.append(theClass);
									stringBuffer.append(TEXT_177);
								}
								stringBuffer.append(TEXT_178);
							}
						}
					}
				}
				stringBuffer.append(TEXT_179);
				stringBuffer.append(genModel.getImportedName("com.google.gwt.user.client.rpc.IsSerializable"));
				stringBuffer.append(TEXT_180);
				for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
					if (genClassifier instanceof GenClass) {
						GenClass genClass = (GenClass) genClassifier;
						if (!genClass.isDynamic()) {
							stringBuffer.append(TEXT_181);
							stringBuffer.append(genClass.isMapEntry() ? genClass.getImportedClassName()
									: genClass.getImportedWildcardInstanceClassName());
							stringBuffer.append(TEXT_182);
							stringBuffer.append(genClass.getSafeUncapName());
							stringBuffer.append(TEXT_183);
						}
					} else if (genClassifier instanceof GenDataType) {
						GenDataType genDataType = (GenDataType) genClassifier;
						if (!genDataType.isObjectType() && genDataType.isSerializable()) {
							stringBuffer.append(TEXT_184);
							stringBuffer.append(genDataType.getImportedWildcardInstanceClassName());
							stringBuffer.append(TEXT_185);
							stringBuffer.append(genDataType.getSafeUncapName());
							stringBuffer.append(TEXT_186);
						}
					}
				}
				stringBuffer.append(TEXT_187);
			}
			stringBuffer.append(TEXT_188);
		}
		if (isInterface) { // TODO REMOVE THIS BOGUS EMPTY LINE
			stringBuffer.append(TEXT_189);
		}
		for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
			if (isInterface) {
				stringBuffer.append(TEXT_190);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					stringBuffer.append(TEXT_191);
					stringBuffer.append(genClass.getQualifiedInterfaceName());
					stringBuffer.append(TEXT_192);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_193);
					stringBuffer.append(genClass.getFormattedName());
					stringBuffer.append(TEXT_194);
					stringBuffer.append(genClass.getQualifiedInterfaceName());
					if (!genModel.isSuppressEMFModelTags()
							&& (genClass.isExternalInterface() || genClass.isDynamic())) {
						boolean first = true;
						for (StringTokenizer stringTokenizer = new StringTokenizer(genClass.getModelInfo(),
								"\n\r"); stringTokenizer.hasMoreTokens();) {
							String modelInfo = stringTokenizer.nextToken();
							if (first) {
								first = false;
								stringBuffer.append(TEXT_195);
								stringBuffer.append(modelInfo);
							} else {
								stringBuffer.append(TEXT_196);
								stringBuffer.append(modelInfo);
							}
						}
						if (first) {
							stringBuffer.append(TEXT_197);
						}
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_198);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_199);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_200);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_201);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					if (genDataType.isPrimitiveType() || genDataType.isArrayType()) {
						stringBuffer.append(TEXT_202);
						stringBuffer.append(genDataType.getFormattedName());
						stringBuffer.append(TEXT_203);
					} else {
						stringBuffer.append(TEXT_204);
						stringBuffer.append(genDataType.getRawInstanceClassName());
						stringBuffer.append(TEXT_205);
						stringBuffer.append(genDataType.getFormattedName());
						stringBuffer.append(TEXT_206);
					}
					stringBuffer.append(TEXT_207);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_208);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_209);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
					if (!genModel.isSuppressEMFModelTags()) {
						boolean first = true;
						for (StringTokenizer stringTokenizer = new StringTokenizer(genDataType.getModelInfo(),
								"\n\r"); stringTokenizer.hasMoreTokens();) {
							String modelInfo = stringTokenizer.nextToken();
							if (first) {
								first = false;
								stringBuffer.append(TEXT_210);
								stringBuffer.append(modelInfo);
							} else {
								stringBuffer.append(TEXT_211);
								stringBuffer.append(modelInfo);
							}
						}
						if (first) {
							stringBuffer.append(TEXT_212);
						}
					}
				}
				stringBuffer.append(TEXT_213);
			} else {
				stringBuffer.append(TEXT_214);
			}
			if (isImplementation) {
				stringBuffer.append(TEXT_215);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_216);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_217);
				if (genPackage.isLoadedInitialization()) {
					stringBuffer.append(TEXT_218);
					stringBuffer.append(genClassifier.getClassifierInstanceName());
					stringBuffer.append(TEXT_219);
					stringBuffer.append(genClassifier.getClassifierInstanceName());
					stringBuffer.append(TEXT_220);
					stringBuffer.append(genClassifier.getImportedMetaType());
					stringBuffer.append(TEXT_221);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_222);
					stringBuffer.append(genPackage.getImportedPackageInterfaceName());
					stringBuffer.append(TEXT_223);
					stringBuffer.append(genPackage.getLocalClassifierIndex(genClassifier));
					stringBuffer.append(TEXT_224);
				}
				stringBuffer.append(TEXT_225);
				stringBuffer.append(genClassifier.getClassifierInstanceName());
				stringBuffer.append(TEXT_226);
			} else {
				stringBuffer.append(TEXT_227);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_228);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_229);
			}
			if (genClassifier instanceof GenClass) {
				GenClass genClass = (GenClass) genClassifier;
				for (GenFeature genFeature : genClass.getGenFeatures()) {
					if (isInterface) {
						stringBuffer.append(TEXT_230);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_231);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
							stringBuffer.append(TEXT_232);
							stringBuffer.append(genFeature.getGetAccessor());
						}
						stringBuffer.append(TEXT_233);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_234);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_235);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_236);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						if (!genClass.isMapEntry() && !genFeature.isSuppressedGetVisibility()) {
							stringBuffer.append(TEXT_237);
							stringBuffer.append(genFeature.getGetAccessor());
							stringBuffer.append(TEXT_238);
						}
						stringBuffer.append(TEXT_239);
						stringBuffer.append(genClass.getClassifierAccessorName());
						stringBuffer.append(TEXT_240);
					} else {
						stringBuffer.append(TEXT_241);
					}
					if (isImplementation) {
						stringBuffer.append(TEXT_242);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_243);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_244);
						if (!genPackage.isLoadedInitialization()) {
							stringBuffer.append(TEXT_245);
							stringBuffer.append(genFeature.getImportedMetaType());
							stringBuffer.append(TEXT_246);
							stringBuffer.append(genClass.getClassifierInstanceName());
							stringBuffer.append(TEXT_247);
							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
							stringBuffer.append(TEXT_248);
						} else {
							stringBuffer.append(TEXT_249);
							stringBuffer.append(genFeature.getImportedMetaType());
							stringBuffer.append(TEXT_250);
							stringBuffer.append(genClassifier.getClassifierAccessorName());
							stringBuffer.append(TEXT_251);
							stringBuffer.append(genClass.getLocalFeatureIndex(genFeature));
							stringBuffer.append(TEXT_252);
						}
						stringBuffer.append(TEXT_253);
					} else {
						stringBuffer.append(TEXT_254);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_255);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_256);
					}
					stringBuffer.append(TEXT_257);
				}
				if (genModel.isOperationReflection()) {
					for (GenOperation genOperation : genClass.getGenOperations()) {
						if (isInterface) {
							stringBuffer.append(TEXT_258);
							stringBuffer.append(genClass.getQualifiedInterfaceName());
							stringBuffer.append(TEXT_259);
							stringBuffer.append(genOperation.getName());
							stringBuffer.append(TEXT_260);
							stringBuffer.append(genOperation.getParameterTypes(", "));
							stringBuffer.append(TEXT_261);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_262);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_263);
							stringBuffer.append(genClass.getQualifiedInterfaceName());
							stringBuffer.append(TEXT_264);
							stringBuffer.append(genOperation.getName());
							stringBuffer.append(TEXT_265);
							stringBuffer.append(genOperation.getParameterTypes(", "));
							stringBuffer.append(TEXT_266);
						} else {
							stringBuffer.append(TEXT_267);
						}
						if (isImplementation) {
							stringBuffer.append(TEXT_268);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_269);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_270);
							if (!genPackage.isLoadedInitialization()) {
								stringBuffer.append(TEXT_271);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_272);
								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
								stringBuffer.append(TEXT_273);
							} else {
								stringBuffer.append(TEXT_274);
								stringBuffer.append(genClassifier.getClassifierAccessorName());
								stringBuffer.append(TEXT_275);
								stringBuffer.append(genClass.getLocalOperationIndex(genOperation));
								stringBuffer.append(TEXT_276);
							}
							stringBuffer.append(TEXT_277);
						} else {
							stringBuffer.append(TEXT_278);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_279);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_280);
						}
						stringBuffer.append(TEXT_281);
					}
				}
			}
		}
		if (isInterface) {
			stringBuffer.append(TEXT_282);
		} else {
			stringBuffer.append(TEXT_283);
		}
		if (isImplementation) {
			stringBuffer.append(TEXT_284);
			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
			stringBuffer.append(TEXT_285);
			stringBuffer.append(genPackage.getFactoryName());
			stringBuffer.append(TEXT_286);
			stringBuffer.append(genPackage.getImportedFactoryInterfaceName());
			stringBuffer.append(TEXT_287);
		} else {
			stringBuffer.append(TEXT_288);
			stringBuffer.append(genPackage.getFactoryInterfaceName());
			stringBuffer.append(TEXT_289);
			stringBuffer.append(genPackage.getFactoryName());
			stringBuffer.append(TEXT_290);
		}
		stringBuffer.append(TEXT_291);
		if (isImplementation) {
			if (!genPackage.isLoadedInitialization()) {
				stringBuffer.append(TEXT_292);
				if (!genPackage.getGenClasses().isEmpty()) {
					stringBuffer.append(TEXT_293);
					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
						GenClass genClass = c.next();
						stringBuffer.append(TEXT_294);
						stringBuffer.append(genClass.getClassifierInstanceName());
						stringBuffer.append(TEXT_295);
						stringBuffer.append(genClass.getMetaType());
						stringBuffer.append(TEXT_296);
						stringBuffer.append(genClass.getClassifierID());
						stringBuffer.append(TEXT_297);
						for (GenFeature genFeature : genClass.getGenFeatures()) {
							stringBuffer.append(TEXT_298);
							stringBuffer.append(genFeature.getMetaType());
							stringBuffer.append(TEXT_299);
							stringBuffer.append(genClass.getClassifierInstanceName());
							stringBuffer.append(TEXT_300);
							stringBuffer.append(genClass.getFeatureID(genFeature));
							stringBuffer.append(TEXT_301);
						}
						if (genModel.isOperationReflection()) {
							for (GenOperation genOperation : genClass.getGenOperations()) {
								stringBuffer.append(TEXT_302);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_303);
								stringBuffer.append(genClass.getOperationID(genOperation, false));
								stringBuffer.append(TEXT_304);
							}
						}
						if (c.hasNext()) {
							stringBuffer.append(TEXT_305);
						}
					}
				}
				if (!genPackage.getGenEnums().isEmpty()) {
					stringBuffer.append(TEXT_306);
					for (GenEnum genEnum : genPackage.getGenEnums()) {
						stringBuffer.append(TEXT_307);
						stringBuffer.append(genEnum.getClassifierInstanceName());
						stringBuffer.append(TEXT_308);
						stringBuffer.append(genEnum.getClassifierID());
						stringBuffer.append(TEXT_309);
					}
				}
				if (!genPackage.getGenDataTypes().isEmpty()) {
					stringBuffer.append(TEXT_310);
					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
						stringBuffer.append(TEXT_311);
						stringBuffer.append(genDataType.getClassifierInstanceName());
						stringBuffer.append(TEXT_312);
						stringBuffer.append(genDataType.getClassifierID());
						stringBuffer.append(TEXT_313);
					}
				}
				stringBuffer.append(TEXT_314);

				///////////////////////
				class Information {
					@SuppressWarnings("unused")
					EGenericType eGenericType;
					int depth;
					String type;
					String accessor;
				}

				class InformationIterator {
					Iterator<?> iterator;

					InformationIterator(EGenericType eGenericType) {
						iterator = EcoreUtil.getAllContents(Collections.singleton(eGenericType));
					}

					boolean hasNext() {
						return iterator.hasNext();
					}

					Information next() {
						Information information = new Information();
						EGenericType eGenericType = information.eGenericType = (EGenericType) iterator.next();
						for (EObject container = eGenericType
								.eContainer(); container instanceof EGenericType; container = container.eContainer()) {
							++information.depth;
						}
						if (eGenericType.getEClassifier() != null) {
							GenClassifier genClassifier = genModel.findGenClassifier(eGenericType.getEClassifier());
							information.type = genPackage.getPackageInstanceVariable(genClassifier.getGenPackage())
									+ ".get" + genClassifier.getClassifierAccessorName() + "()";
						} else if (eGenericType.getETypeParameter() != null) {
							ETypeParameter eTypeParameter = eGenericType.getETypeParameter();
							if (eTypeParameter.eContainer() instanceof EClass) {
								information.type = genModel.findGenClassifier((EClass) eTypeParameter.eContainer())
										.getClassifierInstanceName() + "_" + eGenericType.getETypeParameter().getName();
							} else {
								information.type = "t" + (((EOperation) eTypeParameter.eContainer())
										.getETypeParameters().indexOf(eTypeParameter) + 1);
							}
						} else {
							information.type = "";
						}
						if (information.depth > 0) {
							if (eGenericType.eContainmentFeature().isMany()) {
								information.accessor = "getE"
										+ eGenericType.eContainmentFeature().getName().substring(1) + "().add";
							} else {
								information.accessor = "setE"
										+ eGenericType.eContainmentFeature().getName().substring(1);
							}
						}
						return information;
					}
				}
				///////////////////////
				int maxGenericTypeAssignment = 0;

				stringBuffer.append(TEXT_315);
				if (!genPackage.getPackageInitializationDependencies().isEmpty()) {
					stringBuffer.append(TEXT_316);
					for (GenPackage dep : genPackage.getPackageInitializationDependencies()) {
						stringBuffer.append(TEXT_317);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_318);
						stringBuffer.append(genPackage.getPackageInstanceVariable(dep));
						stringBuffer.append(TEXT_319);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_320);
						stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
						stringBuffer.append(TEXT_321);
						stringBuffer.append(dep.getImportedPackageInterfaceName());
						stringBuffer.append(TEXT_322);
					}
				}
				if (!genPackage.getSubGenPackages().isEmpty()) {
					stringBuffer.append(TEXT_323);
					for (GenPackage sub : genPackage.getSubGenPackages()) {
						stringBuffer.append(TEXT_324);
						stringBuffer.append(genPackage.getPackageInstanceVariable(sub));
						stringBuffer.append(TEXT_325);
					}
				}
				if (!genPackage.getGenClasses().isEmpty()) {
					boolean firstOperationAssignment = true;
					int maxTypeParameterAssignment = 0;
					if (genModel.useGenerics()) {
						stringBuffer.append(TEXT_326);
						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
								if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
										|| genTypeParameter.isUsed()) {
									stringBuffer.append(TEXT_327);
									stringBuffer
											.append(genModel.getImportedName("org.eclipse.emf.ecore.ETypeParameter"));
									stringBuffer.append(TEXT_328);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_329);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_330);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_331);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_332);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_333);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_334);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_335);
									stringBuffer.append(genModel.getNonNLS());
								}
							}
						}
					}
					if (genModel.useGenerics()) {
						stringBuffer.append(TEXT_336);
						for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
							for (GenTypeParameter genTypeParameter : genClassifier.getGenTypeParameters()) {
								for (EGenericType bound : genTypeParameter.getEcoreTypeParameter().getEBounds()) {
									for (InformationIterator i = new InformationIterator(bound); i.hasNext();) {
										Information info = i.next();
										String prefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_337);
										stringBuffer.append(prefix);
										stringBuffer.append(TEXT_338);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_339);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_340);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_341);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_342);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_343);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_344);
										}
									}
									stringBuffer.append(TEXT_345);
									stringBuffer.append(genClassifier.getClassifierInstanceName());
									stringBuffer.append(TEXT_346);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_347);
								}
							}
						}
					}
					stringBuffer.append(TEXT_348);
					for (GenClass genClass : genPackage.getGenClasses()) {
						if (!genClass.hasGenericSuperTypes()) {
							for (GenClass baseGenClass : genClass.getBaseGenClasses()) {
								stringBuffer.append(TEXT_349);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_350);
								stringBuffer
										.append(genPackage.getPackageInstanceVariable(baseGenClass.getGenPackage()));
								stringBuffer.append(TEXT_351);
								stringBuffer.append(baseGenClass.getClassifierAccessorName());
								stringBuffer.append(TEXT_352);
							}
						} else {
							for (EGenericType superType : genClass.getEcoreClass().getEGenericSuperTypes()) {
								for (InformationIterator i = new InformationIterator(superType); i.hasNext();) {
									Information info = i.next();
									String prefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
									}
									stringBuffer.append(TEXT_353);
									stringBuffer.append(prefix);
									stringBuffer.append(TEXT_354);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_355);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_356);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_357);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_358);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_359);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_360);
									}
								}
								stringBuffer.append(TEXT_361);
								stringBuffer.append(genClass.getClassifierInstanceName());
								stringBuffer.append(TEXT_362);
							}
						}
					}
					stringBuffer.append(TEXT_363);
					if (genModel.isOperationReflection()) {
						stringBuffer.append(TEXT_364);
					} else {
						stringBuffer.append(TEXT_365);
					}
					for (Iterator<GenClass> c = genPackage.getGenClasses().iterator(); c.hasNext();) {
						GenClass genClass = c.next();
						boolean hasInstanceTypeName = genModel.useGenerics()
								&& genClass.getEcoreClass().getInstanceTypeName() != null
								&& genClass.getEcoreClass().getInstanceTypeName().contains("<");
						stringBuffer.append(TEXT_366);
						stringBuffer.append(genClass.getClassifierInstanceName());
						stringBuffer.append(TEXT_367);
						if (genClass.isDynamic()) {
							stringBuffer.append(TEXT_368);
						} else {
							stringBuffer.append(genClass.getRawImportedInterfaceName());
							stringBuffer.append(TEXT_369);
						}
						stringBuffer.append(TEXT_370);
						stringBuffer.append(genClass.getName());
						stringBuffer.append(TEXT_371);
						stringBuffer.append(genClass.getAbstractFlag());
						stringBuffer.append(TEXT_372);
						stringBuffer.append(genClass.getInterfaceFlag());
						stringBuffer.append(TEXT_373);
						stringBuffer.append(genClass.getGeneratedInstanceClassFlag());
						if (hasInstanceTypeName) {
							stringBuffer.append(TEXT_374);
							stringBuffer.append(genClass.getEcoreClass().getInstanceTypeName());
							stringBuffer.append(TEXT_375);
						}
						stringBuffer.append(TEXT_376);
						stringBuffer.append(genModel.getNonNLS());
						if (hasInstanceTypeName) {
							stringBuffer.append(genModel.getNonNLS(2));
						}
						for (GenFeature genFeature : genClass.getGenFeatures()) {
							if (genFeature.hasGenericType()) {
								for (InformationIterator i = new InformationIterator(
										genFeature.getEcoreFeature().getEGenericType()); i.hasNext();) {
									Information info = i.next();
									String prefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										prefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
									}
									stringBuffer.append(TEXT_377);
									stringBuffer.append(prefix);
									stringBuffer.append(TEXT_378);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_379);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_380);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_381);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_382);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_383);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_384);
									}
								}
							}
							if (genFeature.isReferenceType()) {
								GenFeature reverseGenFeature = genFeature.getReverse();
								String reverse = reverseGenFeature == null ? "null"
										: genPackage.getPackageInstanceVariable(reverseGenFeature.getGenPackage())
												+ ".get" + reverseGenFeature.getFeatureAccessorName() + "()";
								stringBuffer.append(TEXT_385);
								stringBuffer.append(genFeature.getFeatureAccessorName());
								stringBuffer.append(TEXT_386);
								if (genFeature.hasGenericType()) {
									stringBuffer.append(TEXT_387);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
									stringBuffer.append(TEXT_388);
									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_389);
								}
								stringBuffer.append(TEXT_390);
								stringBuffer.append(reverse);
								stringBuffer.append(TEXT_391);
								stringBuffer.append(genFeature.getName());
								stringBuffer.append(TEXT_392);
								stringBuffer.append(genFeature.getDefaultValue());
								stringBuffer.append(TEXT_393);
								stringBuffer.append(genFeature.getLowerBound());
								stringBuffer.append(TEXT_394);
								stringBuffer.append(genFeature.getUpperBound());
								stringBuffer.append(TEXT_395);
								stringBuffer.append(genFeature.getContainerClass());
								stringBuffer.append(TEXT_396);
								stringBuffer.append(genFeature.getTransientFlag());
								stringBuffer.append(TEXT_397);
								stringBuffer.append(genFeature.getVolatileFlag());
								stringBuffer.append(TEXT_398);
								stringBuffer.append(genFeature.getChangeableFlag());
								stringBuffer.append(TEXT_399);
								stringBuffer.append(genFeature.getContainmentFlag());
								stringBuffer.append(TEXT_400);
								stringBuffer.append(genFeature.getResolveProxiesFlag());
								stringBuffer.append(TEXT_401);
								stringBuffer.append(genFeature.getUnsettableFlag());
								stringBuffer.append(TEXT_402);
								stringBuffer.append(genFeature.getUniqueFlag());
								stringBuffer.append(TEXT_403);
								stringBuffer.append(genFeature.getDerivedFlag());
								stringBuffer.append(TEXT_404);
								stringBuffer.append(genFeature.getOrderedFlag());
								stringBuffer.append(TEXT_405);
								stringBuffer.append(genModel.getNonNLS());
								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
								for (GenFeature keyFeature : genFeature.getKeys()) {
									stringBuffer.append(TEXT_406);
									stringBuffer.append(genFeature.getFeatureAccessorName());
									stringBuffer.append(TEXT_407);
									stringBuffer
											.append(genPackage.getPackageInstanceVariable(keyFeature.getGenPackage()));
									stringBuffer.append(TEXT_408);
									stringBuffer.append(keyFeature.getFeatureAccessorName());
									stringBuffer.append(TEXT_409);
								}
							} else {
								stringBuffer.append(TEXT_410);
								stringBuffer.append(genFeature.getFeatureAccessorName());
								stringBuffer.append(TEXT_411);
								if (genFeature.hasGenericType()) {
									stringBuffer.append(TEXT_412);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genFeature.getTypeGenPackage()));
									stringBuffer.append(TEXT_413);
									stringBuffer.append(genFeature.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_414);
								}
								stringBuffer.append(TEXT_415);
								stringBuffer.append(genFeature.getName());
								stringBuffer.append(TEXT_416);
								stringBuffer.append(genFeature.getDefaultValue());
								stringBuffer.append(TEXT_417);
								stringBuffer.append(genFeature.getLowerBound());
								stringBuffer.append(TEXT_418);
								stringBuffer.append(genFeature.getUpperBound());
								stringBuffer.append(TEXT_419);
								stringBuffer.append(genFeature.getContainerClass());
								stringBuffer.append(TEXT_420);
								stringBuffer.append(genFeature.getTransientFlag());
								stringBuffer.append(TEXT_421);
								stringBuffer.append(genFeature.getVolatileFlag());
								stringBuffer.append(TEXT_422);
								stringBuffer.append(genFeature.getChangeableFlag());
								stringBuffer.append(TEXT_423);
								stringBuffer.append(genFeature.getUnsettableFlag());
								stringBuffer.append(TEXT_424);
								stringBuffer.append(genFeature.getIDFlag());
								stringBuffer.append(TEXT_425);
								stringBuffer.append(genFeature.getUniqueFlag());
								stringBuffer.append(TEXT_426);
								stringBuffer.append(genFeature.getDerivedFlag());
								stringBuffer.append(TEXT_427);
								stringBuffer.append(genFeature.getOrderedFlag());
								stringBuffer.append(TEXT_428);
								stringBuffer.append(genModel.getNonNLS());
								stringBuffer.append(genModel.getNonNLS(genFeature.getDefaultValue(), 2));
							}
						}
						for (GenOperation genOperation : genClass.getGenOperations()) {
							String prefix = "";
							if (genOperation.hasGenericType() || !genOperation.getGenParameters().isEmpty()
									|| !genOperation.getGenExceptions().isEmpty()
									|| !genOperation.getGenTypeParameters().isEmpty()) {
								if (firstOperationAssignment) {
									firstOperationAssignment = false;
									prefix = genModel.getImportedName("org.eclipse.emf.ecore.EOperation") + " op = ";
								} else {
									prefix = "op = ";
								}
							}
							stringBuffer.append(TEXT_429);
							if (genModel.useGenerics()) {
								stringBuffer.append(TEXT_430);
								stringBuffer.append(prefix);
								if (genModel.isOperationReflection()) {
									stringBuffer.append(TEXT_431);
									stringBuffer.append(genOperation.getOperationAccessorName());
									stringBuffer.append(TEXT_432);
								} else {
									stringBuffer.append(TEXT_433);
									stringBuffer.append(genClass.getClassifierInstanceName());
								}
								stringBuffer.append(TEXT_434);
								if (genOperation.isVoid() || genOperation.hasGenericType()) {
									stringBuffer.append(TEXT_435);
								} else {
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_436);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_437);
								}
								stringBuffer.append(TEXT_438);
								stringBuffer.append(genOperation.getName());
								stringBuffer.append(TEXT_439);
								stringBuffer.append(genOperation.getLowerBound());
								stringBuffer.append(TEXT_440);
								stringBuffer.append(genOperation.getUpperBound());
								stringBuffer.append(TEXT_441);
								stringBuffer.append(genOperation.getUniqueFlag());
								stringBuffer.append(TEXT_442);
								stringBuffer.append(genOperation.getOrderedFlag());
								stringBuffer.append(TEXT_443);
								stringBuffer.append(genModel.getNonNLS());
							} else if (!genOperation.isVoid()) {
								if (!genOperation.getEcoreOperation().isOrdered()
										|| !genOperation.getEcoreOperation().isUnique()) {
									needsAddEOperation = true;
									stringBuffer.append(TEXT_444);
									stringBuffer.append(prefix);
									if (genModel.isOperationReflection()) {
										stringBuffer.append(TEXT_445);
										stringBuffer.append(genOperation.getOperationAccessorName());
										stringBuffer.append(TEXT_446);
									} else {
										stringBuffer.append(TEXT_447);
										stringBuffer.append(genClass.getClassifierInstanceName());
									}
									stringBuffer.append(TEXT_448);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_449);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_450);
									stringBuffer.append(genOperation.getName());
									stringBuffer.append(TEXT_451);
									stringBuffer.append(genOperation.getLowerBound());
									stringBuffer.append(TEXT_452);
									stringBuffer.append(genOperation.getUpperBound());
									stringBuffer.append(TEXT_453);
									stringBuffer.append(genOperation.getUniqueFlag());
									stringBuffer.append(TEXT_454);
									stringBuffer.append(genOperation.getOrderedFlag());
									stringBuffer.append(TEXT_455);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_456);
									stringBuffer.append(prefix);
									if (genModel.isOperationReflection()) {
										stringBuffer.append(TEXT_457);
										stringBuffer.append(genOperation.getOperationAccessorName());
										stringBuffer.append(TEXT_458);
									} else {
										stringBuffer.append(TEXT_459);
										stringBuffer.append(genClass.getClassifierInstanceName());
									}
									stringBuffer.append(TEXT_460);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genOperation.getTypeGenPackage()));
									stringBuffer.append(TEXT_461);
									stringBuffer.append(genOperation.getTypeClassifierAccessorName());
									stringBuffer.append(TEXT_462);
									stringBuffer.append(genOperation.getName());
									stringBuffer.append(TEXT_463);
									stringBuffer.append(genOperation.getLowerBound());
									stringBuffer.append(TEXT_464);
									stringBuffer.append(genOperation.getUpperBound());
									stringBuffer.append(TEXT_465);
									stringBuffer.append(genModel.getNonNLS());
								}
							} else {
								stringBuffer.append(TEXT_466);
								stringBuffer.append(prefix);
								if (genModel.isOperationReflection()) {
									stringBuffer.append(TEXT_467);
									stringBuffer.append(genOperation.getOperationAccessorName());
									stringBuffer.append(TEXT_468);
								} else {
									stringBuffer.append(TEXT_469);
									stringBuffer.append(genClass.getClassifierInstanceName());
								}
								stringBuffer.append(TEXT_470);
								stringBuffer.append(genOperation.getName());
								stringBuffer.append(TEXT_471);
								stringBuffer.append(genModel.getNonNLS());
							}
							if (genModel.useGenerics()) {
								for (ListIterator<GenTypeParameter> t = genOperation.getGenTypeParameters()
										.listIterator(); t.hasNext();) {
									GenTypeParameter genTypeParameter = t.next();
									String typeParameterVariable = "";
									if (!genTypeParameter.getEcoreTypeParameter().getEBounds().isEmpty()
											|| genTypeParameter.isUsed()) {
										if (maxTypeParameterAssignment <= t.previousIndex()) {
											++maxTypeParameterAssignment;
											typeParameterVariable = genModel
													.getImportedName("org.eclipse.emf.ecore.ETypeParameter") + " t"
													+ t.nextIndex() + " = ";
										} else {
											typeParameterVariable = "t" + t.nextIndex() + " = ";
										}
									}
									stringBuffer.append(TEXT_472);
									stringBuffer.append(typeParameterVariable);
									stringBuffer.append(TEXT_473);
									stringBuffer.append(genTypeParameter.getName());
									stringBuffer.append(TEXT_474);
									stringBuffer.append(genModel.getNonNLS());
									for (EGenericType typeParameter : genTypeParameter.getEcoreTypeParameter()
											.getEBounds()) {
										for (InformationIterator i = new InformationIterator(typeParameter); i
												.hasNext();) {
											Information info = i.next();
											String typePrefix = "";
											if (maxGenericTypeAssignment <= info.depth) {
												++maxGenericTypeAssignment;
												typePrefix = genModel
														.getImportedName("org.eclipse.emf.ecore.EGenericType") + " ";
											}
											stringBuffer.append(TEXT_475);
											stringBuffer.append(typePrefix);
											stringBuffer.append(TEXT_476);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_477);
											stringBuffer.append(info.type);
											stringBuffer.append(TEXT_478);
											if (info.depth > 0) {
												stringBuffer.append(TEXT_479);
												stringBuffer.append(info.depth);
												stringBuffer.append(TEXT_480);
												stringBuffer.append(info.accessor);
												stringBuffer.append(TEXT_481);
												stringBuffer.append(info.depth + 1);
												stringBuffer.append(TEXT_482);
											}
										}
										stringBuffer.append(TEXT_483);
										stringBuffer.append(t.nextIndex());
										stringBuffer.append(TEXT_484);
									}
								}
							}
							for (GenParameter genParameter : genOperation.getGenParameters()) {
								if (genParameter.hasGenericType()) {
									for (InformationIterator i = new InformationIterator(
											genParameter.getEcoreParameter().getEGenericType()); i.hasNext();) {
										Information info = i.next();
										String typePrefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_485);
										stringBuffer.append(typePrefix);
										stringBuffer.append(TEXT_486);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_487);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_488);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_489);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_490);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_491);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_492);
										}
									}
								}
								if (genModel.useGenerics()) {
									stringBuffer.append(TEXT_493);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_494);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_495);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_496);
									}
									stringBuffer.append(TEXT_497);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_498);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_499);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_500);
									stringBuffer.append(genParameter.getUniqueFlag());
									stringBuffer.append(TEXT_501);
									stringBuffer.append(genParameter.getOrderedFlag());
									stringBuffer.append(TEXT_502);
									stringBuffer.append(genModel.getNonNLS());
								} else if (!genParameter.getEcoreParameter().isOrdered()
										|| !genParameter.getEcoreParameter().isUnique()) {
									needsAddEParameter = true;
									stringBuffer.append(TEXT_503);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_504);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_505);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_506);
									}
									stringBuffer.append(TEXT_507);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_508);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_509);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_510);
									stringBuffer.append(genParameter.getUniqueFlag());
									stringBuffer.append(TEXT_511);
									stringBuffer.append(genParameter.getOrderedFlag());
									stringBuffer.append(TEXT_512);
									stringBuffer.append(genModel.getNonNLS());
								} else {
									stringBuffer.append(TEXT_513);
									if (genParameter.hasGenericType()) {
										stringBuffer.append(TEXT_514);
									} else {
										stringBuffer.append(genPackage
												.getPackageInstanceVariable(genParameter.getTypeGenPackage()));
										stringBuffer.append(TEXT_515);
										stringBuffer.append(genParameter.getTypeClassifierAccessorName());
										stringBuffer.append(TEXT_516);
									}
									stringBuffer.append(TEXT_517);
									stringBuffer.append(genParameter.getName());
									stringBuffer.append(TEXT_518);
									stringBuffer.append(genParameter.getLowerBound());
									stringBuffer.append(TEXT_519);
									stringBuffer.append(genParameter.getUpperBound());
									stringBuffer.append(TEXT_520);
									stringBuffer.append(genModel.getNonNLS());
								}
							}
							if (genOperation.hasGenericExceptions()) {
								for (EGenericType genericExceptions : genOperation.getEcoreOperation()
										.getEGenericExceptions()) {
									for (InformationIterator i = new InformationIterator(genericExceptions); i
											.hasNext();) {
										Information info = i.next();
										String typePrefix = "";
										if (maxGenericTypeAssignment <= info.depth) {
											++maxGenericTypeAssignment;
											typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
													+ " ";
										}
										stringBuffer.append(TEXT_521);
										stringBuffer.append(typePrefix);
										stringBuffer.append(TEXT_522);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_523);
										stringBuffer.append(info.type);
										stringBuffer.append(TEXT_524);
										if (info.depth > 0) {
											stringBuffer.append(TEXT_525);
											stringBuffer.append(info.depth);
											stringBuffer.append(TEXT_526);
											stringBuffer.append(info.accessor);
											stringBuffer.append(TEXT_527);
											stringBuffer.append(info.depth + 1);
											stringBuffer.append(TEXT_528);
										}
										stringBuffer.append(TEXT_529);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_530);
									}
								}
							} else {
								for (GenClassifier genException : genOperation.getGenExceptions()) {
									stringBuffer.append(TEXT_531);
									stringBuffer.append(
											genPackage.getPackageInstanceVariable(genException.getGenPackage()));
									stringBuffer.append(TEXT_532);
									stringBuffer.append(genException.getClassifierAccessorName());
									stringBuffer.append(TEXT_533);
								}
							}
							if (!genOperation.isVoid() && genOperation.hasGenericType()) {
								for (InformationIterator i = new InformationIterator(
										genOperation.getEcoreOperation().getEGenericType()); i.hasNext();) {
									Information info = i.next();
									String typePrefix = "";
									if (maxGenericTypeAssignment <= info.depth) {
										++maxGenericTypeAssignment;
										typePrefix = genModel.getImportedName("org.eclipse.emf.ecore.EGenericType")
												+ " ";
									}
									stringBuffer.append(TEXT_534);
									stringBuffer.append(typePrefix);
									stringBuffer.append(TEXT_535);
									stringBuffer.append(info.depth + 1);
									stringBuffer.append(TEXT_536);
									stringBuffer.append(info.type);
									stringBuffer.append(TEXT_537);
									if (info.depth > 0) {
										stringBuffer.append(TEXT_538);
										stringBuffer.append(info.depth);
										stringBuffer.append(TEXT_539);
										stringBuffer.append(info.accessor);
										stringBuffer.append(TEXT_540);
										stringBuffer.append(info.depth + 1);
										stringBuffer.append(TEXT_541);
									}
								}
								stringBuffer.append(TEXT_542);
							}
						}
						if (c.hasNext()) {
							stringBuffer.append(TEXT_543);
						}
					}
				}
				if (!genPackage.getGenEnums().isEmpty()) {
					stringBuffer.append(TEXT_544);
					for (Iterator<GenEnum> e = genPackage.getGenEnums().iterator(); e.hasNext();) {
						GenEnum genEnum = e.next();
						stringBuffer.append(TEXT_545);
						stringBuffer.append(genEnum.getClassifierInstanceName());
						stringBuffer.append(TEXT_546);
						stringBuffer.append(genEnum.getImportedName());
						stringBuffer.append(TEXT_547);
						stringBuffer.append(genEnum.getName());
						stringBuffer.append(TEXT_548);
						stringBuffer.append(genModel.getNonNLS());
						for (GenEnumLiteral genEnumLiteral : genEnum.getGenEnumLiterals()) {
							stringBuffer.append(TEXT_549);
							stringBuffer.append(genEnum.getClassifierInstanceName());
							stringBuffer.append(TEXT_550);
							stringBuffer.append(genEnum.getImportedName().equals(genEnum.getClassifierID())
									? genEnum.getQualifiedName() : genEnum.getImportedName());
							stringBuffer.append(TEXT_551);
							stringBuffer.append(genEnumLiteral.getEnumLiteralInstanceConstantName());
							stringBuffer.append(TEXT_552);
						}
						if (e.hasNext()) {
							stringBuffer.append(TEXT_553);
						}
					}
				}
				if (!genPackage.getGenDataTypes().isEmpty()) {
					stringBuffer.append(TEXT_554);
					for (GenDataType genDataType : genPackage.getGenDataTypes()) {
						boolean hasInstanceTypeName = genModel.useGenerics()
								&& genDataType.getEcoreDataType().getInstanceTypeName() != null
								&& genDataType.getEcoreDataType().getInstanceTypeName().contains("<");
						stringBuffer.append(TEXT_555);
						stringBuffer.append(genDataType.getClassifierInstanceName());
						stringBuffer.append(TEXT_556);
						stringBuffer.append(genDataType.getRawImportedInstanceClassName());
						stringBuffer.append(TEXT_557);
						stringBuffer.append(genDataType.getName());
						stringBuffer.append(TEXT_558);
						stringBuffer.append(genDataType.getSerializableFlag());
						stringBuffer.append(TEXT_559);
						stringBuffer.append(genDataType.getGeneratedInstanceClassFlag());
						if (hasInstanceTypeName) {
							stringBuffer.append(TEXT_560);
							stringBuffer.append(genDataType.getEcoreDataType().getInstanceTypeName());
							stringBuffer.append(TEXT_561);
						}
						stringBuffer.append(TEXT_562);
						stringBuffer.append(genModel.getNonNLS());
						if (hasInstanceTypeName) {
							stringBuffer.append(genModel.getNonNLS(2));
						}
					}
				}
				if (genPackage.getSuperGenPackage() == null) {
					stringBuffer.append(TEXT_563);
					stringBuffer.append(genPackage.getSchemaLocation());
					stringBuffer.append(TEXT_564);
				}
				if (!genPackage.isEcorePackage() && !genPackage.getAnnotationSources().isEmpty()) {
					stringBuffer.append(TEXT_565);
					for (String annotationSource : genPackage.getAnnotationSources()) {
						stringBuffer.append(TEXT_566);
						stringBuffer.append(annotationSource);
						stringBuffer.append(TEXT_567);
						stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
						stringBuffer.append(TEXT_568);
					}
				}
				stringBuffer.append(TEXT_569);
				for (String annotationSource : genPackage.getAnnotationSources()) {
					stringBuffer.append(TEXT_570);
					stringBuffer.append(annotationSource);
					stringBuffer.append(TEXT_571);
					stringBuffer.append(genPackage.getAnnotationSourceIdentifier(annotationSource));
					stringBuffer.append(TEXT_572);
					if (annotationSource == null) {
						stringBuffer.append(TEXT_573);
					} else {
						stringBuffer.append(TEXT_574);
						stringBuffer.append(annotationSource);
						stringBuffer.append(TEXT_575);
						stringBuffer.append(genModel.getNonNLS());
					}
					for (EAnnotation eAnnotation : genPackage.getAllAnnotations()) {
						List<GenPackage.AnnotationReferenceData> annotationReferenceDataList = genPackage
								.getReferenceData(eAnnotation);
						if (annotationSource == null ? eAnnotation.getSource() == null
								: annotationSource.equals(eAnnotation.getSource())) {
							stringBuffer.append(TEXT_576);
							stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
							stringBuffer.append(TEXT_577);
							for (Iterator<Map.Entry<String, String>> k = eAnnotation.getDetails().iterator(); k
									.hasNext();) {
								Map.Entry<String, String> detail = k.next();
								String key = Literals.toStringLiteral(detail.getKey(), genModel);
								String value = Literals.toStringLiteral(detail.getValue(), genModel);
								stringBuffer.append(TEXT_578);
								stringBuffer.append(key);
								stringBuffer.append(TEXT_579);
								stringBuffer.append(value);
								stringBuffer.append(k.hasNext() ? "," : "");
								stringBuffer.append(genModel.getNonNLS(key + value));
							}
							stringBuffer.append(TEXT_580);
							if (annotationReferenceDataList.isEmpty()) {
								stringBuffer.append(TEXT_581);
							} else {
								stringBuffer.append(TEXT_582);
							}
							if (!annotationReferenceDataList.isEmpty()) {
								stringBuffer.append(TEXT_583);
								stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
								stringBuffer.append(TEXT_584);
								for (Iterator<GenPackage.AnnotationReferenceData> k = annotationReferenceDataList
										.iterator(); k.hasNext();) {
									GenPackage.AnnotationReferenceData annotationReferenceData = k.next();
									stringBuffer.append(TEXT_585);
									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
									stringBuffer.append(TEXT_586);
									if (annotationReferenceData.containingGenPackage != genPackage) {
										stringBuffer.append(annotationReferenceData.containingGenPackage
												.getImportedPackageInterfaceName());
										stringBuffer.append(TEXT_587);
									}
									stringBuffer.append(TEXT_588);
									stringBuffer.append(annotationReferenceData.uriFragment);
									stringBuffer.append(TEXT_589);
									if (k.hasNext()) {
										stringBuffer.append(TEXT_590);
									}
									stringBuffer.append(genModel.getNonNLS());
								}
								stringBuffer.append(TEXT_591);
							}
							for (EAnnotation nestedEAnnotation : genPackage.getAllNestedAnnotations(eAnnotation)) {
								String nestedAnnotationSource = nestedEAnnotation.getSource();
								int depth = 0;
								boolean nonContentAnnotation = false;
								StringBuilder path = new StringBuilder();
								for (EObject eContainer = nestedEAnnotation
										.eContainer(), child = nestedEAnnotation; child != eAnnotation; child = eContainer, eContainer = eContainer
												.eContainer()) {
									boolean nonContentChild = child
											.eContainmentFeature() != EcorePackage.Literals.EANNOTATION__CONTENTS;
									if (path.length() != 0) {
										path.insert(0, ", ");
									}
									path.insert(0, nonContentChild);
									if (nonContentChild) {
										nonContentAnnotation = true;
									}
									++depth;
								}
								List<GenPackage.AnnotationReferenceData> nestedAnnotationReferenceDataList = genPackage
										.getReferenceData(nestedEAnnotation);
								stringBuffer.append(TEXT_592);
								stringBuffer.append(genPackage.getAnnotatedModelElementAccessor(eAnnotation));
								stringBuffer.append(TEXT_593);
								if (nonContentAnnotation
										&& genModel.getRuntimeVersion().getValue() >= GenRuntimeVersion.EMF210_VALUE) {
									stringBuffer.append(TEXT_594);
									stringBuffer.append(path.toString());
									stringBuffer.append(TEXT_595);
								} else {
									stringBuffer.append(depth);
								}
								stringBuffer.append(TEXT_596);
								if (nestedAnnotationSource == null) {
									stringBuffer.append(TEXT_597);
								} else {
									stringBuffer.append(TEXT_598);
									stringBuffer.append(nestedAnnotationSource);
									stringBuffer.append(TEXT_599);
									stringBuffer.append(genModel.getNonNLS());
								}
								stringBuffer.append(TEXT_600);
								for (Iterator<Map.Entry<String, String>> l = nestedEAnnotation.getDetails()
										.iterator(); l.hasNext();) {
									Map.Entry<String, String> detail = l.next();
									String key = Literals.toStringLiteral(detail.getKey(), genModel);
									String value = Literals.toStringLiteral(detail.getValue(), genModel);
									stringBuffer.append(TEXT_601);
									stringBuffer.append(key);
									stringBuffer.append(TEXT_602);
									stringBuffer.append(value);
									stringBuffer.append(l.hasNext() ? "," : "");
									stringBuffer.append(genModel.getNonNLS(key + value));
								}
								stringBuffer.append(TEXT_603);
								if (nestedAnnotationReferenceDataList.isEmpty()) {
									stringBuffer.append(TEXT_604);
								} else {
									stringBuffer.append(TEXT_605);
								}
								if (!nestedAnnotationReferenceDataList.isEmpty()) {
									stringBuffer.append(TEXT_606);
									stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
									stringBuffer.append(TEXT_607);
									for (Iterator<GenPackage.AnnotationReferenceData> l = nestedAnnotationReferenceDataList
											.iterator(); l.hasNext();) {
										GenPackage.AnnotationReferenceData annotationReferenceData = l.next();
										stringBuffer.append(TEXT_608);
										stringBuffer
												.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
										stringBuffer.append(TEXT_609);
										if (annotationReferenceData.containingGenPackage != genPackage) {
											stringBuffer.append(annotationReferenceData.containingGenPackage
													.getImportedPackageInterfaceName());
											stringBuffer.append(TEXT_610);
										}
										stringBuffer.append(TEXT_611);
										stringBuffer.append(annotationReferenceData.uriFragment);
										stringBuffer.append(TEXT_612);
										if (l.hasNext()) {
											stringBuffer.append(TEXT_613);
										}
										stringBuffer.append(genModel.getNonNLS());
									}
									stringBuffer.append(TEXT_614);
								}
							}
						}
					}
					stringBuffer.append(TEXT_615);
				}
			} else {
				if (genPackage.isLoadingInitialization()) {
					stringBuffer.append(TEXT_616);
					stringBuffer.append(genModel.getImportedName("java.net.URL"));
					stringBuffer.append(TEXT_617);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_618);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
					stringBuffer.append(TEXT_619);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.URI"));
					stringBuffer.append(TEXT_620);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.resource.Resource"));
					stringBuffer.append(TEXT_621);
					stringBuffer.append(
							genModel.getImportedName("org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl"));
					stringBuffer.append(TEXT_622);
					stringBuffer.append(genModel.getImportedName("java.io.IOException"));
					stringBuffer.append(TEXT_623);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.common.util.WrappedException"));
					stringBuffer.append(TEXT_624);
					stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EPackage"));
					stringBuffer.append(TEXT_625);
				}
				stringBuffer.append(TEXT_626);
				if (genModel.useClassOverrideAnnotation()) {
					stringBuffer.append(TEXT_627);
				}
				stringBuffer.append(TEXT_628);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_629);
				ArrayList<GenClass> dynamicGenClasses = new ArrayList<GenClass>();
				for (GenClass genClass : genPackage.getGenClasses()) {
					if (genClass.isDynamic()) {
						dynamicGenClasses.add(genClass);
					}
				}
				if (dynamicGenClasses.isEmpty()) {
					stringBuffer.append(TEXT_630);
					stringBuffer.append(genPackage.getInterfacePackageName());
					stringBuffer.append(TEXT_631);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_632);
				} else {
					stringBuffer.append(TEXT_633);
					for (GenClass genClass : dynamicGenClasses) {
						if (genClass.isDynamic()) {
							stringBuffer.append(TEXT_634);
							stringBuffer.append(genPackage.getClassifierID(genClass));
							stringBuffer.append(TEXT_635);
						}
					}
					stringBuffer.append(TEXT_636);
					stringBuffer.append(genPackage.getInterfacePackageName());
					stringBuffer.append(TEXT_637);
					stringBuffer.append(genModel.getNonNLS());
					stringBuffer.append(TEXT_638);
				}
				stringBuffer.append(TEXT_639);
			}
			if (needsAddEOperation) {
				stringBuffer.append(TEXT_640);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_641);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClass"));
				stringBuffer.append(TEXT_642);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_643);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_644);
			}
			if (needsAddEParameter) {
				stringBuffer.append(TEXT_645);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
				stringBuffer.append(TEXT_646);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EOperation"));
				stringBuffer.append(TEXT_647);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EClassifier"));
				stringBuffer.append(TEXT_648);
				stringBuffer.append(genModel.getImportedName("org.eclipse.emf.ecore.EParameter"));
				stringBuffer.append(TEXT_649);
			}
		}
		if (isInterface && genPackage.isLiteralsInterface()) {
			stringBuffer.append(TEXT_650);
			if (genModel.isOperationReflection()) {
				stringBuffer.append(TEXT_651);
			}
			stringBuffer.append(TEXT_652);
			if (isImplementation) {
				stringBuffer.append(TEXT_653);
			}
			stringBuffer.append(TEXT_654);
			for (GenClassifier genClassifier : genPackage.getGenClassifiers()) {
				stringBuffer.append(TEXT_655);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					if (!genClass.isInterface()) {
						stringBuffer.append(TEXT_656);
						stringBuffer.append(genClass.getQualifiedClassName());
						stringBuffer.append(TEXT_657);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_658);
						stringBuffer.append(genClass.getQualifiedClassName());
					} else {
						stringBuffer.append(TEXT_659);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
						stringBuffer.append(TEXT_660);
						stringBuffer.append(genClass.getFormattedName());
						stringBuffer.append(TEXT_661);
						stringBuffer.append(genClass.getQualifiedInterfaceName());
					}
				} else if (genClassifier instanceof GenEnum) {
					GenEnum genEnum = (GenEnum) genClassifier;
					stringBuffer.append(TEXT_662);
					stringBuffer.append(genEnum.getQualifiedName());
					stringBuffer.append(TEXT_663);
					stringBuffer.append(genEnum.getFormattedName());
					stringBuffer.append(TEXT_664);
					stringBuffer.append(genEnum.getQualifiedName());
				} else if (genClassifier instanceof GenDataType) {
					GenDataType genDataType = (GenDataType) genClassifier;
					stringBuffer.append(TEXT_665);
					stringBuffer.append(genDataType.getFormattedName());
					stringBuffer.append(TEXT_666);
					if (!genDataType.isPrimitiveType() && !genDataType.isArrayType()) {
						stringBuffer.append(TEXT_667);
						stringBuffer.append(genDataType.getRawInstanceClassName());
					}
				}
				stringBuffer.append(TEXT_668);
				stringBuffer.append(genPackage.getQualifiedPackageClassName());
				stringBuffer.append(TEXT_669);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_670);
				stringBuffer.append(publicStaticFinalFlag);
				stringBuffer.append(genClassifier.getImportedMetaType());
				stringBuffer.append(TEXT_671);
				stringBuffer.append(genPackage.getClassifierID(genClassifier));
				stringBuffer.append(TEXT_672);
				stringBuffer.append(genClassifier.getClassifierAccessorName());
				stringBuffer.append(TEXT_673);
				if (genClassifier instanceof GenClass) {
					GenClass genClass = (GenClass) genClassifier;
					for (GenFeature genFeature : genClass.getGenFeatures()) {
						stringBuffer.append(TEXT_674);
						stringBuffer.append(genFeature.getFormattedName());
						stringBuffer.append(TEXT_675);
						stringBuffer.append(genFeature.getFeatureKind());
						stringBuffer.append(TEXT_676);
						stringBuffer.append(publicStaticFinalFlag);
						stringBuffer.append(genFeature.getImportedMetaType());
						stringBuffer.append(TEXT_677);
						stringBuffer.append(genClass.getFeatureID(genFeature));
						stringBuffer.append(TEXT_678);
						stringBuffer.append(genFeature.getFeatureAccessorName());
						stringBuffer.append(TEXT_679);
					}
					if (genModel.isOperationReflection()) {
						for (GenOperation genOperation : genClass.getGenOperations()) {
							stringBuffer.append(TEXT_680);
							stringBuffer.append(genOperation.getFormattedName());
							stringBuffer.append(TEXT_681);
							stringBuffer.append(publicStaticFinalFlag);
							stringBuffer.append(genOperation.getImportedMetaType());
							stringBuffer.append(TEXT_682);
							stringBuffer.append(genClass.getOperationID(genOperation, false));
							stringBuffer.append(TEXT_683);
							stringBuffer.append(genOperation.getOperationAccessorName());
							stringBuffer.append(TEXT_684);
						}
					}
				}
			}
			stringBuffer.append(TEXT_685);
		}
		stringBuffer.append(TEXT_686);
		stringBuffer.append(isInterface ? genPackage.getPackageInterfaceName() : genPackage.getPackageClassName());
		genModel.emitSortedImports();
		stringBuffer.append(TEXT_687);
		InternalPatternContext ictx = (InternalPatternContext) ctx;
		new Node.DataLeaf(ictx.getNode(), getClass(), "doGenerate", stringBuffer.toString());
	}

	public boolean preCondition(PatternContext ctx) throws Exception {
		GenPackage genPackage = parameter;
		genModel = parameter.getGenModel();
		boolean canGenerate = new CodegenGeneratorAdapter(parameter)
				.canGenerate("org.eclipse.emf.codegen.ecore.genmodel.generator.ModelProject");
		canGenerate = canGenerate && (genPackage.hasClassifiers());
		return canGenerate;
	}
}