[Demonstration 1]

[Buggy Method]
private static ItemStack getStack(JsonObject jsonObj) {
    String itemName = net.minecraft.util.JsonUtils.getString(jsonObj, "item");
    Item item = ForgeRegistries.ITEMS.getValue(new ResourceLocation(itemName));
    if (item == null) {
        throw new JsonParseException(String.format("Unknown item '%s'", itemName));
    }
    if (item.getHasSubtypes() && !jsonObj.has("data")) {
        throw new JsonParseException(String.format("Missing data for item '%s'", itemName));
    }
    ItemStack stack;
    if (jsonObj.has("nbt")) {
        try {
            NBTTagCompound nbt = JsonToNBT.getTagFromJson(GSON.toJson(jsonObj.get("nbt")));
            NBTTagCompound tmp = new NBTTagCompound();
            if (nbt.hasKey("ForgeCaps")) {
                tmp.setTag("ForgeCaps", nbt.getTag("ForgeCaps"));
                nbt.removeTag("ForgeCaps");
            }
            tmp.setTag("tag", nbt);
            tmp.setString("id", itemName);
            tmp.setInteger("Count", net.minecraft.util.JsonUtils.getInt(jsonObj, "count", 1));
            tmp.setInteger("Damage", net.minecraft.util.JsonUtils.getInt(jsonObj, "data", 0));
            stack = new ItemStack(tmp);
        } catch (NBTException e) {
            throw new JsonParseException("Invalid NBT Entry: " + e.toString());
        }
    } else {
        stack = new ItemStack(item, net.minecraft.util.JsonUtils.getInt(jsonObj, "count", 1), net.minecraft.util.JsonUtils.getInt(jsonObj, "data", 0));
    }
    if (!ItemStackUtils.isValid(stack)) {
        throw new JsonParseException("Invalid Item: " + stack.toString());
    }
    return stack;
}

[Buggy Hunk]
NBTTagCompound nbt = JsonToNBT.getTagFromJson(GSON.toJson(jsonObj.get("nbt")));

[Patch]
NBTTagCompound nbt = JsonToNbtFixed.__readSingleStruct(GSON.toJson(jsonObj.get("nbt")));

[Demonstration 2]

[Buggy Method]
public void start() {
    LOGGER.info(String.format("Starting experiment with user uid=%s", uid));
    final long experimentStartTime = System.currentTimeMillis();
    final long experimentEndTime = experimentStartTime + FOUR_MINUTES_IN_MILLIS;
    while (!shouldStop) {
        if (System.currentTimeMillis() > experimentEndTime) {
            break;
        }
        application.clearScreen();
        currentTask = tasks[currentStep];
        started = true;
        if (currentTask == null) {
            LOGGER.severe("Current task is null, this is terrible!");
            break;
        }
        try {
            Thread.sleep(PAUSE_INTERVAL_SECONDS_IN_MILLIS);
        } catch (final InterruptedException e) {
            LOGGER.warning("Thread interrupted");
        }
        currentTask.setStarted();
        currentTask.setStartTime(System.currentTimeMillis());
        application.displayTask(numbers[currentStep]);
        final long endTime = System.currentTimeMillis() + DISPLAY_INTERVAL_SECONDS_IN_MILLIS;
        while (!shouldStop) {
            if (System.currentTimeMillis() > endTime) {
                break;
            }
        }
        currentTask.setEnded();
        switch(level) {
            case EASY:
                if (numbers[currentStep] != 5) {
                    currentTask.setCorrect(true);
                    break;
                }
                currentTask.setCorrect(false);
                break;
            case MEDIUM:
                if (currentStep < 2) {
                    currentTask.setCorrect(true);
                    break;
                }
                if (!(isEvenNumber(numbers[currentStep]) && isEvenNumber(numbers[currentStep - 1]) && isEvenNumber(numbers[currentStep - 2]))) {
                    currentTask.setCorrect(true);
                }
                currentTask.setCorrect(false);
                break;
            case DIFFICULT:
                if (currentStep < 2) {
                    currentTask.setCorrect(true);
                    break;
                }
                if (numbers[currentStep] != numbers[currentStep - 2]) {
                    currentTask.setCorrect(true);
                }
                currentTask.setCorrect(false);
                break;
            default:
                throw new RuntimeException("This should not happen!");
        }
        currentStep++;
    }
    LOGGER.info("Experiment finished");
    //        printResult();
    writeInputCSV();
}

[Buggy Hunk]
while (!shouldStop) {

[Patch]
while (!shouldStop && currentStep < numbers.length) {

[Demonstration 3]

[Buggy Method]
@Override
public void readFromNBT(NBTTagCompound compound) {
    super.readFromNBT(compound);
    NBTTagCompound nbt = (NBTTagCompound) compound.getTag("darkness");
    this.powered = nbt.getBoolean("powered");
    setPower(nbt.getInteger("orbPower"));
    System.out.println("nbt tag = " + compound.toString());
}

[Buggy Hunk]
setPower(nbt.getInteger("orbPower"));

[Patch]
this.power=(nbt.getInteger("orbPower"));