getprop("ro.product.device") == "lime" || abort("E3004: This package is for \"lime\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/lime/lime:10/QKQ1.200830.002/V12.0.14.0.QJQCNXM:user/release-keys");
ui_print("Target: Redmi/lime/lime:10/QKQ1.200830.002/V12.0.16.0.QJQCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.14.0.QJQCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.16.0.QJQCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/lime/lime:10/QKQ1.200830.002/V12.0.14.0.QJQCNXM:user/release-keys or Redmi/lime/lime:10/QKQ1.200830.002/V12.0.16.0.QJQCNXM: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:100663296:5ac607a023e358397e120dc6a5e05b7f77318f6b",
                      "EMMC:/dev/block/bootdevice/by-name/boot:100663296:493b32155a078a1be7acebbd8088461f018d2e40") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:5ac607a023e358397e120dc6a5e05b7f77318f6b\" or \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:493b32155a078a1be7acebbd8088461f018d2e40\" has unexpected contents.");
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "18,1,32770,32967,98306,98503,163842,164039,229378,229575,294914,295111,786435,786448,807366,810067,822904,823075,823076") == "43d8771dd64d2779a3b30e1402f63d68faa02904" || 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"), "18,1,32770,32967,98306,98503,163842,164039,229378,229575,294914,295111,786435,786448,807366,810067,822904,823075,823076") && 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"), "500,1,114,124,128,133,134,216,220,225,226,1900,1904,2381,2382,2645,2649,2653,2654,2656,2660,2662,2673,2696,2697,2733,2737,2787,2788,2924,2925,2937,2941,2945,2946,2949,2955,2956,2957,2969,2973,2977,2984,2993,2994,4925,5265,5351,5352,8849,8850,8970,9022,9620,9621,9625,9626,9630,9631,9635,9636,9641,9642,9646,9647,9648,9649,9652,9653,9654,9655,9658,9659,9660,9661,9663,9665,9666,9667,9670,9671,9672,9673,9676,9677,9678,9679,9682,9683,9689,9690,9694,9695,9698,9700,9703,9705,9709,9710,9714,9715,9716,9717,9720,9721,9722,9723,9726,9727,9728,9729,9732,9733,9734,9735,9738,9739,9740,9741,9744,9745,9750,9751,9752,9753,9757,9758,10170,10171,11260,11268,14821,14822,14824,14825,14877,14878,32768,32770,32855,32880,42189,42190,49238,49239,49344,49345,49346,49347,49845,49847,49852,49854,49860,49862,49867,49869,49928,49930,50150,50155,55376,55377,58623,58625,58663,58664,63283,63284,63918,63920,64561,64563,65088,65089,65536,65555,65684,65685,66591,66592,66600,66601,66697,66698,68622,68624,79601,79602,79896,79897,79901,79903,79920,79921,79956,79957,79966,79967,79968,79969,80024,80025,80730,80731,80747,80748,80787,80788,80813,80814,80850,80851,80999,81000,81005,81006,81479,81480,85548,85549,85551,85553,85617,85618,85688,85689,85756,85757,85759,85760,85762,85763,85822,85824,85826,85827,85891,85892,85962,85963,86030,86031,86033,86034,86036,86039,86040,86042,86044,86045,86051,86052,86054,86055,86058,86059,86069,86072,86074,86075,86077,86079,86082,86083,86092,86093,86095,86096,86099,86101,86103,86104,86110,86111,86113,86114,86117,86118,86129,86131,86133,86134,86140,86141,86143,86144,86147,86148,86159,86161,86163,86164,86170,86171,86173,86174,86176,86177,86179,86180,86182,86193,86253,86254,86256,86257,86267,86268,86334,86335,86412,86413,86423,86424,86490,86491,86567,86568,86647,86648,86724,86725,86801,86802,86878,86879,86889,86890,86893,86894,86957,86958,87033,87034,87044,87045,87111,87112,87188,87189,87261,87262,87264,87265,87277,87281,87283,87284,87286,87288,87291,87292,87296,87297,87299,87300,87303,87304,88633,88635,88640,88642,88768,88769,88818,88821,89001,89002,89029,89030,89045,89046,89435,89436,89442,89443,89463,89464,89534,98306,98391,100962,101190,101265,101346,101359,101367,101428,101574,101583,101690,101698,101843,101853,102171,102216,105116,105117,105721,108459,112013,112014,112608,112623,112925,112926,119514,119515,120912,120974,124750,124751,125195,125196,131072,131102,131103,131104,132711,132712,134681,134682,134685,134686,138839,138840,143421,143432,145290,145291,145297,145299,145306,145307,145387,145388,145448,145449,151729,151731,151810,151811,158336,158337,162175,162176,162268,162269,162730,162731,163840,163842,163927,163946,166888,166889,170816,170817,171204,171205,173174,173203,175176,175177,182352,182353,185843,185899,186796,186797,186810,188413,188416,190829,192100,192101,192489,192490,195445,195447,196608,196633,198370,198371,198494,198495,198499,198500,198731,229378,229463,294914,294999,327696,327699,348930,350032,355581,355663,355664") == "55a3843a76765d81f3280bd121ccb04a07907983" || 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"), "500,1,114,124,128,133,134,216,220,225,226,1900,1904,2381,2382,2645,2649,2653,2654,2656,2660,2662,2673,2696,2697,2733,2737,2787,2788,2924,2925,2937,2941,2945,2946,2949,2955,2956,2957,2969,2973,2977,2984,2993,2994,4925,5265,5351,5352,8849,8850,8970,9022,9620,9621,9625,9626,9630,9631,9635,9636,9641,9642,9646,9647,9648,9649,9652,9653,9654,9655,9658,9659,9660,9661,9663,9665,9666,9667,9670,9671,9672,9673,9676,9677,9678,9679,9682,9683,9689,9690,9694,9695,9698,9700,9703,9705,9709,9710,9714,9715,9716,9717,9720,9721,9722,9723,9726,9727,9728,9729,9732,9733,9734,9735,9738,9739,9740,9741,9744,9745,9750,9751,9752,9753,9757,9758,10170,10171,11260,11268,14821,14822,14824,14825,14877,14878,32768,32770,32855,32880,42189,42190,49238,49239,49344,49345,49346,49347,49845,49847,49852,49854,49860,49862,49867,49869,49928,49930,50150,50155,55376,55377,58623,58625,58663,58664,63283,63284,63918,63920,64561,64563,65088,65089,65536,65555,65684,65685,66591,66592,66600,66601,66697,66698,68622,68624,79601,79602,79896,79897,79901,79903,79920,79921,79956,79957,79966,79967,79968,79969,80024,80025,80730,80731,80747,80748,80787,80788,80813,80814,80850,80851,80999,81000,81005,81006,81479,81480,85548,85549,85551,85553,85617,85618,85688,85689,85756,85757,85759,85760,85762,85763,85822,85824,85826,85827,85891,85892,85962,85963,86030,86031,86033,86034,86036,86039,86040,86042,86044,86045,86051,86052,86054,86055,86058,86059,86069,86072,86074,86075,86077,86079,86082,86083,86092,86093,86095,86096,86099,86101,86103,86104,86110,86111,86113,86114,86117,86118,86129,86131,86133,86134,86140,86141,86143,86144,86147,86148,86159,86161,86163,86164,86170,86171,86173,86174,86176,86177,86179,86180,86182,86193,86253,86254,86256,86257,86267,86268,86334,86335,86412,86413,86423,86424,86490,86491,86567,86568,86647,86648,86724,86725,86801,86802,86878,86879,86889,86890,86893,86894,86957,86958,87033,87034,87044,87045,87111,87112,87188,87189,87261,87262,87264,87265,87277,87281,87283,87284,87286,87288,87291,87292,87296,87297,87299,87300,87303,87304,88633,88635,88640,88642,88768,88769,88818,88821,89001,89002,89029,89030,89045,89046,89435,89436,89442,89443,89463,89464,89534,98306,98391,100962,101190,101265,101346,101359,101367,101428,101574,101583,101690,101698,101843,101853,102171,102216,105116,105117,105721,108459,112013,112014,112608,112623,112925,112926,119514,119515,120912,120974,124750,124751,125195,125196,131072,131102,131103,131104,132711,132712,134681,134682,134685,134686,138839,138840,143421,143432,145290,145291,145297,145299,145306,145307,145387,145388,145448,145449,151729,151731,151810,151811,158336,158337,162175,162176,162268,162269,162730,162731,163840,163842,163927,163946,166888,166889,170816,170817,171204,171205,173174,173203,175176,175177,182352,182353,185843,185899,186796,186797,186810,188413,188416,190829,192100,192101,192489,192490,195445,195447,196608,196633,198370,198371,198494,198495,198499,198500,198731,229378,229463,294914,294999,327696,327699,348930,350032,355581,355663,355664") && 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"), "230,1,55,71,75,79,80,87,93,94,95,741,745,752,753,759,765,766,767,769,770,776,782,783,784,899,905,906,907,919,925,926,927,930,931,937,943,944,945,968,974,975,976,3916,3917,16193,16194,16249,16250,32768,32770,32790,32815,32816,32817,35303,35304,38795,38796,38807,38813,38814,38815,38825,38826,38831,38835,38840,38841,38845,38851,38855,38856,38862,38868,38869,38870,38882,38888,38889,38890,38900,38906,38907,38908,38910,38917,38923,38924,43252,43253,43341,43342,43488,43490,43500,43502,43548,43550,43560,43562,43571,43572,45390,45397,45466,45473,45478,45485,45515,45522,45541,45548,45566,45573,45589,45590,45601,45603,45767,45768,45769,45770,45771,45772,45808,45810,45818,45819,46141,46145,46149,46153,46154,46158,46159,46163,46164,46168,46169,46173,46174,46178,46179,46183,46184,46188,46189,46191,46198,46202,46203,46207,46208,46212,46213,46217,46218,46222,46223,46227,46228,46232,46233,46235,46236,46240,46241,46245,46246,46250,46251,46255,46256,46260,46261,46265,46266,46270,46271,46275,46276,46278,46283,46287,46288,46292,46293,46297,46298,46302,46303,46305,46306,46310,46311,46313,46314,46318,46319,46323,46324,46326,46327,46331,46332,46336,46337,46339,46340,46344,46345,46450,46453,46501,47519,47520,51328,51329,52533,52534,57597,57598,59220,59223,61810,84775,85035,86386,86419,86420") == "6077c3d628566d8522dbf51ae8acaabc5d9c35bb" || 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
ifelse (block_image_recover(map_partition("product"), "230,1,55,71,75,79,80,87,93,94,95,741,745,752,753,759,765,766,767,769,770,776,782,783,784,899,905,906,907,919,925,926,927,930,931,937,943,944,945,968,974,975,976,3916,3917,16193,16194,16249,16250,32768,32770,32790,32815,32816,32817,35303,35304,38795,38796,38807,38813,38814,38815,38825,38826,38831,38835,38840,38841,38845,38851,38855,38856,38862,38868,38869,38870,38882,38888,38889,38890,38900,38906,38907,38908,38910,38917,38923,38924,43252,43253,43341,43342,43488,43490,43500,43502,43548,43550,43560,43562,43571,43572,45390,45397,45466,45473,45478,45485,45515,45522,45541,45548,45566,45573,45589,45590,45601,45603,45767,45768,45769,45770,45771,45772,45808,45810,45818,45819,46141,46145,46149,46153,46154,46158,46159,46163,46164,46168,46169,46173,46174,46178,46179,46183,46184,46188,46189,46191,46198,46202,46203,46207,46208,46212,46213,46217,46218,46222,46223,46227,46228,46232,46233,46235,46236,46240,46241,46245,46246,46250,46251,46255,46256,46260,46261,46265,46266,46270,46271,46275,46276,46278,46283,46287,46288,46292,46293,46297,46298,46302,46303,46305,46306,46310,46311,46313,46314,46318,46319,46323,46324,46326,46327,46331,46332,46336,46337,46339,46340,46344,46345,46450,46453,46501,47519,47520,51328,51329,52533,52534,57597,57598,59220,59223,61810,84775,85035,86386,86419,86420") && 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:100663296:5ac607a023e358397e120dc6a5e05b7f77318f6b",
                "EMMC:/dev/block/bootdevice/by-name/boot:100663296:493b32155a078a1be7acebbd8088461f018d2e40",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:100663296:493b32155a078a1be7acebbd8088461f018d2e40");

# ---- 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/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
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/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
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/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
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/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
