// Path: src/main/java/eureka/items/ItemResearchNote.java
// public class ItemResearchNote extends Item {
// 	public String key;
// 
// 	public ItemResearchNote(String key) {
// 		setCreativeTab(Eureka.eureka);
// 		setTextureName("eureka:ResearchNote");
// 		setUnlocalizedName("researchNote");
// 		this.key = key;
// 	}
// 
// 	@Override
// 	public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
// 		EurekaAPI.API.completeResearch(player, key);
// 		if (EurekaAPI.API.hasPlayerFinishedResearch(key, player))
// 			player.destroyCurrentEquippedItem();
// 		return stack;
// 	}
// 
// 	@Override
// 	public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) {
// 		list.add(TextGetter.getTitle(key));
// 	}
// }


import com.google.common.collect.ImmutableList;
import cpw.mods.fml.common.registry.GameRegistry;
import eureka.api.*;
import eureka.items.ItemResearchNote;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.util.*;
	private ArrayList<IEurekaInfo> keylist = new ArrayList<IEurekaInfo>();
	private HashMap<String, IEurekaInfo> keylookup = new HashMap<String, IEurekaInfo>();
	private ArrayList<IDropHandler> dropHandlers = new ArrayList<IDropHandler>();
	private HashMap<Block, String> blockMap = new HashMap<Block, String>();
	private HashMap<Item, String> itemMap = new HashMap<Item, String>();
	private EnumMap<EnumProgressOptions, HashMap<Object, List<String>>> progress = new EnumMap<EnumProgressOptions, HashMap<Object, List<String>>>(EnumProgressOptions.class);

	@Override
	public void registerCategory(ICategory category) {
		categories.add(category);
		keys.put(category.getName(), new ArrayList<IEurekaInfo>());
		this.category.put(category.getName(), category);
	}

	@Override
	public void register(IEurekaInfo info) {
		if (keys.keySet().contains(info.getName())) {
			Logger.error("Duplicate registation: '" + info.getName() + "' is already used");
		} else {
			if (!categories.contains(category.get(info.getCategory()))) {
				Logger.error("Warning: Key with non-existing category added");
				return;
			}
			keylist.add(info);
			List<IEurekaInfo> list = keys.get(info.getCategory());
			list.add(info);
			keys.remove(info.getCategory());
			keys.put(info.getCategory(), list);
			keylookup.put(info.getName(), info);
		}
// Path: src/main/java/eureka/items/ItemResearchNote.java
// public class ItemResearchNote extends Item {
// 	public String key;
// 
// 	public ItemResearchNote(String key) {
// 		setCreativeTab(Eureka.eureka);
// 		setTextureName("eureka:ResearchNote");
// 		setUnlocalizedName("researchNote");
// 		this.key = key;
// 	}
// 
// 	@Override
// 	public ItemStack onItemRightClick(ItemStack stack, World world, EntityPlayer player) {
// 		EurekaAPI.API.completeResearch(player, key);
// 		if (EurekaAPI.API.hasPlayerFinishedResearch(key, player))
// 			player.destroyCurrentEquippedItem();
// 		return stack;
// 	}
// 
// 	@Override
// 	public void addInformation(ItemStack stack, EntityPlayer player, List list, boolean advanced) {
// 		list.add(TextGetter.getTitle(key));
// 	}
// }


// Path: src/main/java/eureka/core/EurekaAPIImplementation.java
import com.google.common.collect.ImmutableList;
import cpw.mods.fml.common.registry.GameRegistry;
import eureka.api.*;
import eureka.items.ItemResearchNote;
import net.minecraft.block.Block;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import java.util.*;

	private ArrayList<IEurekaInfo> keylist = new ArrayList<IEurekaInfo>();
	private HashMap<String, IEurekaInfo> keylookup = new HashMap<String, IEurekaInfo>();
	private ArrayList<IDropHandler> dropHandlers = new ArrayList<IDropHandler>();
	private HashMap<Block, String> blockMap = new HashMap<Block, String>();
	private HashMap<Item, String> itemMap = new HashMap<Item, String>();
	private EnumMap<EnumProgressOptions, HashMap<Object, List<String>>> progress = new EnumMap<EnumProgressOptions, HashMap<Object, List<String>>>(EnumProgressOptions.class);

	@Override
	public void registerCategory(ICategory category) {
		categories.add(category);
		keys.put(category.getName(), new ArrayList<IEurekaInfo>());
		this.category.put(category.getName(), category);
	}

	@Override
	public void register(IEurekaInfo info) {
		if (keys.keySet().contains(info.getName())) {
			Logger.error("Duplicate registation: '" + info.getName() + "' is already used");
		} else {
			if (!categories.contains(category.get(info.getCategory()))) {
				Logger.error("Warning: Key with non-existing category added");
				return;
			}
			keylist.add(info);
			List<IEurekaInfo> list = keys.get(info.getCategory());
			list.add(info);
			keys.remove(info.getCategory());
			keys.put(info.getCategory(), list);
			keylookup.put(info.getName(), info);
		}
		ItemResearchNote note = new ItemResearchNote(info.getName());