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.QFKMIXM:user/release-keys");
ui_print("Target: Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.4.0.QFKMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.4.0.QFKMIXM:user/release-keys or Xiaomi/raphael/raphael:10/QKQ1.190825.002/V12.0.5.0.QFKMIXM: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:1b1f5c26c6548af9aa1bf0c6ece4d993ce0d6074",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:1b5c72b3d5d7dccb591fdd81dd00d7bc6f2a8a0e") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:1b1f5c26c6548af9aa1bf0c6ece4d993ce0d6074\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:1b5c72b3d5d7dccb591fdd81dd00d7bc6f2a8a0e\" 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", "458,1,620,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,5819,5936,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,35028,35676,35682,35683,35688,35689,35808,35811,37425,37426,39637,39638,39669,39670,39909,39910,40009,41420,43733,43734,43747,43748,43753,43754,43756,43757,46878,46879,47249,47250,47304,47307,47394,47395,47478,47479,50164,50165,50168,50169,50417,50418,50878,50879,51785,51786,51790,51791,51813,51814,53034,53035,53449,53450,53486,53487,53539,53540,53727,53728,55030,55031,55169,55170,55202,55203,55653,55654,56337,56338,56346,56347,57700,57701,57877,57878,59060,59061,62940,62941,63426,63427,65536,65537,69655,69656,72399,72400,72472,72473,72492,72495,75809,75810,78433,78434,79224,79225,79373,79374,79554,79555,80214,80215,80924,80925,80929,80930,94972,94973,95183,95186,95196,95197,98304,98306,98526,98527,101522,101523,103240,103241,103292,103293,103296,103299,105156,105157,105241,105242,105244,105245,105266,105267,106213,106216,106616,106619,106785,106786,106825,106826,108826,108827,108877,108878,109228,109229,109234,109235,109308,109309,110177,110178,114686,114687,114692,114693,115090,115091,116576,116577,118353,118354,118802,118803,118807,118808,118820,118821,118825,118826,118837,118838,118861,118862,120825,120826,120828,120829,120983,120984,121354,121357,122275,122276,122846,122847,127095,127098,129397,129398,129747,129748,131072,131073,131579,131580,132884,132885,132897,132898,133237,133238,135148,135149,135582,135583,137319,137320,138712,138764,139847,139851,140163,140164,140176,140177,140187,140190,140191,140192,140193,140194,140196,140197,140198,140199,140246,140247,140253,140254,140342,140343,140347,140348,140353,140355,140378,140379,140448,140449,140452,140457,140458,140459,140460,140461,140462,140463,141393,141394,141401,141402,141955,141957,142510,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142526,142527,142528,142531,143388,143390,143391,143392,143475,143476,143478,143479,143482,143484,143742,143743,143750,143752,144241,144243,144352,144353,144383,144384,144395,144396,144662,144663,144776,144777,144793,144795,144797,144798,153732,153733,161655,161656,163604,163605,163840,163842,164062,164063,164611,164700,165886,166139,167461,181515,181740,181781,181788,183915,186512,186614,186676,186677,188016,188329,189898,196609,197114,229378,229598,229599,230104,262145,262650,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,851969,852474,861362,884736,884738,884958,884959,903007,917316,917503,917504") == "ad5b695b0ebea95ac4f4856f009a2a19dd27d453" || 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", "458,1,620,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,5819,5936,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,35028,35676,35682,35683,35688,35689,35808,35811,37425,37426,39637,39638,39669,39670,39909,39910,40009,41420,43733,43734,43747,43748,43753,43754,43756,43757,46878,46879,47249,47250,47304,47307,47394,47395,47478,47479,50164,50165,50168,50169,50417,50418,50878,50879,51785,51786,51790,51791,51813,51814,53034,53035,53449,53450,53486,53487,53539,53540,53727,53728,55030,55031,55169,55170,55202,55203,55653,55654,56337,56338,56346,56347,57700,57701,57877,57878,59060,59061,62940,62941,63426,63427,65536,65537,69655,69656,72399,72400,72472,72473,72492,72495,75809,75810,78433,78434,79224,79225,79373,79374,79554,79555,80214,80215,80924,80925,80929,80930,94972,94973,95183,95186,95196,95197,98304,98306,98526,98527,101522,101523,103240,103241,103292,103293,103296,103299,105156,105157,105241,105242,105244,105245,105266,105267,106213,106216,106616,106619,106785,106786,106825,106826,108826,108827,108877,108878,109228,109229,109234,109235,109308,109309,110177,110178,114686,114687,114692,114693,115090,115091,116576,116577,118353,118354,118802,118803,118807,118808,118820,118821,118825,118826,118837,118838,118861,118862,120825,120826,120828,120829,120983,120984,121354,121357,122275,122276,122846,122847,127095,127098,129397,129398,129747,129748,131072,131073,131579,131580,132884,132885,132897,132898,133237,133238,135148,135149,135582,135583,137319,137320,138712,138764,139847,139851,140163,140164,140176,140177,140187,140190,140191,140192,140193,140194,140196,140197,140198,140199,140246,140247,140253,140254,140342,140343,140347,140348,140353,140355,140378,140379,140448,140449,140452,140457,140458,140459,140460,140461,140462,140463,141393,141394,141401,141402,141955,141957,142510,142512,142513,142514,142515,142516,142517,142518,142519,142520,142521,142522,142523,142524,142526,142527,142528,142531,143388,143390,143391,143392,143475,143476,143478,143479,143482,143484,143742,143743,143750,143752,144241,144243,144352,144353,144383,144384,144395,144396,144662,144663,144776,144777,144793,144795,144797,144798,153732,153733,161655,161656,163604,163605,163840,163842,164062,164063,164611,164700,165886,166139,167461,181515,181740,181781,181788,183915,186512,186614,186676,186677,188016,188329,189898,196609,197114,229378,229598,229599,230104,262145,262650,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,851969,852474,861362,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", "294,1,272,602,610,620,621,702,703,767,768,770,781,783,784,792,793,801,802,1719,1720,2855,3603,12196,12197,12314,12315,13107,13108,13740,13741,14729,14734,16987,16988,18637,18638,19909,19910,32768,32770,32864,32865,41722,41724,46569,46570,50396,50397,65536,65537,66043,66044,69751,69752,74461,74462,79455,79456,93515,93516,98304,98306,98400,98401,103395,103396,104418,104420,104454,104455,104832,104833,105195,105197,105680,105681,105739,105740,125717,125720,125738,125739,125784,125785,125803,125804,125806,125807,125896,125897,126107,126108,126133,126134,126168,126169,126286,126287,126366,126367,126516,126517,126530,126531,131072,131073,133652,133653,136291,136293,142429,142430,142433,142434,143002,143004,149373,149374,149376,149377,152417,152418,152419,152420,152441,152442,152867,152868,152924,152925,153286,153288,153289,153295,153591,153593,153601,153614,153615,153617,153627,153642,153651,153652,153654,153658,153806,153807,154150,154151,154489,154490,158694,158695,159153,159154,161969,161970,163840,163842,163936,163937,166762,166763,167221,167222,169812,169813,170261,170262,173050,173051,174028,174029,174865,176423,185637,185638,196608,196609,204853,204854,208661,208748,212408,212409,214166,214167,214189,214190,214874,217870,217873,221744,221761,221763,223492,223493,225933,225935,227789,227790,227882,227883,228075,228076,228410,228411,228749,228750,229376,229378,229472,229473,233556,233557,234015,234016,236831,236832,241022,241023,241481,241482,244072,244073,244521,244522,246387,246388,247174,247175,248178,248179,249207,249208,249521,249522,250519,251954,262144,262145,262743,262744,294912,294914,295008,295009,296245,296246,312153,312154,319733,319734,327680,327681,333239,333240,336573,336574,345132,345133,350876,350877,354802,354803,354827,354828,356147,356148,360448,360449,362524,362526,365620,365624,365626,365627,365648,365649,368139,368140,368148,368150,368174,368175,368200,368231,368237,368248,386991,393125,393215,393216") == "5530a249e5cd870c217c32e94eaed5df2e8a3155" || 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", "294,1,272,602,610,620,621,702,703,767,768,770,781,783,784,792,793,801,802,1719,1720,2855,3603,12196,12197,12314,12315,13107,13108,13740,13741,14729,14734,16987,16988,18637,18638,19909,19910,32768,32770,32864,32865,41722,41724,46569,46570,50396,50397,65536,65537,66043,66044,69751,69752,74461,74462,79455,79456,93515,93516,98304,98306,98400,98401,103395,103396,104418,104420,104454,104455,104832,104833,105195,105197,105680,105681,105739,105740,125717,125720,125738,125739,125784,125785,125803,125804,125806,125807,125896,125897,126107,126108,126133,126134,126168,126169,126286,126287,126366,126367,126516,126517,126530,126531,131072,131073,133652,133653,136291,136293,142429,142430,142433,142434,143002,143004,149373,149374,149376,149377,152417,152418,152419,152420,152441,152442,152867,152868,152924,152925,153286,153288,153289,153295,153591,153593,153601,153614,153615,153617,153627,153642,153651,153652,153654,153658,153806,153807,154150,154151,154489,154490,158694,158695,159153,159154,161969,161970,163840,163842,163936,163937,166762,166763,167221,167222,169812,169813,170261,170262,173050,173051,174028,174029,174865,176423,185637,185638,196608,196609,204853,204854,208661,208748,212408,212409,214166,214167,214189,214190,214874,217870,217873,221744,221761,221763,223492,223493,225933,225935,227789,227790,227882,227883,228075,228076,228410,228411,228749,228750,229376,229378,229472,229473,233556,233557,234015,234016,236831,236832,241022,241023,241481,241482,244072,244073,244521,244522,246387,246388,247174,247175,248178,248179,249207,249208,249521,249522,250519,251954,262144,262145,262743,262744,294912,294914,295008,295009,296245,296246,312153,312154,319733,319734,327680,327681,333239,333240,336573,336574,345132,345133,350876,350877,354802,354803,354827,354828,356147,356148,360448,360449,362524,362526,365620,365624,365626,365627,365648,365649,368139,368140,368148,368150,368174,368175,368200,368231,368237,368248,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:1b1f5c26c6548af9aa1bf0c6ece4d993ce0d6074",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:1b5c72b3d5d7dccb591fdd81dd00d7bc6f2a8a0e",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:1b5c72b3d5d7dccb591fdd81dd00d7bc6f2a8a0e");

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/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/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
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/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/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/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");
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");
