getprop("ro.product.device") == "cereus" || abort("E3004: This package is for \"cereus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.3.0.PCGMIXM:user/release-keys");
ui_print("Target: xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.4.0.PCGMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.3.0.PCGMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.4.0.PCGMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.3.0.PCGMIXM:user/release-keys or xiaomi/cereus/cereus:9/PPR1.180610.011/V10.4.4.0.PCGMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_space(214437888) || abort("E3006: Not enough free space on /cache to apply patches.");
apply_patch_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56755104:5b73ab89cdbabe38b36bc8e4040e0ace652bd1aa:56755104:2fc971008e143f6c812c6ce01ec9649a32c290d5", "5b73ab89cdbabe38b36bc8e4040e0ace652bd1aa", "2fc971008e143f6c812c6ce01ec9649a32c290d5") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:56755104:5b73ab89cdbabe38b36bc8e4040e0ace652bd1aa:56755104:2fc971008e143f6c812c6ce01ec9649a32c290d5\" has unexpected contents.");
apply_patch_space(56755104) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/platform/bootdevice/by-name/system", "480,1,424,665,4755,5102,5106,5141,5151,5443,32770,32927,32928,33433,60284,60286,60297,60773,60792,62290,63145,63147,63628,63631,63644,64038,64083,64084,65536,66042,67591,67592,70258,70261,72871,72872,73911,73913,74595,74596,82788,87232,87234,87699,88291,88294,88296,88314,88324,88351,88370,88373,88623,88626,89035,89038,89338,89587,89589,89671,98304,98969,101594,101597,101686,102603,104083,104084,104103,104737,104755,104756,105317,105319,106308,106311,106345,106350,106537,106538,108961,108963,111208,111209,117169,117172,117225,117226,118666,118669,120207,120210,121471,121474,121655,121656,121872,121874,122013,122018,122028,122029,127415,127418,127429,127430,131072,131578,141764,141767,143040,143045,143691,143694,143710,143713,143754,143755,147669,147670,147672,147674,147680,147683,147694,147969,149735,149738,149750,151824,160598,160599,161850,161853,163098,163101,163840,164505,164909,164910,178654,178655,181295,183380,185053,185054,185063,185064,185067,185069,185217,185220,185264,185266,188173,188174,188176,188178,188195,188198,188334,188337,188380,188381,191146,191147,191149,191151,191164,191167,191184,191187,191206,191209,191648,191649,191657,191659,192109,192112,192132,192135,194395,194398,194414,194415,194437,194439,194606,194609,194734,194737,194751,194754,196608,197114,197351,197354,197368,197371,197527,197528,201981,201982,202418,202420,202431,202434,202765,202768,202778,202781,202791,202796,203190,203193,203561,203562,203654,203656,203719,203722,203738,203739,203748,203750,203759,203760,203775,203777,203974,203977,204623,204626,204630,204632,204652,204653,204655,204658,204945,204948,204969,204972,205377,205380,205394,205397,206677,206682,206696,206697,206699,206701,206712,206713,206722,206725,207673,207676,208357,208362,208444,208447,211363,211365,214505,214506,215423,215425,216249,216250,216252,216254,216264,216267,216298,216300,221151,221152,229087,229090,229100,229101,229376,230041,232660,232663,232706,232707,232795,232797,232812,232813,232829,232830,232872,232874,232901,232904,233808,233812,234828,234831,243916,243917,257542,257545,257561,257564,257574,257577,260909,260912,261070,261073,261327,261330,262144,262650,272152,272153,274140,274142,274187,274188,274259,274261,274268,274273,279131,279132,279721,279724,280374,280377,280583,280584,290106,290108,290186,290189,290764,290767,291101,291104,292495,292498,292588,292591,294912,295577,297594,297595,298931,298934,303094,303095,323502,323503,327060,327062,327112,327115,327680,328186,329821,329824,330133,330134,330205,330208,330579,330580,330945,330947,330959,330962,331164,331167,331257,331258,331275,331277,331284,331287,331355,331358,332547,332550,332561,332564,332671,332672,332677,332679,332685,332688,332702,332705,332718,332723,332885,332888,333436,333439,333502,333503,354790,354793,355474,355477,359124,359127,360197,360200,360448,360954,361107,361108,364275,364277,364322,364323,371983,371985,372056,372059,374289,374292,374332,374333,375647,375649,375667,375670,378243,378246,379817,379820,381417,381420,381450,381452,382575,382578,388570,388573,390602,390605,390623,390626,391267,391270,391791,391794,391811,391814,393217,393722,425985,426490,458753,459258,461136,463048,491521,492026,524289,524794,557057,557562,589825,590330,595844,622592,622593,644999,655221,655359,655360") == "b881b1a552a39a23da0c1f9e801dfd7fb0f9fe80" || block_image_verify("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/system", "480,1,424,665,4755,5102,5106,5141,5151,5443,32770,32927,32928,33433,60284,60286,60297,60773,60792,62290,63145,63147,63628,63631,63644,64038,64083,64084,65536,66042,67591,67592,70258,70261,72871,72872,73911,73913,74595,74596,82788,87232,87234,87699,88291,88294,88296,88314,88324,88351,88370,88373,88623,88626,89035,89038,89338,89587,89589,89671,98304,98969,101594,101597,101686,102603,104083,104084,104103,104737,104755,104756,105317,105319,106308,106311,106345,106350,106537,106538,108961,108963,111208,111209,117169,117172,117225,117226,118666,118669,120207,120210,121471,121474,121655,121656,121872,121874,122013,122018,122028,122029,127415,127418,127429,127430,131072,131578,141764,141767,143040,143045,143691,143694,143710,143713,143754,143755,147669,147670,147672,147674,147680,147683,147694,147969,149735,149738,149750,151824,160598,160599,161850,161853,163098,163101,163840,164505,164909,164910,178654,178655,181295,183380,185053,185054,185063,185064,185067,185069,185217,185220,185264,185266,188173,188174,188176,188178,188195,188198,188334,188337,188380,188381,191146,191147,191149,191151,191164,191167,191184,191187,191206,191209,191648,191649,191657,191659,192109,192112,192132,192135,194395,194398,194414,194415,194437,194439,194606,194609,194734,194737,194751,194754,196608,197114,197351,197354,197368,197371,197527,197528,201981,201982,202418,202420,202431,202434,202765,202768,202778,202781,202791,202796,203190,203193,203561,203562,203654,203656,203719,203722,203738,203739,203748,203750,203759,203760,203775,203777,203974,203977,204623,204626,204630,204632,204652,204653,204655,204658,204945,204948,204969,204972,205377,205380,205394,205397,206677,206682,206696,206697,206699,206701,206712,206713,206722,206725,207673,207676,208357,208362,208444,208447,211363,211365,214505,214506,215423,215425,216249,216250,216252,216254,216264,216267,216298,216300,221151,221152,229087,229090,229100,229101,229376,230041,232660,232663,232706,232707,232795,232797,232812,232813,232829,232830,232872,232874,232901,232904,233808,233812,234828,234831,243916,243917,257542,257545,257561,257564,257574,257577,260909,260912,261070,261073,261327,261330,262144,262650,272152,272153,274140,274142,274187,274188,274259,274261,274268,274273,279131,279132,279721,279724,280374,280377,280583,280584,290106,290108,290186,290189,290764,290767,291101,291104,292495,292498,292588,292591,294912,295577,297594,297595,298931,298934,303094,303095,323502,323503,327060,327062,327112,327115,327680,328186,329821,329824,330133,330134,330205,330208,330579,330580,330945,330947,330959,330962,331164,331167,331257,331258,331275,331277,331284,331287,331355,331358,332547,332550,332561,332564,332671,332672,332677,332679,332685,332688,332702,332705,332718,332723,332885,332888,333436,333439,333502,333503,354790,354793,355474,355477,359124,359127,360197,360200,360448,360954,361107,361108,364275,364277,364322,364323,371983,371985,372056,372059,374289,374292,374332,374333,375647,375649,375667,375670,378243,378246,379817,379820,381417,381420,381450,381452,382575,382578,388570,388573,390602,390605,390623,390626,391267,391270,391791,391794,391811,391814,393217,393722,425985,426490,458753,459258,461136,463048,491521,492026,524289,524794,557057,557562,589825,590330,595844,622592,622593,644999,655221,655359,655360") && block_image_verify("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/platform/bootdevice/by-name/vendor", "20,1,139,555,32770,32817,32818,33323,65537,66042,75944,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") == "ea3bb1bc48e044d57b1863455b5aca137e412b5c" || block_image_verify("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/vendor", "20,1,139,555,32770,32817,32818,33323,65537,66042,75944,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") && block_image_verify("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;

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

ui_print("Installing boot image...");
package_extract_file("boot.img", "/dev/block/platform/bootdevice/by-name/boot");
show_progress(0.600000, 400);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("logo.bin", "/dev/block/platform/bootdevice/by-name/logo");
package_extract_file("odmdtbo.img", "/dev/block/platform/bootdevice/by-name/odmdtbo");
ui_print("Patching md1img image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56755104:5b73ab89cdbabe38b36bc8e4040e0ace652bd1aa:56755104:2fc971008e143f6c812c6ce01ec9649a32c290d5",
            "-", 2fc971008e143f6c812c6ce01ec9649a32c290d5, 56755104,
            5b73ab89cdbabe38b36bc8e4040e0ace652bd1aa, package_extract_file("patch/md1img.img.p")) || abort("Failed to apply patch \"patch/md1img.img.p \".");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot1"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("tee1", "tee2");
switch_active("lk", "lk2");
switch_active("scp1", "scp2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot0"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("tee2", "tee1");
switch_active("lk2", "lk");
switch_active("scp2", "scp1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
set_ota_result_for_dm_verity();
show_progress(0.100000, 2);
