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.20260327.165337:user/test-keys");
ui_print("Target: Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260723.163428:user/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260327.165337:user/test-keys" ||
    getprop("ro.build.fingerprint") == "Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260723.163428:user/test-keys" ||
    abort("E3001: Package expects build fingerprint of Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260327.165337:user/test-keys or Allwinner/eros_p1/eros-p1:10/QP1A.191105.004/eng.zhshs.20260723.163428:user/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check("EMMC:/dev/block/by-name/boot:33554432:57babe1e6489e51e727ac798afa0a87834d41c80",
                      "EMMC:/dev/block/by-name/boot:33554432:3c9f9deac58024736d7896d6153c8612d620890b") ||
    abort("E3005: \"EMMC:/dev/block/by-name/boot:33554432:57babe1e6489e51e727ac798afa0a87834d41c80\" or \"EMMC:/dev/block/by-name/boot:33554432:3c9f9deac58024736d7896d6153c8612d620890b\" has unexpected contents.");
apply_patch_space(33554432) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "350,1,118,379,391,393,394,492,493,971,972,974,976,977,978,993,994,1131,1132,1947,1948,1950,1951,1954,1955,1962,1963,1964,1965,6222,6223,6225,6226,6507,6508,6510,6511,7064,7066,13005,13006,13139,13140,15619,15621,21521,21522,21524,21526,32768,32770,32852,32929,37814,37816,38431,38432,38440,38442,38448,38449,41969,41971,42016,42017,42053,42055,42077,42078,42974,42976,43233,43235,43252,43253,43458,43460,43467,43468,44068,44072,44091,44092,44146,44148,44155,44156,44161,44165,44171,44172,44265,44267,44275,44276,48999,49001,51006,51007,51041,51043,51049,51050,51312,51316,51326,51327,53750,53752,53778,53779,53815,53817,53823,53824,53898,53900,53907,53908,55594,55596,55614,55615,55734,55736,55744,55745,57049,57051,57080,57081,57087,57089,57098,57099,59389,59391,59437,59438,65536,65556,73798,73800,73826,73827,84314,84316,85405,85406,85422,85424,85432,85433,86332,86334,86355,86356,92507,92508,98304,98306,98388,98408,107687,107689,107830,107833,109960,109963,113702,113703,113965,113966,114844,114845,115151,115152,116997,116998,118672,118674,118675,118676,118734,118735,118754,118755,118787,118788,118872,118873,118911,118912,118917,118918,118919,118920,118998,118999,119140,119141,119143,119145,131072,131101,137197,137198,141778,141779,163840,163842,163924,163948,169962,169963,173385,173386,180918,180919,192035,192036,196608,196630,229376,229378,229460,229483,229484,229485,262144,262175,262477,262479,262523,262524,262589,262591,262597,262598,262678,262680,262687,262688,262830,262832,262841,262842,264170,264172,264211,264212,290299,290300,294912,294914,294996,295112,309627,309629,309956,309957,309964,309966,309972,309973,310017,310019,310025,310026,310102,310104,310191,310192,310198,310200,310206,310207,310304,310306,310313,310314,310777,310779,310792,310793,310810,310812,310818,310819,312681,312683,312723,312724,313314,313316,313339,313340,316364,316366,316392,316393,318161,318163,319138,319139,319255,319257,319263,319264,327680,327694,329508,329510,329691,329692,329723,329725,329731,329732,334983,334985,335038,335039,335348,335350,335358,335359,335370,335372,335378,335379,335423,335425,335431,336793,337169,337170,337173,337174,337193,337194,337276,337278,337287,337288,337414,337418,338448,343814,343894,343895") == "734254c771983b06dc67847a515cc399649f6add" || 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"), "350,1,118,379,391,393,394,492,493,971,972,974,976,977,978,993,994,1131,1132,1947,1948,1950,1951,1954,1955,1962,1963,1964,1965,6222,6223,6225,6226,6507,6508,6510,6511,7064,7066,13005,13006,13139,13140,15619,15621,21521,21522,21524,21526,32768,32770,32852,32929,37814,37816,38431,38432,38440,38442,38448,38449,41969,41971,42016,42017,42053,42055,42077,42078,42974,42976,43233,43235,43252,43253,43458,43460,43467,43468,44068,44072,44091,44092,44146,44148,44155,44156,44161,44165,44171,44172,44265,44267,44275,44276,48999,49001,51006,51007,51041,51043,51049,51050,51312,51316,51326,51327,53750,53752,53778,53779,53815,53817,53823,53824,53898,53900,53907,53908,55594,55596,55614,55615,55734,55736,55744,55745,57049,57051,57080,57081,57087,57089,57098,57099,59389,59391,59437,59438,65536,65556,73798,73800,73826,73827,84314,84316,85405,85406,85422,85424,85432,85433,86332,86334,86355,86356,92507,92508,98304,98306,98388,98408,107687,107689,107830,107833,109960,109963,113702,113703,113965,113966,114844,114845,115151,115152,116997,116998,118672,118674,118675,118676,118734,118735,118754,118755,118787,118788,118872,118873,118911,118912,118917,118918,118919,118920,118998,118999,119140,119141,119143,119145,131072,131101,137197,137198,141778,141779,163840,163842,163924,163948,169962,169963,173385,173386,180918,180919,192035,192036,196608,196630,229376,229378,229460,229483,229484,229485,262144,262175,262477,262479,262523,262524,262589,262591,262597,262598,262678,262680,262687,262688,262830,262832,262841,262842,264170,264172,264211,264212,290299,290300,294912,294914,294996,295112,309627,309629,309956,309957,309964,309966,309972,309973,310017,310019,310025,310026,310102,310104,310191,310192,310198,310200,310206,310207,310304,310306,310313,310314,310777,310779,310792,310793,310810,310812,310818,310819,312681,312683,312723,312724,313314,313316,313339,313340,316364,316366,316392,316393,318161,318163,319138,319139,319255,319257,319263,319264,327680,327694,329508,329510,329691,329692,329723,329725,329731,329732,334983,334985,335038,335039,335348,335350,335358,335359,335370,335372,335378,335379,335423,335425,335431,336793,337169,337170,337173,337174,337193,337194,337276,337278,337287,337288,337414,337418,338448,343814,343894,343895") && 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") == "33e0672ad8a88510eae5a24964e674f482919bea" || 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") == "761f67192a7060fb24fdffc60f71be62a0aa6725" || 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:57babe1e6489e51e727ac798afa0a87834d41c80",
                "EMMC:/dev/block/by-name/boot:33554432:3c9f9deac58024736d7896d6153c8612d620890b",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:33554432:3c9f9deac58024736d7896d6153c8612d620890b");
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);
