get_device_compatible("kate") == "OK" || abort("This package is for \"kate\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/kate/kate:6.0.1/MMB29M/9.3.21:user/release-keys");
ui_print("Target: Xiaomi/kate/kate:6.0.1/MMB29M/9.3.28:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/kate/kate:6.0.1/MMB29M/9.3.21:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/kate/kate:6.0.1/MMB29M/9.3.28:user/release-keys" ||
    abort("Package expects build fingerprint of Xiaomi/kate/kate:6.0.1/MMB29M/9.3.21:user/release-keys or Xiaomi/kate/kate:6.0.1/MMB29M/9.3.28:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 1);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:35044682:3bdec0ab3dca72b6bb726eca5ed3ec5324d0482f:35044682:2d5a73839d22e480bff18979e4280af2329f008e") || abort("\"EMMC:/dev/block/bootdevice/by-name/boot:35044682:3bdec0ab3dca72b6bb726eca5ed3ec5324d0482f:35044682:2d5a73839d22e480bff18979e4280af2329f008e\" has unexpected contents.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/aboot:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005") || abort("\"EMMC:/dev/block/bootdevice/by-name/aboot:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005\" has unexpected contents.");
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/abootbak:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005") || abort("\"EMMC:/dev/block/bootdevice/by-name/abootbak:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005\" has unexpected contents.");
apply_patch_space(599504) || abort("Not enough free space on /system to apply patches.");
show_progress(0.100000, 50);
if (range_sha1("/dev/block/bootdevice/by-name/system", "90,1,32770,32961,32963,33471,65535,65536,65538,66046,98303,98304,98306,98497,98499,99007,131071,131072,131074,131582,163839,163840,163842,164033,164035,164543,196607,196608,196610,197118,229375,229376,229378,229569,229571,230079,262143,262144,262146,262654,294911,294912,294914,295105,295107,295615,327679,327680,327682,328190,360447,360448,360450,360958,393215,393216,393218,393726,425983,425984,425986,426494,458751,458752,458754,459262,491519,491520,491522,492030,504275,524288,524290,557056,557058,589824,589826,622592,622594,655360,655362,688128,688130,720896,720898,753664,753666,754174,780230,780231,786384") == "25c00f8c9ba82e4812cc267a0ba6b17916b9868f" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
abort("system partition has unexpected contents");
endif;

# ---- start making changes here ----

ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:35044682:3bdec0ab3dca72b6bb726eca5ed3ec5324d0482f:35044682:2d5a73839d22e480bff18979e4280af2329f008e",
            "-", 2d5a73839d22e480bff18979e4280af2329f008e, 35044682,
            3bdec0ab3dca72b6bb726eca5ed3ec5324d0482f, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
apply_patch("EMMC:/dev/block/bootdevice/by-name/aboot:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005",
            "-", 0307f6f42acd0db41915c025a10bcc61f614b005, 599504,
            079dad1a29ef02b81c4b7f6fc0163d4df9b96430, package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) || abort("Failed to apply patch \"patch/firmware-update/emmc_appsboot.mbn.p \".");
apply_patch("EMMC:/dev/block/bootdevice/by-name/abootbak:599504:079dad1a29ef02b81c4b7f6fc0163d4df9b96430:599504:0307f6f42acd0db41915c025a10bcc61f614b005",
            "-", 0307f6f42acd0db41915c025a10bcc61f614b005, 599504,
            079dad1a29ef02b81c4b7f6fc0163d4df9b96430, package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) || abort("Failed to apply patch \"patch/firmware-update/emmc_appsboot.mbn.p \".");
package_extract_file("META-INF/com/miui/miui_update", "/cache/miui_update");
set_metadata("/cache/miui_update", "uid", 0, "gid", 0, "mode", 0555, "capabilities", 0x0);
run_program("/cache/miui_update");
delete("/cache/miui_update");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
    abort("Failed to update system image.");
show_progress(0.100000, 2);
