getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.6.0.RJSEUXM:user/release-keys");
ui_print("Target: Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.7.0.RJSEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.6.0.RJSEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.7.0.RJSEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.6.0.RJSEUXM:user/release-keys or Redmi/gauguin_eea/gauguin:11/RKQ1.200826.002/V12.5.7.0.RJSEUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0f2d2c45931e566f34025a551cc19618fe49a0db"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:99518366a81e1e795f608dc6a0de2f5f43db45aa")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0f2d2c45931e566f34025a551cc19618fe49a0db"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:99518366a81e1e795f608dc6a0de2f5f43db45aa"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "40,1,33,38,115607,115608,119274,119435,119437,119443,214850,215251,215255,215267,234684,235574,235576,235604,268932,268933,321030,321035,331198,331202,337134,337140,401176,401215,401216,401234,403993,405155,420947,420958,655374,655377,660687,662687,673188,673332,673333") == "2f6c0111edc407fe88634712e78dc8e8ea3ae915" || 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"), "40,1,33,38,115607,115608,119274,119435,119437,119443,214850,215251,215255,215267,234684,235574,235576,235604,268932,268933,321030,321035,331198,331202,337134,337140,401176,401215,401216,401234,403993,405155,420947,420958,655374,655377,660687,662687,673188,673332,673333") && 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"), "276,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,5128,5179,5266,5267,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,32851,32852,32873,32874,32976,32977,32978,32979,33477,33479,33484,33486,33492,33494,33499,33501,33560,33562,33782,33783,35013,35015,35063,35064,39773,39775,40442,40444,40998,41000,41583,41584,42490,42491,42499,42500,42721,42722,46091,46092,46708,46709,48436,48437,65536,65559,75769,75770,75774,75776,75793,75794,75829,75830,75839,75840,75983,75984,76034,76035,76041,76042,76747,76748,76757,76758,76766,76768,76809,76810,76835,76836,76869,76870,76905,76908,76977,76978,77013,77014,77019,77020,77064,77065,77081,77082,77505,77506,81536,81537,81550,360296,360448,360460,360468,360503,361439,367168,367254,367255") == "07cafbf539d82448c9c7ccccb2a14d24c832663e" || 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"), "276,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,5128,5179,5266,5267,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,32851,32852,32873,32874,32976,32977,32978,32979,33477,33479,33484,33486,33492,33494,33499,33501,33560,33562,33782,33783,35013,35015,35063,35064,39773,39775,40442,40444,40998,41000,41583,41584,42490,42491,42499,42500,42721,42722,46091,46092,46708,46709,48436,48437,65536,65559,75769,75770,75774,75776,75793,75794,75829,75830,75839,75840,75983,75984,76034,76035,76041,76042,76747,76748,76757,76758,76766,76768,76809,76810,76835,76836,76869,76870,76905,76908,76977,76978,77013,77014,77019,77020,77064,77065,77081,77082,77505,77506,81536,81537,81550,360296,360448,360460,360468,360503,361439,367168,367254,367255") && 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"), "6,1,298023,298928,303667,303740,303741") == "0a259cdec0e2706e4daacd5827b956d77a38e931" || 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"), "6,1,298023,298928,303667,303740,303741") && 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;
if (range_sha1(map_partition("odm"), "12,1,12,13,16,24,243,244,247,249,255,274,275") == "ca9b397b92fab3cdd9aa357b8d906db0b53711fa" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,12,13,16,24,243,244,247,249,255,274,275") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "320,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,234,240,244,245,251,257,258,259,453,457,461,462,465,469,474,475,478,479,485,491,492,493,515,521,522,523,1258,1262,1280,1281,1285,1291,1292,1293,1295,1296,1307,1313,1314,1315,1325,1326,1331,1335,1339,1340,1344,1350,1354,1355,1362,1368,1369,1370,1382,1388,1389,1390,1392,1399,1405,1412,1417,1424,1454,1461,1480,1487,1505,1510,1527,1534,1550,1551,1646,1648,1658,1659,1671,1672,1673,1674,1675,1676,1684,1685,1708,1709,1755,1760,1763,1766,1769,1772,1775,1777,1781,1782,1786,1789,1794,1795,1798,1805,1809,1812,1813,1878,2275,2277,2281,2285,2290,2292,2297,2301,2302,2306,2307,2311,2312,2316,2317,2321,2322,2326,2327,2331,2332,2334,2341,2345,2346,2350,2351,2355,2356,2360,2361,2365,2366,2370,2371,2375,2376,2378,2379,2383,2384,2388,2389,2393,2394,2398,2399,2403,2404,2408,2409,2413,2414,2416,2420,2424,2425,2429,2430,2432,2433,2435,2436,2440,2441,2445,2446,2448,2449,2453,2454,2458,2459,2463,2464,2468,2469,2471,2472,2476,2477,2479,2483,2496,2501,2531,2534,2646,5118,5119,5253,5931,6184,6185,8250,8251,8309,8310,8850,8851,8901,8902,9211,9212,14393,14394,14466,14467,14475,14476,14611,14612,14616,14617,14670,14671,14681,14682,14715,14716,14735,14736,14788,14789,14934,14935,15010,15011,15157,15158,19908,19910,20049,20050,20075,20076,20172,20173,20224,20225,20236,20237,20287,20288,20363,20364,20427,20428,20690,20691,21195,21196,25070,25071,25127,25128,25552,25553,31643,32680,32768,32802,33542,33543,35129,35130,40223,40224,41102,41103,41154,41155,41473,41474,43534,43535,49298,49355,51037,51039,51221,51223,51271,51273,52857,52859,52876,98324,98327,112669,113008,114802,114840,114841") == "bb50f2a4635b1888d66a2f4aeb76dc2167d32ddc" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "320,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,150,234,240,244,245,251,257,258,259,453,457,461,462,465,469,474,475,478,479,485,491,492,493,515,521,522,523,1258,1262,1280,1281,1285,1291,1292,1293,1295,1296,1307,1313,1314,1315,1325,1326,1331,1335,1339,1340,1344,1350,1354,1355,1362,1368,1369,1370,1382,1388,1389,1390,1392,1399,1405,1412,1417,1424,1454,1461,1480,1487,1505,1510,1527,1534,1550,1551,1646,1648,1658,1659,1671,1672,1673,1674,1675,1676,1684,1685,1708,1709,1755,1760,1763,1766,1769,1772,1775,1777,1781,1782,1786,1789,1794,1795,1798,1805,1809,1812,1813,1878,2275,2277,2281,2285,2290,2292,2297,2301,2302,2306,2307,2311,2312,2316,2317,2321,2322,2326,2327,2331,2332,2334,2341,2345,2346,2350,2351,2355,2356,2360,2361,2365,2366,2370,2371,2375,2376,2378,2379,2383,2384,2388,2389,2393,2394,2398,2399,2403,2404,2408,2409,2413,2414,2416,2420,2424,2425,2429,2430,2432,2433,2435,2436,2440,2441,2445,2446,2448,2449,2453,2454,2458,2459,2463,2464,2468,2469,2471,2472,2476,2477,2479,2483,2496,2501,2531,2534,2646,5118,5119,5253,5931,6184,6185,8250,8251,8309,8310,8850,8851,8901,8902,9211,9212,14393,14394,14466,14467,14475,14476,14611,14612,14616,14617,14670,14671,14681,14682,14715,14716,14735,14736,14788,14789,14934,14935,15010,15011,15157,15158,19908,19910,20049,20050,20075,20076,20172,20173,20224,20225,20236,20237,20287,20288,20363,20364,20427,20428,20690,20691,21195,21196,25070,25071,25127,25128,25552,25553,31643,32680,32768,32802,33542,33543,35129,35130,40223,40224,41102,41103,41154,41155,41473,41474,43534,43535,49298,49355,51037,51039,51221,51223,51271,51273,52857,52859,52876,98324,98327,112669,113008,114802,114840,114841") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


# ---- 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/abl_ecc.elf", "/dev/block/bootdevice/by-name/abl");
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/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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/abl_ecc.elf", "/dev/block/bootdevice/by-name/ablbak");
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/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
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.");

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
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 product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
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 odm

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

# Patch partition system_ext

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

# --- End patching dynamic partitions ---

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

# ---- 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");
set_progress(1.000000);
