getprop("ro.product.device") == "raphael" || abort("E3004: This package is for \"raphael\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.4.0.QFKCNXM:user/release-keys");
ui_print("Target: Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.4.0.QFKCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.4.0.QFKCNXM:user/release-keys or Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKCNXM: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:3a8b87ceada9540f75107179e18f83cfb8f7af5f",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:7713dbc49d38ba9c18629702a644cc6d3a9316db") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:3a8b87ceada9540f75107179e18f83cfb8f7af5f\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:7713dbc49d38ba9c18629702a644cc6d3a9316db\" 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("/dev/block/bootdevice/by-name/system", "494,1,623,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3696,3697,3699,3700,3704,3705,3713,3714,3715,3716,9073,9074,9076,9077,9481,9482,9484,9485,10481,10483,16422,16423,16556,16557,19326,19328,25594,25596,32768,32770,32990,32991,34762,34763,34765,34767,34826,34827,34960,34962,35015,35016,35025,35026,35474,35477,35483,35484,35489,35490,35534,35537,37748,37749,37760,37761,37888,37889,37892,37893,37910,39208,40048,40049,40057,40058,40063,40064,40066,40067,42531,42532,42574,42577,42663,42664,42875,42876,44630,44631,44913,44914,45162,45163,45167,45168,45190,45191,46199,46200,46561,46562,46598,46599,52218,52220,57590,57591,57729,57730,57736,57737,57750,57751,58373,58374,58382,58383,59273,59274,59536,59537,59711,59712,61327,61328,61813,61814,65536,65537,68042,68043,70589,70590,76074,76075,77841,77842,77914,77915,77934,77937,80113,80114,82737,82738,82878,82879,83026,83027,85797,85798,85810,85811,86462,86463,98304,98306,98526,98527,103288,103289,103450,103453,104463,104466,106114,106115,106141,106142,106191,106192,106195,106198,108245,108246,108304,108305,108326,108327,109054,109057,109305,109308,109474,109475,109514,109515,110815,110816,110886,110887,110933,110934,111260,111261,111415,111416,119584,119585,119590,119591,119630,119631,119660,119661,122269,122272,125741,125742,125747,125748,126144,126145,126845,126846,126852,126853,129778,129779,131072,131073,131829,131830,145956,145958,151134,151135,151519,151521,152046,152047,152495,152496,152500,152501,152513,152514,152518,152519,152530,152531,152906,152907,152930,152931,154215,154216,154218,154219,154357,154358,154439,154442,154455,154458,155028,155029,155925,155928,159837,159838,160104,160107,162069,162070,162291,162292,163840,163842,164062,164063,164569,164570,165650,165651,165663,165664,166003,166004,167589,167598,167914,167915,168348,168349,170085,170086,172613,172618,177408,177409,185611,185612,185976,185977,186296,186297,190315,190316,191748,191749,196608,196609,197622,197623,199588,199589,200384,200385,205199,205200,209838,209839,216400,216401,217193,217194,222288,222289,222593,222594,222606,222607,222617,222620,222621,222622,222623,222624,222626,222627,222628,222629,222682,222683,222771,222774,222776,222777,222783,222784,222807,222808,222876,222877,222880,222885,222886,222887,222888,222889,222890,222891,223685,223686,223692,223693,224246,224248,224801,224803,224804,224805,224806,224807,224808,224809,224810,224811,224812,224813,224814,224815,224816,224817,224818,224821,226281,226283,226364,226365,226367,226368,226371,226373,226631,226632,226639,226641,227130,227132,227241,227242,227272,227273,227284,227285,227551,227552,227665,227666,227682,227684,229000,229001,229376,229378,229598,229599,243422,243423,251293,251294,253358,253359,253636,253725,254206,254284,254911,262145,262650,271348,271355,276181,276243,276244,276748,276838,277583,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,837277,884736,884738,884958,884959,903007,917316,917503,917504") == "d7ef7ae48b999cb4f4ddae3a6865a5361daf25ca" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "494,1,623,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3696,3697,3699,3700,3704,3705,3713,3714,3715,3716,9073,9074,9076,9077,9481,9482,9484,9485,10481,10483,16422,16423,16556,16557,19326,19328,25594,25596,32768,32770,32990,32991,34762,34763,34765,34767,34826,34827,34960,34962,35015,35016,35025,35026,35474,35477,35483,35484,35489,35490,35534,35537,37748,37749,37760,37761,37888,37889,37892,37893,37910,39208,40048,40049,40057,40058,40063,40064,40066,40067,42531,42532,42574,42577,42663,42664,42875,42876,44630,44631,44913,44914,45162,45163,45167,45168,45190,45191,46199,46200,46561,46562,46598,46599,52218,52220,57590,57591,57729,57730,57736,57737,57750,57751,58373,58374,58382,58383,59273,59274,59536,59537,59711,59712,61327,61328,61813,61814,65536,65537,68042,68043,70589,70590,76074,76075,77841,77842,77914,77915,77934,77937,80113,80114,82737,82738,82878,82879,83026,83027,85797,85798,85810,85811,86462,86463,98304,98306,98526,98527,103288,103289,103450,103453,104463,104466,106114,106115,106141,106142,106191,106192,106195,106198,108245,108246,108304,108305,108326,108327,109054,109057,109305,109308,109474,109475,109514,109515,110815,110816,110886,110887,110933,110934,111260,111261,111415,111416,119584,119585,119590,119591,119630,119631,119660,119661,122269,122272,125741,125742,125747,125748,126144,126145,126845,126846,126852,126853,129778,129779,131072,131073,131829,131830,145956,145958,151134,151135,151519,151521,152046,152047,152495,152496,152500,152501,152513,152514,152518,152519,152530,152531,152906,152907,152930,152931,154215,154216,154218,154219,154357,154358,154439,154442,154455,154458,155028,155029,155925,155928,159837,159838,160104,160107,162069,162070,162291,162292,163840,163842,164062,164063,164569,164570,165650,165651,165663,165664,166003,166004,167589,167598,167914,167915,168348,168349,170085,170086,172613,172618,177408,177409,185611,185612,185976,185977,186296,186297,190315,190316,191748,191749,196608,196609,197622,197623,199588,199589,200384,200385,205199,205200,209838,209839,216400,216401,217193,217194,222288,222289,222593,222594,222606,222607,222617,222620,222621,222622,222623,222624,222626,222627,222628,222629,222682,222683,222771,222774,222776,222777,222783,222784,222807,222808,222876,222877,222880,222885,222886,222887,222888,222889,222890,222891,223685,223686,223692,223693,224246,224248,224801,224803,224804,224805,224806,224807,224808,224809,224810,224811,224812,224813,224814,224815,224816,224817,224818,224821,226281,226283,226364,226365,226367,226368,226371,226373,226631,226632,226639,226641,227130,227132,227241,227242,227272,227273,227284,227285,227551,227552,227665,227666,227682,227684,229000,229001,229376,229378,229598,229599,243422,243423,251293,251294,253358,253359,253636,253725,254206,254284,254911,262145,262650,271348,271355,276181,276243,276244,276748,276838,277583,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,837277,884736,884738,884958,884959,903007,917316,917503,917504") && block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor", "170,1,272,602,610,620,621,702,703,767,768,770,781,783,784,792,793,801,802,1348,1653,1719,1720,12196,12197,12314,12315,12446,12498,13107,13108,13740,13741,14735,14740,16993,16994,18643,18644,19915,19916,32768,32770,32864,32865,41728,41730,46940,46941,65536,65537,68555,68556,70041,70042,77171,77172,80850,80852,80886,80887,81264,81265,81627,81629,82112,82113,82171,82172,98304,98306,98400,98401,102751,102754,102772,102773,102818,102819,102837,102838,102840,102841,102889,102890,102937,102938,103148,103149,103174,103175,103209,103210,103326,103327,103409,103410,103559,103560,103573,103574,110189,110190,112828,112830,118966,118967,118970,118971,119539,119541,125910,125911,125913,125914,128954,128955,128956,128957,128978,128979,129404,129405,129461,129462,129823,129825,129826,129832,130128,130130,130138,130151,130152,130154,130164,130179,130188,130189,130191,130195,130343,130365,130624,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,344794,360448,360449,386991,393125,393215,393216") == "c690ced3eb93158cc8b7863875ac9d023ee5a8f1" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "170,1,272,602,610,620,621,702,703,767,768,770,781,783,784,792,793,801,802,1348,1653,1719,1720,12196,12197,12314,12315,12446,12498,13107,13108,13740,13741,14735,14740,16993,16994,18643,18644,19915,19916,32768,32770,32864,32865,41728,41730,46940,46941,65536,65537,68555,68556,70041,70042,77171,77172,80850,80852,80886,80887,81264,81265,81627,81629,82112,82113,82171,82172,98304,98306,98400,98401,102751,102754,102772,102773,102818,102819,102837,102838,102840,102841,102889,102890,102937,102938,103148,103149,103174,103175,103209,103210,103326,103327,103409,103410,103559,103560,103573,103574,110189,110190,112828,112830,118966,118967,118970,118971,119539,119541,125910,125911,125913,125914,128954,128955,128956,128957,128978,128979,129404,129405,129461,129462,129823,129825,129826,129832,130128,130130,130138,130151,130152,130154,130164,130179,130188,130189,130191,130195,130343,130365,130624,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,344794,360448,360449,386991,393125,393215,393216") && block_image_verify("/dev/block/bootdevice/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;

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

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

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/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.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
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");
