getprop("ro.product.device") == "px30_evb" || abort("E3004: This package is for \"px30_evb\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150043:userdebug/test-keys");
ui_print("Target: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/220052:userdebug/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150043:userdebug/test-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/220052:userdebug/test-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/150043:userdebug/test-keys or rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/220052:userdebug/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/by-name/boot:24614912:0ff172456b741f5371214d1c067fe598b93ab8c1:24616960:ca6e1576d2c8816af1ff0b208de8a2ef9496ac22") || abort("E3005: \"EMMC:/dev/block/by-name/boot:24614912:0ff172456b741f5371214d1c067fe598b93ab8c1:24616960:ca6e1576d2c8816af1ff0b208de8a2ef9496ac22\" has unexpected contents.");
apply_patch_space(91738112) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/by-name/system", "52,1,203,214,383,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,18197,21713,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,32770,32958,98306,98494,131073,139264,163842,164030,229378,229566,294914,295102,372513,387072,390122,390129,393216") == "9c99c96eeb936f2af4e9edae19786dabc8e51db7" || block_image_verify("/dev/block/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/by-name/system");
ifelse (block_image_recover("/dev/block/by-name/system", "52,1,203,214,383,6262,6271,6303,6305,6461,6462,6877,6879,7454,7455,16455,16457,17729,17730,18062,18064,18167,18170,18196,18197,21713,21716,21782,21785,23892,23895,24126,24129,24139,24142,24240,32770,32958,98306,98494,131073,139264,163842,164030,229378,229566,294914,295102,372513,387072,390122,390129,393216") && block_image_verify("/dev/block/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/by-name/vendor", "58,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4232,4329,4339,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,37767,66808,96760,97524,97531,98304") == "931be3368c4eadd4d04c1f005031a8d835f97883" || block_image_verify("/dev/block/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/by-name/vendor");
ifelse (block_image_recover("/dev/block/by-name/vendor", "58,1,53,55,96,3079,3086,3115,3116,3150,3151,3211,3212,4232,4329,4339,4354,4585,4614,4634,4635,5141,5142,5674,5675,10599,10610,14896,14925,15334,15335,15398,15399,20037,20038,20505,22098,24997,25726,26380,29425,31886,31894,32200,32201,32539,32540,32768,32770,32817,32818,37765,37766,37767,66808,96760,97524,97531,98304") && block_image_verify("/dev/block/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;
if (range_sha1("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,3657,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") == "e45a8a0ff0bfcf0aa9eb543e4373a74ea3e6c211" || block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat")) then
ui_print("Verified oem image...");
else
check_first_block("/dev/block/by-name/oem");
ifelse (block_image_recover("/dev/block/by-name/oem", "22,1,36,37,39,2053,2060,2750,2754,3657,6062,6064,6065,8973,9005,32768,32770,32801,32802,64504,65014,65021,65536") && block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat"), ui_print("oem recovered successfully."), abort("E2004: oem partition fails to recover"));
endif;

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

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/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.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching oem image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat") ||
  abort("E2001: Failed to update oem image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/by-name/boot:24614912:0ff172456b741f5371214d1c067fe598b93ab8c1:24616960:ca6e1576d2c8816af1ff0b208de8a2ef9496ac22",
            "-", ca6e1576d2c8816af1ff0b208de8a2ef9496ac22, 24616960,
            0ff172456b741f5371214d1c067fe598b93ab8c1,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:24614912:0ff172456b741f5371214d1c067fe598b93ab8c1:24616960:ca6e1576d2c8816af1ff0b208de8a2ef9496ac22");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
