getprop("ro.product.device") == "eros-p1" || abort("E3004: This package is for \"eros-p1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
assert_boot_version(0);
ui_print("Source: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260831.102119:user/test-keys");
ui_print("Target: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260905.084552:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260831.102119:user/test-keys" ||
    getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260905.084552:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260831.102119:user/test-keys or Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260905.084552:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:88876c760ae91613d6e5eb4ee32bbae579b71b44",
                      "EMMC:/dev/block/by-name/boot:33554432:3494becc4ec056a9391d6f2f22c7367e1f0dd6fd") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:88876c760ae91613d6e5eb4ee32bbae579b71b44\" or \"EMMC:/dev/block/by-name/boot:33554432:3494becc4ec056a9391d6f2f22c7367e1f0dd6fd\" has unexpected contents.");
apply_patch_space(105684992) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "236,1,119,380,392,394,395,493,494,972,973,975,977,978,979,994,995,1132,1133,1948,1949,1951,1952,1955,1956,1963,1964,1965,1966,6223,6224,6226,6227,6508,6509,6511,6512,7065,7067,13006,13007,13140,13141,15620,15622,21522,21523,21525,21527,25593,29682,29699,29700,29703,29736,32768,32770,32853,32930,37816,37818,38433,38434,38442,38444,38450,38451,41971,41973,42018,42019,42055,42057,42079,42080,42976,42978,43235,43237,43254,43255,43460,43462,43469,43470,44070,44074,44093,44094,44148,44150,44157,44158,44163,44167,44173,44174,44267,44269,44277,44278,49001,49003,51008,51009,51043,51045,51051,51052,51314,51318,51328,53756,53769,53770,53773,53781,53817,53819,53825,53826,53900,53902,53909,53910,55596,55598,55616,55617,55736,55738,55746,55747,57052,57054,57083,57084,57090,57092,57101,57102,59392,59394,59440,59441,65536,65556,73801,73803,73829,73830,82429,82431,83590,83591,83607,83609,83617,83618,84517,84519,84540,84541,92037,92038,98304,98306,98389,98409,109217,109219,109358,109361,112745,112748,114875,114878,118617,118618,118880,118881,119759,119760,120066,120067,121912,121913,123587,123589,123590,123591,123649,123650,123669,123670,123702,123703,123787,123788,123826,123827,123832,123833,123834,123835,123913,123914,124055,124056,124058,124060,131072,131100,134172,134173,142112,142113,146693,146694,163840,163842,163925,163947,167946,167948,168180,229378,229461,294914,294997,327695,327700,342407,343452,348897,348979,348980") == "094a2e72d5b4c8ce9cae50579663ac5aca81493d" || 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"), "236,1,119,380,392,394,395,493,494,972,973,975,977,978,979,994,995,1132,1133,1948,1949,1951,1952,1955,1956,1963,1964,1965,1966,6223,6224,6226,6227,6508,6509,6511,6512,7065,7067,13006,13007,13140,13141,15620,15622,21522,21523,21525,21527,25593,29682,29699,29700,29703,29736,32768,32770,32853,32930,37816,37818,38433,38434,38442,38444,38450,38451,41971,41973,42018,42019,42055,42057,42079,42080,42976,42978,43235,43237,43254,43255,43460,43462,43469,43470,44070,44074,44093,44094,44148,44150,44157,44158,44163,44167,44173,44174,44267,44269,44277,44278,49001,49003,51008,51009,51043,51045,51051,51052,51314,51318,51328,53756,53769,53770,53773,53781,53817,53819,53825,53826,53900,53902,53909,53910,55596,55598,55616,55617,55736,55738,55746,55747,57052,57054,57083,57084,57090,57092,57101,57102,59392,59394,59440,59441,65536,65556,73801,73803,73829,73830,82429,82431,83590,83591,83607,83609,83617,83618,84517,84519,84540,84541,92037,92038,98304,98306,98389,98409,109217,109219,109358,109361,112745,112748,114875,114878,118617,118618,118880,118881,119759,119760,120066,120067,121912,121913,123587,123589,123590,123591,123649,123650,123669,123670,123702,123703,123787,123788,123826,123827,123832,123833,123834,123835,123913,123914,124055,124056,124058,124060,131072,131100,134172,134173,142112,142113,146693,146694,163840,163842,163925,163947,167946,167948,168180,229378,229461,294914,294997,327695,327700,342407,343452,348897,348979,348980") && 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"), "42,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2651,2652,5982,5983,6058,6059,15404,15417,32768,32770,32779,32827,38980,38984,38992,38993,39116,39739,39764,39765") == "92721906d31feeff1ccb44ef65d119a6a8c149f3" || 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"), "42,1,45,645,646,1751,1752,1753,1754,1777,1778,1793,1794,1799,1800,1804,1805,1931,1932,2099,2100,2411,2412,2651,2652,5982,5983,6058,6059,15404,15417,32768,32770,32779,32827,38980,38984,38992,38993,39116,39739,39764,39765") && 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"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") == "21f672ddea0fca23542adc99b0856d3884790bfd" || 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"), "58,1,2,8,26,513,515,531,532,1794,1798,1821,1822,3237,3241,3258,3259,3264,3265,3269,3272,17186,17188,17190,17191,17195,17197,17202,17203,17419,17420,17424,17426,17431,17433,17439,17440,17446,17448,17454,17455,17952,17954,17970,17971,19566,19568,19586,19587,24447,24449,24492,24493,24526,24528,24608,25003,25022,25023") && 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 ----


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

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

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/by-name/boot:33554432:88876c760ae91613d6e5eb4ee32bbae579b71b44",
                "EMMC:/dev/block/by-name/boot:33554432:3494becc4ec056a9391d6f2f22c7367e1f0dd6fd",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:3494becc4ec056a9391d6f2f22c7367e1f0dd6fd");
ui_print("Updating boot-resource.fex into bootloader partition...");
package_extract_file("boot-resource.fex","/dev/block/by-name/bootloader");
ui_print("Updating env.fex into env partition...");
package_extract_file("env.fex","/dev/block/by-name/env");
ui_print("Updating vbmeta.img into vbmeta partition...");
package_extract_file("vbmeta.img","/dev/block/by-name/vbmeta");
ui_print("Updating vbmeta_system.img into vbmeta_system partition...");
package_extract_file("vbmeta_system.img","/dev/block/by-name/vbmeta_system");
ui_print("Updating vbmeta_vendor.img into vbmeta_vendor partition...");
package_extract_file("vbmeta_vendor.img","/dev/block/by-name/vbmeta_vendor");
ui_print("Updating boot...");
burnboot();
set_progress(1.000000);
