getprop("ro.product.device") == "joyeuse" || abort("E3004: This package is for \"joyeuse\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZIDXM:user/release-keys");
ui_print("Target: Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZIDXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZIDXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZIDXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.4.0.SJZIDXM:user/release-keys or Redmi/joyeuse_id/joyeuse:12/RKQ1.211019.001/V13.0.5.0.SJZIDXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ddd9e7822a3d342149710b86ed6675862c0ca1a8"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:985b8b779007cf47c6c06a820423ad6f1a85c8fa")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:ddd9e7822a3d342149710b86ed6675862c0ca1a8"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:985b8b779007cf47c6c06a820423ad6f1a85c8fa"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "146,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,41983,41984,41998,45803,45810,45811,45818,45819,45832,45833,46557,46558,47368,47369,48305,48306,51307,51308,51451,51452,51484,51485,51625,51626,53124,53126,54031,54032,54291,54429,58302,58303,58325,58326,59570,59571,59659,59660,59734,59735,59764,59765,60421,60422,60427,60428,60461,60462,63221,63222,64634,64635,64665,64666,65030,65032,65033,65034,65536,65551,65826,65827,66836,66837,78045,78046,78704,78705,80829,80830,80991,80992,81724,81725,83935,83936,88545,88546,89333,89334,94984,94985,96229,96230,96955,96956,98304,98321,101818,101819,102805,102806,103968,103969,105305,105306,111842,111843,112416,112417,120213,120214,120513,120514,130722,130723,131072,131087,132924,132925,135184,135185,135881,135882,138405,688135,688143,720897,720911,721086,723265,734727,734880,734881") == "a09575ea91ed1533c7257b334ba7f69b41db7741" || 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"), "146,1,31,44,58,114,115,659,660,9725,9726,11883,22800,32768,32785,40220,40221,40501,40502,40843,40845,40918,40919,41983,41984,41998,45803,45810,45811,45818,45819,45832,45833,46557,46558,47368,47369,48305,48306,51307,51308,51451,51452,51484,51485,51625,51626,53124,53126,54031,54032,54291,54429,58302,58303,58325,58326,59570,59571,59659,59660,59734,59735,59764,59765,60421,60422,60427,60428,60461,60462,63221,63222,64634,64635,64665,64666,65030,65032,65033,65034,65536,65551,65826,65827,66836,66837,78045,78046,78704,78705,80829,80830,80991,80992,81724,81725,83935,83936,88545,88546,89333,89334,94984,94985,96229,96230,96955,96956,98304,98321,101818,101819,102805,102806,103968,103969,105305,105306,111842,111843,112416,112417,120213,120214,120513,120514,130722,130723,131072,131087,132924,132925,135184,135185,135881,135882,138405,688135,688143,720897,720911,721086,723265,734727,734880,734881") && 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"), "328,1,38,49,50,130,135,1781,1782,1788,1789,1794,1795,1858,1859,1864,1865,1870,1871,1876,1877,1890,1891,2645,2646,5048,5049,14163,14164,14168,14169,15142,15144,15148,15150,15172,15173,15174,15175,15178,15179,15184,15185,15186,15187,15190,15191,15192,15193,15198,15199,15203,15204,15208,15209,15213,15214,15218,15219,15223,15225,15226,15227,15229,15231,15232,15233,15236,15237,15238,15239,15242,15243,15244,15245,15248,15249,15250,15251,15254,15255,15256,15257,15260,15261,15262,15263,15267,15268,15271,15273,15277,15278,15281,15283,15288,15289,15293,15294,15295,15296,15299,15300,15301,15302,15305,15306,15307,15308,15312,15313,15314,15315,15318,15319,15320,15321,15324,15325,15326,15327,15330,15331,15337,15338,15342,15343,15347,15348,15711,15712,15939,15940,16598,16602,30694,30695,32216,32217,32219,32221,32285,32286,32356,32357,32424,32425,32427,32428,32430,32431,32490,32492,32494,32495,32559,32560,32630,32631,32698,32699,32701,32702,32704,32713,32768,32826,32830,32831,32832,32833,32834,32835,32895,32896,32898,32899,32963,32964,32966,32967,33028,33029,33038,33039,33101,33102,33168,33169,33171,33172,33175,33180,33182,33183,33185,33187,33189,33191,33250,33251,33253,33254,33316,33317,33319,33320,33381,33382,33390,33392,33452,33453,33525,33526,33528,33529,33591,33592,33662,33663,33671,33675,33676,33677,33876,33877,33943,33944,33946,33947,33950,33955,34199,34446,34477,34483,34484,34677,35935,35936,36000,36001,36151,36152,36231,36232,36256,36257,36327,36328,36395,36396,36427,36428,36520,36521,36593,36594,36618,36619,36705,36706,36745,36746,36748,36749,36781,36782,37003,37004,37120,37121,37192,37193,37249,37250,37391,37392,37393,37394,37504,37505,37570,37571,37601,37602,37650,37651,37721,37722,37804,37805,38059,38060,38118,38119,38417,38421,38423,38425,38426,38433,38545,38554,38556,38558,38559,38561,38614,38615,38632,38634,38640,38642,38692,38693,39825,39826,39900,39901,40032,40033,40041,229399,229407,258509,259295,263335") == "eaff99200269e9291ad8a1432b33658adc7cfd8d" || 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"), "328,1,38,49,50,130,135,1781,1782,1788,1789,1794,1795,1858,1859,1864,1865,1870,1871,1876,1877,1890,1891,2645,2646,5048,5049,14163,14164,14168,14169,15142,15144,15148,15150,15172,15173,15174,15175,15178,15179,15184,15185,15186,15187,15190,15191,15192,15193,15198,15199,15203,15204,15208,15209,15213,15214,15218,15219,15223,15225,15226,15227,15229,15231,15232,15233,15236,15237,15238,15239,15242,15243,15244,15245,15248,15249,15250,15251,15254,15255,15256,15257,15260,15261,15262,15263,15267,15268,15271,15273,15277,15278,15281,15283,15288,15289,15293,15294,15295,15296,15299,15300,15301,15302,15305,15306,15307,15308,15312,15313,15314,15315,15318,15319,15320,15321,15324,15325,15326,15327,15330,15331,15337,15338,15342,15343,15347,15348,15711,15712,15939,15940,16598,16602,30694,30695,32216,32217,32219,32221,32285,32286,32356,32357,32424,32425,32427,32428,32430,32431,32490,32492,32494,32495,32559,32560,32630,32631,32698,32699,32701,32702,32704,32713,32768,32826,32830,32831,32832,32833,32834,32835,32895,32896,32898,32899,32963,32964,32966,32967,33028,33029,33038,33039,33101,33102,33168,33169,33171,33172,33175,33180,33182,33183,33185,33187,33189,33191,33250,33251,33253,33254,33316,33317,33319,33320,33381,33382,33390,33392,33452,33453,33525,33526,33528,33529,33591,33592,33662,33663,33671,33675,33676,33677,33876,33877,33943,33944,33946,33947,33950,33955,34199,34446,34477,34483,34484,34677,35935,35936,36000,36001,36151,36152,36231,36232,36256,36257,36327,36328,36395,36396,36427,36428,36520,36521,36593,36594,36618,36619,36705,36706,36745,36746,36748,36749,36781,36782,37003,37004,37120,37121,37192,37193,37249,37250,37391,37392,37393,37394,37504,37505,37570,37571,37601,37602,37650,37651,37721,37722,37804,37805,38059,38060,38118,38119,38417,38421,38423,38425,38426,38433,38545,38554,38556,38558,38559,38561,38614,38615,38632,38634,38640,38642,38692,38693,39825,39826,39900,39901,40032,40033,40041,229399,229407,258509,259295,263335") && 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"), "312,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,34150,34151,34227,34228,34235,34236,34571,34572,34578,34579,34665,34666,34667,34668,36600,36601,48275,48276,55197,55200,55257,55260,55274,55275,55287,55289,55361,55363,55391,55393,55436,55439,55450,55454,55667,55671,55682,55684,56472,56473,65536,65542,66046,66047,73788,73789,74326,74333,74601,74607,76004,76010,77125,77126,77133,77134,77137,77138,77268,77269,77282,77283,78099,78100,87189,87190,93842,93843,94754,94755,98304,98312,98334,98336,112579,112580,112659,112660,115823,115825,131072,131078,138070,138071,138458,138459,139504,139505,147287,147288,148763,148764,154186,154187,158525,158527,158536,158538,158546,158548,158557,158559,159353,159354,159361,159362,159368,159369,159372,159373,159380,159381,163840,163848,164927,164928,165080,165081,165146,165148,165150,165151,165180,165181,165674,165675,165810,165811,165935,165937,165939,165941,165951,165952,166513,166514,166521,166522,166561,166562,166587,166588,166612,166613,166632,166633,166647,166649,167858,167859,168037,168039,168040,168041,168047,168048,168052,168053,168078,168079,168083,168085,168087,168089,168110,168111,168123,168124,168251,168254,168669,168670,169041,169042,170527,170528,173195,173196,173215,173216,173256,173257,173269,173270,173306,173307,173323,173324,173340,173341,173375,173376,173514,173515,173528,173529,173533,173534,173541,173542,173554,173555,189301,189303,193035,193036,196608,196621,197105,197106,200739,200741,200827,200830,201688,201689,206859,206860,213397,213398,216273,216274,216865,216866,225803,225804,229376,229406,230798,230801,232101,232102,232644,232645,234272,234273,259877,259878,262144,262150,269278,269279,289836,289837,290041,290042,290075,290076,290598,290599,291353,291354,291621,291622,293008,293010,293169,293170,294082,294083,294180,294181,294851,294852,294912,294917,297853,297854,298884,298887,303588,303589,311504,316442,316519,316520") == "0091d1a7a431c72e3c84e846220e6deb53f97dbd" || 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"), "312,1,15,32,33,7397,7398,7543,7545,8114,8116,8386,8387,8396,8397,9051,9052,9068,9069,18696,18697,27198,27203,27376,27380,29687,29688,30293,30294,30677,30678,30691,30692,32532,32533,32768,32776,34150,34151,34227,34228,34235,34236,34571,34572,34578,34579,34665,34666,34667,34668,36600,36601,48275,48276,55197,55200,55257,55260,55274,55275,55287,55289,55361,55363,55391,55393,55436,55439,55450,55454,55667,55671,55682,55684,56472,56473,65536,65542,66046,66047,73788,73789,74326,74333,74601,74607,76004,76010,77125,77126,77133,77134,77137,77138,77268,77269,77282,77283,78099,78100,87189,87190,93842,93843,94754,94755,98304,98312,98334,98336,112579,112580,112659,112660,115823,115825,131072,131078,138070,138071,138458,138459,139504,139505,147287,147288,148763,148764,154186,154187,158525,158527,158536,158538,158546,158548,158557,158559,159353,159354,159361,159362,159368,159369,159372,159373,159380,159381,163840,163848,164927,164928,165080,165081,165146,165148,165150,165151,165180,165181,165674,165675,165810,165811,165935,165937,165939,165941,165951,165952,166513,166514,166521,166522,166561,166562,166587,166588,166612,166613,166632,166633,166647,166649,167858,167859,168037,168039,168040,168041,168047,168048,168052,168053,168078,168079,168083,168085,168087,168089,168110,168111,168123,168124,168251,168254,168669,168670,169041,169042,170527,170528,173195,173196,173215,173216,173256,173257,173269,173270,173306,173307,173323,173324,173340,173341,173375,173376,173514,173515,173528,173529,173533,173534,173541,173542,173554,173555,189301,189303,193035,193036,196608,196621,197105,197106,200739,200741,200827,200830,201688,201689,206859,206860,213397,213398,216273,216274,216865,216866,225803,225804,229376,229406,230798,230801,232101,232102,232644,232645,234272,234273,259877,259878,262144,262150,269278,269279,289836,289837,290041,290042,290075,290076,290598,290599,291353,291354,291621,291622,293008,293010,293169,293170,294082,294083,294180,294181,294851,294852,294912,294917,297853,297854,298884,298887,303588,303589,311504,316442,316519,316520") && 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("system_ext"), "156,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28744,28745,28766,28767,29955,29958,29965,29966,30204,30205,30271,30272,30468,30469,30473,30474,30479,30480,30919,30920,30932,30933,30939,30940,30952,30953,30964,30965,30970,30971,30977,30978,30991,30992,31004,31005,31033,31034,31052,31053,31183,31184,31271,31272,31291,31292,31294,31295,31296,31297,31298,31300,31301,31302,31303,31304,31334,31346,31348,31349,31350,31351,32088,32332,32768,32795,33811,33812,34926,34927,34956,34957,35333,36208,36324,36325,36474,36475,37738,38009,38479,38488,38805,38826,39264,39265,39317,39318,39627,39628,39977,39978,44954,44955,49418,57986,58661,58673,59083,59114,59847,59848,59909,59910,60229,60230,65536,65552,72337,74698,76673,128169,130083,130084,130465,130466,131072,131084,131088,131100,132503,132504,132535,132536,132552,132555,132866,132867,132871,132874,132891,132892,133284,133287,133309,133310,133317,133318,133330,133331,133753,135875,135918,135919") == "326b523d3bd1b47d27cf6734f9292baac6fea1c3" || 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"), "156,1,24,27959,27961,27969,27970,28032,28033,28426,28428,28485,28486,28744,28745,28766,28767,29955,29958,29965,29966,30204,30205,30271,30272,30468,30469,30473,30474,30479,30480,30919,30920,30932,30933,30939,30940,30952,30953,30964,30965,30970,30971,30977,30978,30991,30992,31004,31005,31033,31034,31052,31053,31183,31184,31271,31272,31291,31292,31294,31295,31296,31297,31298,31300,31301,31302,31303,31304,31334,31346,31348,31349,31350,31351,32088,32332,32768,32795,33811,33812,34926,34927,34956,34957,35333,36208,36324,36325,36474,36475,37738,38009,38479,38488,38805,38826,39264,39265,39317,39318,39627,39628,39977,39978,44954,44955,49418,57986,58661,58673,59083,59114,59847,59848,59909,59910,60229,60230,65536,65552,72337,74698,76673,128169,130083,130084,130465,130466,131072,131084,131088,131100,132503,132504,132535,132536,132552,132555,132866,132867,132871,132874,132891,132892,133284,133287,133309,133310,133317,133318,133330,133331,133753,135875,135918,135919") && 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/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");

# --- 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.600000, 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 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:ddd9e7822a3d342149710b86ed6675862c0ca1a8"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:985b8b779007cf47c6c06a820423ad6f1a85c8fa"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:985b8b779007cf47c6c06a820423ad6f1a85c8fa")));

# ---- 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);
