getprop("ro.product.device") == "angelican" || abort("E3004: This package is for \"angelican\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.14.0.QCSMIXM:user/release-keys");
ui_print("Target: Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.16.0.QCSMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.14.0.QCSMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.16.0.QCSMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.14.0.QCSMIXM:user/release-keys or Redmi/angelican_global/angelican:10/QP1A.190711.020/V12.0.16.0.QCSMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:7d8fc18032399992f5e317c827fc61ed8edecc1e",
                      "EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:81358a408a5380579ffd0513d6269ff93636a1bd") ||
    abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:7d8fc18032399992f5e317c827fc61ed8edecc1e\" or \"EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:81358a408a5380579ffd0513d6269ff93636a1bd\" has unexpected contents.");
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "392,1,163,190,197,382,386,402,403,22576,22578,22594,22598,22602,22603,22765,22769,22777,22778,22790,22794,22798,22799,23291,23295,23311,23312,23325,23329,23333,23334,24468,24474,24502,24503,24510,24514,24518,24519,24637,24643,24648,24649,26821,26825,26854,26855,26890,26892,28524,28528,28533,28534,28566,28570,28574,28575,28675,28679,28683,31564,32768,32770,32897,32917,36722,36726,36763,36764,36779,36783,36787,36788,36790,36791,36944,36948,36954,36955,41049,41053,41100,41101,41472,41476,41484,41485,41616,41620,41626,41627,41752,41756,41763,41764,46379,46383,46477,46478,46484,46488,46492,46493,46535,46539,46543,46544,46603,46604,47164,47168,47172,47173,48935,48939,48982,48983,48987,48991,48995,48996,49018,49022,49046,49047,50740,50744,50767,50768,54702,54706,54741,54742,56802,56806,56832,56833,56863,56864,58450,58454,60616,60617,60651,60655,60675,60676,61126,61130,61533,61534,62216,62220,62236,62237,62411,62415,62422,62423,64415,64419,64460,64461,64744,64748,64758,64759,65536,65556,65962,65963,72284,72288,72371,72372,73299,73303,73328,73329,73965,73969,73990,73991,77456,77460,77495,77496,79890,79894,79944,79945,79991,79995,79999,80000,80039,80045,80050,80051,83935,83939,83977,83978,89738,89742,89818,89819,90177,90181,90195,90196,90375,90376,91488,91492,91518,91519,92565,92569,92590,92591,98304,98306,98433,98453,113441,113442,114715,114719,114949,114950,115535,115541,115559,115560,122185,122189,122271,122272,124567,124571,124612,124613,124875,124879,124887,124888,124892,124896,124900,124901,124905,124909,124913,124914,124966,124970,124975,124976,124980,124986,124991,124992,128822,128826,128895,128896,128981,128985,128991,128992,128996,129000,129004,129005,129051,129055,129059,129060,130884,130890,130931,130932,131072,131092,131329,131335,131345,131346,131419,131423,131427,131428,131468,131469,131507,131511,131515,131516,134924,134928,134976,134977,135255,135259,135268,135269,135340,135344,135349,135350,136565,136569,136596,136597,147346,147350,147533,147534,147544,147548,147552,147553,148176,148180,148196,148197,149672,149676,149692,149693,152333,152337,152363,152364,153310,153314,153338,153339,153345,153349,153353,153354,154248,154252,154279,154280,154287,154291,154295,154296,154301,154305,154312,154313,154338,154342,154346,154347,159674,159678,159753,159754,160039,160043,160053,160054,163310,163314,163361,163362,163429,163433,163438,163439,163840,163842,163969,163989,165073,165077,165105,229378,229505,294914,295041,491538,491540,519775,521351,529613,529729,529730") == "647f9fdfd6ee9a3e2f83df4894925bc784de5c7e" || 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"), "392,1,163,190,197,382,386,402,403,22576,22578,22594,22598,22602,22603,22765,22769,22777,22778,22790,22794,22798,22799,23291,23295,23311,23312,23325,23329,23333,23334,24468,24474,24502,24503,24510,24514,24518,24519,24637,24643,24648,24649,26821,26825,26854,26855,26890,26892,28524,28528,28533,28534,28566,28570,28574,28575,28675,28679,28683,31564,32768,32770,32897,32917,36722,36726,36763,36764,36779,36783,36787,36788,36790,36791,36944,36948,36954,36955,41049,41053,41100,41101,41472,41476,41484,41485,41616,41620,41626,41627,41752,41756,41763,41764,46379,46383,46477,46478,46484,46488,46492,46493,46535,46539,46543,46544,46603,46604,47164,47168,47172,47173,48935,48939,48982,48983,48987,48991,48995,48996,49018,49022,49046,49047,50740,50744,50767,50768,54702,54706,54741,54742,56802,56806,56832,56833,56863,56864,58450,58454,60616,60617,60651,60655,60675,60676,61126,61130,61533,61534,62216,62220,62236,62237,62411,62415,62422,62423,64415,64419,64460,64461,64744,64748,64758,64759,65536,65556,65962,65963,72284,72288,72371,72372,73299,73303,73328,73329,73965,73969,73990,73991,77456,77460,77495,77496,79890,79894,79944,79945,79991,79995,79999,80000,80039,80045,80050,80051,83935,83939,83977,83978,89738,89742,89818,89819,90177,90181,90195,90196,90375,90376,91488,91492,91518,91519,92565,92569,92590,92591,98304,98306,98433,98453,113441,113442,114715,114719,114949,114950,115535,115541,115559,115560,122185,122189,122271,122272,124567,124571,124612,124613,124875,124879,124887,124888,124892,124896,124900,124901,124905,124909,124913,124914,124966,124970,124975,124976,124980,124986,124991,124992,128822,128826,128895,128896,128981,128985,128991,128992,128996,129000,129004,129005,129051,129055,129059,129060,130884,130890,130931,130932,131072,131092,131329,131335,131345,131346,131419,131423,131427,131428,131468,131469,131507,131511,131515,131516,134924,134928,134976,134977,135255,135259,135268,135269,135340,135344,135349,135350,136565,136569,136596,136597,147346,147350,147533,147534,147544,147548,147552,147553,148176,148180,148196,148197,149672,149676,149692,149693,152333,152337,152363,152364,153310,153314,153338,153339,153345,153349,153353,153354,154248,154252,154279,154280,154287,154291,154295,154296,154301,154305,154312,154313,154338,154342,154346,154347,159674,159678,159753,159754,160039,160043,160053,160054,163310,163314,163361,163362,163429,163433,163438,163439,163840,163842,163969,163989,165073,165077,165105,229378,229505,294914,295041,491538,491540,519775,521351,529613,529729,529730") && 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"), "34,1,67,803,809,827,828,831,832,835,836,848,852,856,857,1300,1342,1548,1549,3475,3476,3707,3875,3921,32770,32796,98306,98332,98361,98363,106849,107183,108884,108921,108922") == "113818e8842c4a3be4f77df12eee4b87abf4bfe7" || 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"), "34,1,67,803,809,827,828,831,832,835,836,848,852,856,857,1300,1342,1548,1549,3475,3476,3707,3875,3921,32770,32796,98306,98332,98361,98363,106849,107183,108884,108921,108922") && 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"), "218,1,84,5977,5978,11710,11714,14653,14654,16153,16155,16193,16197,16227,16228,27866,27867,30293,30294,32768,32770,32837,32844,33239,33240,33604,33608,34115,34116,34128,34132,34136,34137,35977,35981,37418,37419,45284,45285,59202,59203,65536,65543,78753,78754,92486,92487,92493,92494,98304,98306,98373,98380,107834,107835,107915,107919,107925,107926,109940,109941,122124,122125,123515,123516,129814,129816,129825,129826,129827,129828,129844,129845,129846,129847,129853,129854,129893,129897,129901,129903,129908,129909,129921,129924,130373,130374,130745,130746,131072,131079,132238,132239,132329,132331,132334,132335,132338,132339,132342,132343,132346,132347,132350,132351,132354,132355,132358,132359,132365,132366,132372,132373,132379,132380,132403,132404,132424,132425,132431,132432,132452,132453,132469,132470,132476,132477,132494,132495,132501,132502,132521,132522,132537,132538,132543,132544,132562,132563,132569,132570,132590,132591,132936,132938,137741,137743,161853,161855,162281,162283,163840,163842,163909,163944,173293,173294,173465,173469,173476,173477,173517,173521,173526,173527,173663,173667,173675,173676,175064,175068,175105,175106,176155,176157,176238,176240,179357,179359,194657,194658,196608,196625,210042,210043,210531,210535,210549,210550,211888,211889,213287,213291,213307,213308,215433,215437,215463,215464,229376,229378,229445,229449,256463,256464,261860,261861,261892,261896,261900,261901,262144,262145,265618,265621,276235,280615,280684,280685") == "46cead8c91722bdbc124598c480171b46be56cbd" || 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"), "218,1,84,5977,5978,11710,11714,14653,14654,16153,16155,16193,16197,16227,16228,27866,27867,30293,30294,32768,32770,32837,32844,33239,33240,33604,33608,34115,34116,34128,34132,34136,34137,35977,35981,37418,37419,45284,45285,59202,59203,65536,65543,78753,78754,92486,92487,92493,92494,98304,98306,98373,98380,107834,107835,107915,107919,107925,107926,109940,109941,122124,122125,123515,123516,129814,129816,129825,129826,129827,129828,129844,129845,129846,129847,129853,129854,129893,129897,129901,129903,129908,129909,129921,129924,130373,130374,130745,130746,131072,131079,132238,132239,132329,132331,132334,132335,132338,132339,132342,132343,132346,132347,132350,132351,132354,132355,132358,132359,132365,132366,132372,132373,132379,132380,132403,132404,132424,132425,132431,132432,132452,132453,132469,132470,132476,132477,132494,132495,132501,132502,132521,132522,132537,132538,132543,132544,132562,132563,132569,132570,132590,132591,132936,132938,137741,137743,161853,161855,162281,162283,163840,163842,163909,163944,173293,173294,173465,173469,173476,173477,173517,173521,173526,173527,173663,173667,173675,173676,175064,175068,175105,175106,176155,176157,176238,176240,179357,179359,194657,194658,196608,196625,210042,210043,210531,210535,210549,210550,211888,211889,213287,213291,213307,213308,215433,215437,215463,215464,229376,229378,229445,229449,256463,256464,261860,261861,261892,261896,261900,261901,262144,262145,265618,265621,276235,280615,280684,280685") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:7d8fc18032399992f5e317c827fc61ed8edecc1e",
                "EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:81358a408a5380579ffd0513d6269ff93636a1bd",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:81358a408a5380579ffd0513d6269ff93636a1bd");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition product

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

ui_print("Patching vendor image after verification.");
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 system

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

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("dtbo.img", "/dev/block/platform/bootdevice/by-name/dtbo");
package_extract_file("md1img.img", "/dev/block/platform/bootdevice/by-name/md1img");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot1"));
else 
 assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
        package_extract_file("preloader_emmc.img", "/dev/block/mmcblk0boot1"));
endif;
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("tee1", "tee2");
switch_active("lk", "lk2");
switch_active("scp1", "scp2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot0"));
else 
 assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
        package_extract_file("preloader_emmc.img", "/dev/block/mmcblk0boot0"));
endif;
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("tee2", "tee1");
switch_active("lk2", "lk");
switch_active("scp2", "scp1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta_vendor.img", "/dev/block/platform/bootdevice/by-name/vbmeta_vendor");
package_extract_file("vbmeta_system.img", "/dev/block/platform/bootdevice/by-name/vbmeta_system");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
post_ota_action();
