@Override
	protected List<List<String>> loadRecipes()
	{
		final String filename=parametersFile();
		@SuppressWarnings("unchecked")
		List<List<String>> recipes=(List<List<String>>)Resources.getResource("PARSED_RECIPE: "+filename);
		if(recipes==null)
		{
			final StringBuffer str=new CMFile(Resources.buildResourcePath("skills")+filename,null,CMFile.FLAG_LOGERRORS).text();
			recipes=loadList(str);
			if(recipes.size()==0)
				Log.errOut("LeatherWorking","Recipes not found!");
			else
			{
				final List<List<String>> newRecipes=new Vector<List<String>>();
				for(int r=0;r<recipes.size();r++)
				{
					final List<String> V=recipes.get(r);
					if(V.size()>0)
					{
						final String name=V.get(RCP_FINALNAME);
						final int baseLevel=CMath.s_int(V.get(RCP_LEVEL))+2;
						for(final Stage s : Stage.values())
						{
							final List<String> V1=new XVector<String>(V);
							V1.set(RCP_FINALNAME,s.name()+" "+name);
							final int level=baseLevel+s.recipeLevel;
							V1.set(RCP_LEVEL,""+level);
							for(int i=0;i<=newRecipes.size();i++)
							{
								if(newRecipes.size()==i)
								{
									newRecipes.add(V1);
									break;
								}
								else
								if(CMath.s_int(newRecipes.get(i).get(RCP_LEVEL))>level)
								{
									newRecipes.add(i,V1);
									break;
								}
							}
						}
					}
				}
				recipes.clear();
				recipes=newRecipes;
			}
			Resources.submitResource("PARSED_RECIPE: "+filename,recipes);
		}
		return recipes;
	}