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:9/PKQ1.181121.001/V10.3.10.0.PFKCNXM:user/release-keys");
ui_print("Target: Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.11.0.PFKCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.10.0.PFKCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.11.0.PFKCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.10.0.PFKCNXM:user/release-keys or Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.11.0.PFKCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:134217728:9dd8283e656137a5a0c23cfec5935ae081211ed7:134217728:f811b6009e6aa9b8be4f4777d2443b359703f35b") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:9dd8283e656137a5a0c23cfec5935ae081211ed7:134217728:f811b6009e6aa9b8be4f4777d2443b359703f35b\" 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", "436,1,239,254,613,8318,8324,8328,8330,8333,8336,8339,8342,9100,9101,9107,9109,9646,9647,9656,9658,9662,9663,9667,9672,9673,9677,12164,14064,21656,22428,24882,24883,32768,32770,39167,39168,45679,45680,48042,48043,56011,56012,64885,64886,66121,66122,66481,66482,77363,77364,81328,81329,85619,85621,88546,88547,90570,90571,92155,92156,98304,98306,105013,105014,111997,111998,121666,121667,129388,129389,136145,136147,136188,136189,136565,136567,136698,136699,136708,136709,136728,136729,142607,142608,142611,142612,142648,142650,145475,145476,146409,146410,147648,147818,149808,163842,164062,229378,229598,294914,295134,488080,488087,488088,488153,488156,498197,498200,499389,499392,499406,499409,500790,500791,505399,505400,507293,507295,509490,509493,510193,510196,510524,510527,510589,510592,510616,510619,510637,510638,515721,515724,515734,515737,520879,520882,521456,521459,521468,521471,521846,521847,524288,524298,524299,524300,542963,542964,545407,545410,545477,545480,548559,548562,548802,548807,552188,552191,552199,552200,552275,552276,552282,552285,552453,552456,552610,552613,553141,553142,554478,554481,555703,555706,555770,555773,555808,555811,555826,555829,556394,556397,560602,560605,560774,560777,560942,560945,560964,560965,561600,561602,561620,561623,574597,574598,578164,578165,582108,582110,582161,582162,584042,584045,590483,590486,590496,590499,590510,590513,590525,590528,591091,591094,594306,594307,600379,600380,615212,615213,615444,615447,619182,619183,619325,619326,620254,620255,620592,620593,620873,620874,621922,621923,621926,621929,621976,621977,621990,621991,622014,622015,622060,622061,622082,622083,622102,622103,622206,622207,622210,622213,622223,622225,622233,622234,622240,622242,622282,622283,622388,622390,622408,622410,622412,622414,622420,622421,622427,622428,622432,622433,625277,625278,625279,625281,625283,625284,625285,625286,625287,625288,625289,625290,625291,625292,625293,625294,625295,625296,625297,625298,625299,625300,625302,625303,625304,625305,625306,625307,625309,625310,625311,625312,625313,625314,625316,625317,625318,625319,625320,625321,625322,625323,625325,625326,625327,625328,625329,625330,625333,625334,625336,625337,625522,625716,625720,626317,626499,626521,626795,626796,646356,646357,646361,646362,647157,647159,648832,648833,649307,650762,658571,658572,666324,666325,666599,666600,673584,673585,678141,678142,678412,678413,678682,678683,683232,683233,684984,684985,688673,688674,689588,689589,697462,697464,698726,698727,704208,704209,715312,715313,715480,715482,726660,726661,740418,740419,741670,741671,746904,746905,750033,750034,750675,750676,760409,760410,765503,765504,766785,766786,769008,769009,774762,774763,777997,777998,785165,785166,789028,789029,789435,789436,798414,798415,798759,798760,800544,800545,804563,804564,807853,807854,817877,817878,818228,818229,818657,818658,819200,819202,823420,823421,824216,824217,824628,824629,830489,830493,884736,884738,903007,917316,917503,917504") == "4ab0f3d5d0f463295f8e169fc9511982378edf19" || 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", "436,1,239,254,613,8318,8324,8328,8330,8333,8336,8339,8342,9100,9101,9107,9109,9646,9647,9656,9658,9662,9663,9667,9672,9673,9677,12164,14064,21656,22428,24882,24883,32768,32770,39167,39168,45679,45680,48042,48043,56011,56012,64885,64886,66121,66122,66481,66482,77363,77364,81328,81329,85619,85621,88546,88547,90570,90571,92155,92156,98304,98306,105013,105014,111997,111998,121666,121667,129388,129389,136145,136147,136188,136189,136565,136567,136698,136699,136708,136709,136728,136729,142607,142608,142611,142612,142648,142650,145475,145476,146409,146410,147648,147818,149808,163842,164062,229378,229598,294914,295134,488080,488087,488088,488153,488156,498197,498200,499389,499392,499406,499409,500790,500791,505399,505400,507293,507295,509490,509493,510193,510196,510524,510527,510589,510592,510616,510619,510637,510638,515721,515724,515734,515737,520879,520882,521456,521459,521468,521471,521846,521847,524288,524298,524299,524300,542963,542964,545407,545410,545477,545480,548559,548562,548802,548807,552188,552191,552199,552200,552275,552276,552282,552285,552453,552456,552610,552613,553141,553142,554478,554481,555703,555706,555770,555773,555808,555811,555826,555829,556394,556397,560602,560605,560774,560777,560942,560945,560964,560965,561600,561602,561620,561623,574597,574598,578164,578165,582108,582110,582161,582162,584042,584045,590483,590486,590496,590499,590510,590513,590525,590528,591091,591094,594306,594307,600379,600380,615212,615213,615444,615447,619182,619183,619325,619326,620254,620255,620592,620593,620873,620874,621922,621923,621926,621929,621976,621977,621990,621991,622014,622015,622060,622061,622082,622083,622102,622103,622206,622207,622210,622213,622223,622225,622233,622234,622240,622242,622282,622283,622388,622390,622408,622410,622412,622414,622420,622421,622427,622428,622432,622433,625277,625278,625279,625281,625283,625284,625285,625286,625287,625288,625289,625290,625291,625292,625293,625294,625295,625296,625297,625298,625299,625300,625302,625303,625304,625305,625306,625307,625309,625310,625311,625312,625313,625314,625316,625317,625318,625319,625320,625321,625322,625323,625325,625326,625327,625328,625329,625330,625333,625334,625336,625337,625522,625716,625720,626317,626499,626521,626795,626796,646356,646357,646361,646362,647157,647159,648832,648833,649307,650762,658571,658572,666324,666325,666599,666600,673584,673585,678141,678142,678412,678413,678682,678683,683232,683233,684984,684985,688673,688674,689588,689589,697462,697464,698726,698727,704208,704209,715312,715313,715480,715482,726660,726661,740418,740419,741670,741671,746904,746905,750033,750034,750675,750676,760409,760410,765503,765504,766785,766786,769008,769009,774762,774763,777997,777998,785165,785166,789028,789029,789435,789436,798414,798415,798759,798760,800544,800545,804563,804564,807853,807854,817877,817878,818228,818229,818657,818658,819200,819202,823420,823421,824216,824217,824628,824629,830489,830493,884736,884738,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", "202,1,109,120,271,6168,6178,6350,6352,6361,6363,6366,6377,6387,6389,6420,6424,6425,6427,6483,6484,6923,6925,6935,6936,19767,19768,32768,32770,33940,33941,36279,36280,39852,39853,44482,44483,44499,44500,51463,51464,90636,90637,95212,95213,98304,98306,108408,108409,108535,108536,108676,108677,108990,108991,109987,109988,110868,110869,113537,113538,115246,115247,115452,115453,115992,115993,120063,120064,128001,128002,128266,128267,128857,128858,130529,130559,130580,130581,133626,133627,142240,142241,142428,142429,146424,146425,146434,146435,146446,146447,146489,146490,146887,146888,146897,146898,147227,147228,147231,147232,147233,147234,148927,148929,155071,155072,155134,155135,156044,156045,156077,156078,156171,156172,156173,156174,159718,159719,159727,159728,163037,163038,163411,163412,163425,163428,163473,163474,163492,163493,163511,163512,163840,163842,224107,224110,224151,224153,224160,224161,224163,224164,224168,224199,224205,224206,224602,224604,229376,229378,237292,237293,247828,247829,248298,248299,250617,250618,253266,253267,257222,257223,257568,257569,262438,262439,294912,294914,296911,296912,300883,300884,312417,312418,312544,312545,312685,312686,313899,313900,314784,314785,317453,317454,319164,319165,319370,319371,319910,319911,323981,323982,327925,331942,331944,333368,333369,343473,386991,393125,393215,393216") == "7f323cb749e69cc6c297c2bf983ff334f6045085" || 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", "202,1,109,120,271,6168,6178,6350,6352,6361,6363,6366,6377,6387,6389,6420,6424,6425,6427,6483,6484,6923,6925,6935,6936,19767,19768,32768,32770,33940,33941,36279,36280,39852,39853,44482,44483,44499,44500,51463,51464,90636,90637,95212,95213,98304,98306,108408,108409,108535,108536,108676,108677,108990,108991,109987,109988,110868,110869,113537,113538,115246,115247,115452,115453,115992,115993,120063,120064,128001,128002,128266,128267,128857,128858,130529,130559,130580,130581,133626,133627,142240,142241,142428,142429,146424,146425,146434,146435,146446,146447,146489,146490,146887,146888,146897,146898,147227,147228,147231,147232,147233,147234,148927,148929,155071,155072,155134,155135,156044,156045,156077,156078,156171,156172,156173,156174,159718,159719,159727,159728,163037,163038,163411,163412,163425,163428,163473,163474,163492,163493,163511,163512,163840,163842,224107,224110,224151,224153,224160,224161,224163,224164,224168,224199,224205,224206,224602,224604,229376,229378,237292,237293,247828,247829,248298,248299,250617,250618,253266,253267,257222,257223,257568,257569,262438,262439,294912,294914,296911,296912,300883,300884,312417,312418,312544,312545,312685,312686,313899,313900,314784,314785,317453,317454,319164,319165,319370,319371,319910,319911,323981,323982,327925,331942,331944,333368,333369,343473,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);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:134217728:9dd8283e656137a5a0c23cfec5935ae081211ed7:134217728:f811b6009e6aa9b8be4f4777d2443b359703f35b",
            "-", f811b6009e6aa9b8be4f4777d2443b359703f35b, 134217728,
            9dd8283e656137a5a0c23cfec5935ae081211ed7, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");

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

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
show_progress(0.100000, 2);
