getprop("ro.product.device") == "surya" || abort("E3004: This package is for \"surya\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.1.0.QJGTRXM:user/release-keys");
ui_print("Target: POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.2.0.QJGTRXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.1.0.QJGTRXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.2.0.QJGTRXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.1.0.QJGTRXM:user/release-keys or POCO/surya_tr/surya:10/QKQ1.200512.002/V12.0.2.0.QJGTRXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:134217728:de602ccdf9e025eb30585e92a84e0fc7c1871ff6",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:a9bcf23c124baa7a512e12a0a0b7444f54dd0ad0") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:de602ccdf9e025eb30585e92a84e0fc7c1871ff6\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:a9bcf23c124baa7a512e12a0a0b7444f54dd0ad0\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "52,1,198,226,235,288,289,549,553,565,566,585,586,1903,1904,2333,2334,26238,26239,27606,27607,32768,32770,32932,32952,33018,33019,33233,33235,33395,33399,33407,33408,33416,33420,33425,98306,98468,163842,164004,229378,229540,294914,295076,622610,622612,655361,655380,661608,663627,674143,674287,674288") == "fd8a1df03d579ec69211c8b35941542b1963728d" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "52,1,198,226,235,288,289,549,553,565,566,585,586,1903,1904,2333,2334,26238,26239,27606,27607,32768,32770,32932,32952,33018,33019,33233,33235,33395,33399,33407,33408,33416,33420,33425,98306,98468,163842,164004,229378,229540,294914,295076,622610,622612,655361,655380,661608,663627,674143,674287,674288") && block_image_verify(map_partition("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(map_partition("vendor"), "50,1,100,110,114,119,120,201,205,210,211,216,217,480,484,488,489,491,492,494,505,517,521,525,535,536,537,545,549,553,554,1165,1502,1579,1580,1676,32770,32837,98306,98373,163842,163909,229378,229445,262165,262167,274883,275869,280242,280311,280312") == "1ff7e1c695e26794b1162e44d600c6a5e0514a17" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "50,1,100,110,114,119,120,201,205,210,211,216,217,480,484,488,489,491,492,494,505,517,521,525,535,536,537,545,549,553,554,1165,1502,1579,1580,1676,32770,32837,98306,98373,163842,163909,229378,229445,262165,262167,274883,275869,280242,280311,280312") && block_image_verify(map_partition("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(map_partition("product"), "302,1,89,105,109,113,114,4450,4454,5929,5930,6594,6597,6601,6602,6643,6644,6651,6657,6658,7380,7387,7388,7394,7400,7401,7402,7462,7466,7471,7472,10227,10228,13700,13701,14339,14343,15113,15114,17521,17522,17885,17889,18396,18397,18409,18415,18416,18417,25310,25311,25712,25713,32768,32770,32838,32849,32951,32952,40962,40963,42426,42427,53496,53497,57710,57711,65536,65547,66152,66154,66155,66156,66157,66158,66437,66438,66444,66445,66447,66448,66454,66460,66461,66596,66597,66598,66610,66616,66617,66618,66621,66622,66628,66634,66635,66636,66659,66665,66666,66667,67511,67512,81210,81211,81230,81231,96900,96901,97022,97023,97199,97200,97567,97568,98304,98306,98374,98385,98400,98401,104784,104785,109537,109538,111788,111789,111976,111977,111988,111994,111995,111996,112006,112007,112012,112016,112021,112022,112026,112032,112036,112037,112043,112049,112050,112051,112063,112069,112070,112071,112081,112087,112088,112089,112091,112098,112104,112105,113862,113863,113869,113870,114004,114005,115213,115220,115274,115281,115286,115293,115318,115325,115344,115351,115369,115376,115392,115393,115404,115406,115575,115576,115577,115578,115579,115580,115581,115582,115619,115621,115629,115630,115636,115637,115975,115979,115983,115987,115988,115990,115995,115999,116000,116004,116005,116009,116010,116014,116015,116019,116020,116024,116025,116029,116030,116032,116033,116034,116037,116043,116044,116048,116049,116053,116054,116058,116059,116061,116062,116066,116067,116071,116072,116074,116075,116079,116080,116084,116085,116089,116090,116094,116095,116099,116100,116104,116105,116109,116110,116114,116115,116117,116121,116125,116126,116130,116131,116135,116136,116140,116141,116143,116144,116148,116149,116151,116152,116156,116157,116159,116160,116164,116165,116169,116170,116172,116173,116177,116178,116333,116370,116628,117360,117361,120965,120966,131072,131085,131177,131190,131194,131198,131200,163842,163910,229378,229446,279261,280118,284559,284630,284631") == "ba34e2927d406be68192877d4b02ea66342aa0f3" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "302,1,89,105,109,113,114,4450,4454,5929,5930,6594,6597,6601,6602,6643,6644,6651,6657,6658,7380,7387,7388,7394,7400,7401,7402,7462,7466,7471,7472,10227,10228,13700,13701,14339,14343,15113,15114,17521,17522,17885,17889,18396,18397,18409,18415,18416,18417,25310,25311,25712,25713,32768,32770,32838,32849,32951,32952,40962,40963,42426,42427,53496,53497,57710,57711,65536,65547,66152,66154,66155,66156,66157,66158,66437,66438,66444,66445,66447,66448,66454,66460,66461,66596,66597,66598,66610,66616,66617,66618,66621,66622,66628,66634,66635,66636,66659,66665,66666,66667,67511,67512,81210,81211,81230,81231,96900,96901,97022,97023,97199,97200,97567,97568,98304,98306,98374,98385,98400,98401,104784,104785,109537,109538,111788,111789,111976,111977,111988,111994,111995,111996,112006,112007,112012,112016,112021,112022,112026,112032,112036,112037,112043,112049,112050,112051,112063,112069,112070,112071,112081,112087,112088,112089,112091,112098,112104,112105,113862,113863,113869,113870,114004,114005,115213,115220,115274,115281,115286,115293,115318,115325,115344,115351,115369,115376,115392,115393,115404,115406,115575,115576,115577,115578,115579,115580,115581,115582,115619,115621,115629,115630,115636,115637,115975,115979,115983,115987,115988,115990,115995,115999,116000,116004,116005,116009,116010,116014,116015,116019,116020,116024,116025,116029,116030,116032,116033,116034,116037,116043,116044,116048,116049,116053,116054,116058,116059,116061,116062,116066,116067,116071,116072,116074,116075,116079,116080,116084,116085,116089,116090,116094,116095,116099,116100,116104,116105,116109,116110,116114,116115,116117,116121,116125,116126,116130,116131,116135,116136,116140,116141,116143,116144,116148,116149,116151,116152,116156,116157,116159,116160,116164,116165,116169,116170,116172,116173,116177,116178,116333,116370,116628,117360,117361,120965,120966,131072,131085,131177,131190,131194,131198,131200,163842,163910,229378,229446,279261,280118,284559,284630,284631") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:de602ccdf9e025eb30585e92a84e0fc7c1871ff6",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:a9bcf23c124baa7a512e12a0a0b7444f54dd0ad0",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:a9bcf23c124baa7a512e12a0a0b7444f54dd0ad0");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition product

ui_print("Patching product image after verification.");
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition vendor

ui_print("Patching vendor image after verification.");
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition system

ui_print("Patching system image after verification.");
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
