getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.2.0.SJSTRXM:user/release-keys");
ui_print("Target: Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSTRXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.2.0.SJSTRXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSTRXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.2.0.SJSTRXM:user/release-keys or Redmi/gauguin/gauguin:12/RKQ1.200826.002/V13.0.4.0.SJSTRXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5b83c1738631615806a8652634b47190b89c0a4e"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0930b9dee62d23ea69667d1cfae7f475944cafa5")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5b83c1738631615806a8652634b47190b89c0a4e"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0930b9dee62d23ea69667d1cfae7f475944cafa5"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "254,1,32,44,58,114,115,659,660,9725,9726,11885,22263,32768,32786,39618,39619,39846,39847,40236,40238,40935,40939,40962,40963,41030,41034,41038,41039,41053,41059,41060,45067,45077,45078,45081,45114,45121,45127,45128,45129,45136,45142,45143,45144,45157,45163,45164,45165,45630,45632,45672,45673,45686,45688,45747,45749,45750,45751,45752,45753,45830,45835,45869,45870,45915,45916,45918,45920,45945,45947,45951,45953,46129,46130,46136,46137,46226,46227,46772,46773,49801,49802,49976,49977,50009,50015,50016,50017,50454,50458,50468,50469,50609,50615,50616,51885,53218,53356,56681,56685,56724,56725,56747,56753,56754,56755,57999,58003,58024,58025,58157,58161,58167,58168,58293,58297,58304,58305,58310,58316,58317,58318,58351,58357,58358,58359,62610,62614,62646,62647,64414,64418,64433,64434,64464,64465,65536,65552,66508,66512,66524,66525,69427,69428,70543,70545,70546,72399,73408,73412,73433,73434,80776,80780,80801,80802,80924,80925,81583,81587,81608,81609,83766,83767,83785,83786,83968,83969,84023,84024,84593,84597,84604,84605,84636,84637,86823,86827,86853,86854,91580,91581,92381,92385,92396,92397,92440,92441,98031,98035,98053,98054,98154,98155,98304,98322,99355,99359,99375,99376,99990,99996,99997,99998,103488,103489,104843,104847,104861,104862,104941,104942,105934,105938,105952,105953,107115,107116,108452,108456,108480,108481,115017,115018,115591,115595,115614,115615,115699,115700,123367,123368,123667,123668,127924,127925,131072,131088,133117,133121,133142,133143,133261,133262,135313,135317,135345,786438,786448,793365,795780,808391,808557,808558") == "395adfca4e7cf7e24824982c1ab9ff6172ebf0de" || 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"), "254,1,32,44,58,114,115,659,660,9725,9726,11885,22263,32768,32786,39618,39619,39846,39847,40236,40238,40935,40939,40962,40963,41030,41034,41038,41039,41053,41059,41060,45067,45077,45078,45081,45114,45121,45127,45128,45129,45136,45142,45143,45144,45157,45163,45164,45165,45630,45632,45672,45673,45686,45688,45747,45749,45750,45751,45752,45753,45830,45835,45869,45870,45915,45916,45918,45920,45945,45947,45951,45953,46129,46130,46136,46137,46226,46227,46772,46773,49801,49802,49976,49977,50009,50015,50016,50017,50454,50458,50468,50469,50609,50615,50616,51885,53218,53356,56681,56685,56724,56725,56747,56753,56754,56755,57999,58003,58024,58025,58157,58161,58167,58168,58293,58297,58304,58305,58310,58316,58317,58318,58351,58357,58358,58359,62610,62614,62646,62647,64414,64418,64433,64434,64464,64465,65536,65552,66508,66512,66524,66525,69427,69428,70543,70545,70546,72399,73408,73412,73433,73434,80776,80780,80801,80802,80924,80925,81583,81587,81608,81609,83766,83767,83785,83786,83968,83969,84023,84024,84593,84597,84604,84605,84636,84637,86823,86827,86853,86854,91580,91581,92381,92385,92396,92397,92440,92441,98031,98035,98053,98054,98154,98155,98304,98322,99355,99359,99375,99376,99990,99996,99997,99998,103488,103489,104843,104847,104861,104862,104941,104942,105934,105938,105952,105953,107115,107116,108452,108456,108480,108481,115017,115018,115591,115595,115614,115615,115699,115700,123367,123368,123667,123668,127924,127925,131072,131088,133117,133121,133142,133143,133261,133262,135313,135317,135345,786438,786448,793365,795780,808391,808557,808558") && 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"), "616,1,115,126,128,135,136,216,222,230,231,1905,1907,2386,2387,2585,2587,2596,2597,2603,2605,2611,2612,2857,2859,2866,2867,2873,2875,2880,2881,2904,2905,2941,2943,2995,2996,3133,3134,3142,3144,3149,3150,3155,3157,3162,3163,3166,3167,5594,5595,8194,8195,17294,17295,18361,18363,18364,18365,18367,18370,18371,18372,18374,18376,18377,18378,18380,18382,18383,18384,18386,18388,18389,18390,18392,18394,18395,18396,18398,18400,18405,18407,18410,18412,18415,18417,18425,18427,18430,18432,18433,18434,18436,18438,18439,18440,18443,18445,18446,18447,18449,18451,18452,18453,18455,18457,18458,18459,18461,18463,18464,18465,18467,18469,18470,18471,18480,18481,18500,18501,18502,18503,18507,18508,18509,18510,18513,18514,18515,18516,18519,18520,18521,18522,18525,18526,18527,18528,18532,18533,18534,18535,18538,18539,18540,18541,18545,18546,18550,18551,18555,18556,18560,18561,18565,18566,18567,18568,18577,18578,18579,18580,18583,18584,18585,18586,18589,18590,18591,18592,18595,18596,18597,18598,18600,18602,18894,18895,19010,19011,20030,20036,20089,20090,31109,31110,31726,31727,32768,32770,32853,32889,33575,33576,36257,36259,47246,47247,60891,60892,60896,60898,61158,61159,62604,62605,65536,65571,66668,66669,66672,66673,66691,66692,66741,66742,66754,66755,66817,66818,66820,66822,66886,66887,66957,66958,67025,67026,67028,67029,67031,67032,67091,67093,67095,67096,67160,67161,67231,67232,67299,67300,67302,67303,67305,67312,67314,67315,67317,67319,67321,67331,67391,67392,67394,67395,67405,67406,67472,67473,67550,67551,67628,67629,67705,67706,67785,67786,67862,67863,67939,67940,68016,68017,68031,68032,68095,68096,68171,68172,68249,68250,68326,68327,68399,68400,68402,68403,68415,68421,68481,68482,68484,68485,68551,68552,68554,68555,68619,68620,68622,68623,68686,68687,68689,68690,68753,68754,68756,68757,68820,68821,68823,68824,68887,68888,68890,68891,68955,68956,68958,68959,69024,69025,69094,69095,69171,69172,69247,69248,69325,69326,69328,69329,69392,69393,69395,69396,69460,69461,69463,69464,69527,69528,69530,69531,69594,69595,69597,69598,69660,69661,69663,69664,69725,69726,69728,69729,69805,69806,69879,69880,69882,69883,69947,69948,69950,69951,70018,70019,70021,70022,70087,70088,70090,70091,70158,70159,70161,70162,70228,70229,70231,70232,70235,70236,70301,70302,70303,70304,70374,70375,70376,70377,70450,70451,70453,70454,70522,70523,70525,70526,70534,70535,70594,70595,70597,70598,70663,70664,70666,70667,70736,70737,70739,70740,70805,70806,70808,70809,70877,70878,70880,70881,70946,70947,70949,70950,71016,71017,71019,71020,71080,71081,71083,71084,71146,71147,71215,71216,71281,71282,71284,71285,71345,71346,71348,71349,71411,71412,71477,71478,71480,71481,71540,71541,71543,71544,71612,71613,71615,71616,71684,71685,71757,71758,71834,71835,71848,71849,71913,71914,71988,71989,71991,71992,72055,72056,72058,72059,72122,72123,72125,72126,72189,72190,72192,72193,72256,72257,72259,72260,72321,72322,72324,72325,72386,72387,72389,72390,72466,72467,72539,72540,72542,72543,72607,72608,72610,72611,72677,72678,72680,72681,72746,72747,72749,72750,72817,72818,72820,72821,72889,72890,72892,72893,72961,72962,72963,72964,73036,73037,73038,73039,73111,73112,73114,73115,73183,73184,73186,73187,73189,73190,73256,73257,73259,73260,73328,73329,73397,73398,73400,73401,73466,73467,73469,73470,73537,73538,73540,73541,73606,73607,73609,73610,73675,73676,73678,73679,73739,73740,73742,73743,73805,73806,73873,73874,73939,73940,73942,73943,74003,74004,74006,74007,74069,74070,74135,74136,74138,74139,74198,74199,74201,74202,74269,74270,74272,74273,78243,98306,98389,163842,163925,229378,229461,294914,294997,327701,327702,342938,344032,349485,349567,349568") == "f018988355919cbc7f74c1ced3b6e56ba36624fe" || 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"), "616,1,115,126,128,135,136,216,222,230,231,1905,1907,2386,2387,2585,2587,2596,2597,2603,2605,2611,2612,2857,2859,2866,2867,2873,2875,2880,2881,2904,2905,2941,2943,2995,2996,3133,3134,3142,3144,3149,3150,3155,3157,3162,3163,3166,3167,5594,5595,8194,8195,17294,17295,18361,18363,18364,18365,18367,18370,18371,18372,18374,18376,18377,18378,18380,18382,18383,18384,18386,18388,18389,18390,18392,18394,18395,18396,18398,18400,18405,18407,18410,18412,18415,18417,18425,18427,18430,18432,18433,18434,18436,18438,18439,18440,18443,18445,18446,18447,18449,18451,18452,18453,18455,18457,18458,18459,18461,18463,18464,18465,18467,18469,18470,18471,18480,18481,18500,18501,18502,18503,18507,18508,18509,18510,18513,18514,18515,18516,18519,18520,18521,18522,18525,18526,18527,18528,18532,18533,18534,18535,18538,18539,18540,18541,18545,18546,18550,18551,18555,18556,18560,18561,18565,18566,18567,18568,18577,18578,18579,18580,18583,18584,18585,18586,18589,18590,18591,18592,18595,18596,18597,18598,18600,18602,18894,18895,19010,19011,20030,20036,20089,20090,31109,31110,31726,31727,32768,32770,32853,32889,33575,33576,36257,36259,47246,47247,60891,60892,60896,60898,61158,61159,62604,62605,65536,65571,66668,66669,66672,66673,66691,66692,66741,66742,66754,66755,66817,66818,66820,66822,66886,66887,66957,66958,67025,67026,67028,67029,67031,67032,67091,67093,67095,67096,67160,67161,67231,67232,67299,67300,67302,67303,67305,67312,67314,67315,67317,67319,67321,67331,67391,67392,67394,67395,67405,67406,67472,67473,67550,67551,67628,67629,67705,67706,67785,67786,67862,67863,67939,67940,68016,68017,68031,68032,68095,68096,68171,68172,68249,68250,68326,68327,68399,68400,68402,68403,68415,68421,68481,68482,68484,68485,68551,68552,68554,68555,68619,68620,68622,68623,68686,68687,68689,68690,68753,68754,68756,68757,68820,68821,68823,68824,68887,68888,68890,68891,68955,68956,68958,68959,69024,69025,69094,69095,69171,69172,69247,69248,69325,69326,69328,69329,69392,69393,69395,69396,69460,69461,69463,69464,69527,69528,69530,69531,69594,69595,69597,69598,69660,69661,69663,69664,69725,69726,69728,69729,69805,69806,69879,69880,69882,69883,69947,69948,69950,69951,70018,70019,70021,70022,70087,70088,70090,70091,70158,70159,70161,70162,70228,70229,70231,70232,70235,70236,70301,70302,70303,70304,70374,70375,70376,70377,70450,70451,70453,70454,70522,70523,70525,70526,70534,70535,70594,70595,70597,70598,70663,70664,70666,70667,70736,70737,70739,70740,70805,70806,70808,70809,70877,70878,70880,70881,70946,70947,70949,70950,71016,71017,71019,71020,71080,71081,71083,71084,71146,71147,71215,71216,71281,71282,71284,71285,71345,71346,71348,71349,71411,71412,71477,71478,71480,71481,71540,71541,71543,71544,71612,71613,71615,71616,71684,71685,71757,71758,71834,71835,71848,71849,71913,71914,71988,71989,71991,71992,72055,72056,72058,72059,72122,72123,72125,72126,72189,72190,72192,72193,72256,72257,72259,72260,72321,72322,72324,72325,72386,72387,72389,72390,72466,72467,72539,72540,72542,72543,72607,72608,72610,72611,72677,72678,72680,72681,72746,72747,72749,72750,72817,72818,72820,72821,72889,72890,72892,72893,72961,72962,72963,72964,73036,73037,73038,73039,73111,73112,73114,73115,73183,73184,73186,73187,73189,73190,73256,73257,73259,73260,73328,73329,73397,73398,73400,73401,73466,73467,73469,73470,73537,73538,73540,73541,73606,73607,73609,73610,73675,73676,73678,73679,73739,73740,73742,73743,73805,73806,73873,73874,73939,73940,73942,73943,74003,74004,74006,74007,74069,74070,74135,74136,74138,74139,74198,74199,74201,74202,74269,74270,74272,74273,78243,98306,98389,163842,163925,229378,229461,294914,294997,327701,327702,342938,344032,349485,349567,349568") && 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"), "420,1,16,7691,7692,7898,7900,8142,8144,8879,8883,8906,8907,9022,9026,9029,9030,9046,9050,9054,9055,17800,17801,25219,25220,25828,25833,28071,28072,28677,28681,29567,29568,30943,30944,31181,31182,32768,32777,32804,32805,33173,33177,33689,33690,33703,33709,33710,33711,43631,43632,47669,47670,51674,51675,61517,61518,65536,65543,71068,71075,72551,72552,82957,82958,88107,88108,95896,95897,95949,95950,95971,95972,95981,95983,96902,96903,96910,96911,96914,96915,97045,97051,97052,97053,97066,97072,97073,97074,97890,97894,97909,97910,98304,98313,103128,103129,113182,113186,114588,114589,118445,118447,131072,131079,132119,132120,134340,134342,154495,154496,155070,155071,157125,157126,161176,161177,163840,163849,164558,164559,165173,165174,165790,165791,169932,169933,170422,170423,174122,174123,174238,174240,174248,174250,174291,174293,174302,174303,175074,175075,175082,175083,175089,175090,175093,175100,175108,175109,179695,179696,179798,179799,179801,179803,179814,179816,179826,179827,179916,179917,179929,179930,179944,179946,179955,179956,179958,179959,180266,180267,180268,180270,180282,180283,180359,180360,180362,180363,180427,180428,180512,180513,181942,181949,181957,181964,182004,182011,182037,182044,182069,182076,182096,182097,182111,182113,183326,183327,183505,183507,183508,183509,183516,183517,183522,183523,183548,183549,183553,183555,183557,183559,183580,183581,183594,183595,183657,183661,183665,183669,183670,183674,183675,183679,183680,183684,183685,183689,183690,183694,183695,183699,183700,183704,183705,183707,183708,183710,183711,183752,183811,183814,184229,184230,184601,184602,187485,187486,187505,187506,187546,187547,187559,187560,187596,187597,187613,187614,187630,187631,187665,187666,187804,187805,187818,187819,187823,187824,187831,187832,187844,187845,196170,196172,196608,196624,198131,198132,198275,198277,198291,198292,200456,200457,201923,201924,205771,205772,209654,209657,211506,211508,213313,213314,215221,215222,216868,216870,217008,217010,227720,227721,229376,229403,229727,229731,229816,229817,238459,238460,242027,242028,242280,242281,242314,242315,242322,242324,242331,242332,242339,242340,243795,243796,243842,243848,243849,243850,244027,244031,244039,244040,245921,245922,246357,246361,246368,246369,246405,246406,246548,246554,246555,246556,246560,246561,246679,246683,246684,246685,247441,247442,252306,252307,258182,258183,258329,258330,258703,258706,259300,259301,259926,259927,260469,260471,262057,262059,262144,262157,285078,285079,286981,286990,294912,294917,321536,321537,321610,321611,321663,321664,321702,321703,322146,322147,322322,322323,322521,322530,323025,323026,323068,323076,323105,323106,323107,323108,323463,323464,324503,324504,324808,324810,324944,324945,326344,326345,327680,327681,329227,329228,330180,330183,334884,334885,342894,348328,348412,348413") == "47c8a1155d90c35b722e67dd48614c4c85dd11e9" || 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"), "420,1,16,7691,7692,7898,7900,8142,8144,8879,8883,8906,8907,9022,9026,9029,9030,9046,9050,9054,9055,17800,17801,25219,25220,25828,25833,28071,28072,28677,28681,29567,29568,30943,30944,31181,31182,32768,32777,32804,32805,33173,33177,33689,33690,33703,33709,33710,33711,43631,43632,47669,47670,51674,51675,61517,61518,65536,65543,71068,71075,72551,72552,82957,82958,88107,88108,95896,95897,95949,95950,95971,95972,95981,95983,96902,96903,96910,96911,96914,96915,97045,97051,97052,97053,97066,97072,97073,97074,97890,97894,97909,97910,98304,98313,103128,103129,113182,113186,114588,114589,118445,118447,131072,131079,132119,132120,134340,134342,154495,154496,155070,155071,157125,157126,161176,161177,163840,163849,164558,164559,165173,165174,165790,165791,169932,169933,170422,170423,174122,174123,174238,174240,174248,174250,174291,174293,174302,174303,175074,175075,175082,175083,175089,175090,175093,175100,175108,175109,179695,179696,179798,179799,179801,179803,179814,179816,179826,179827,179916,179917,179929,179930,179944,179946,179955,179956,179958,179959,180266,180267,180268,180270,180282,180283,180359,180360,180362,180363,180427,180428,180512,180513,181942,181949,181957,181964,182004,182011,182037,182044,182069,182076,182096,182097,182111,182113,183326,183327,183505,183507,183508,183509,183516,183517,183522,183523,183548,183549,183553,183555,183557,183559,183580,183581,183594,183595,183657,183661,183665,183669,183670,183674,183675,183679,183680,183684,183685,183689,183690,183694,183695,183699,183700,183704,183705,183707,183708,183710,183711,183752,183811,183814,184229,184230,184601,184602,187485,187486,187505,187506,187546,187547,187559,187560,187596,187597,187613,187614,187630,187631,187665,187666,187804,187805,187818,187819,187823,187824,187831,187832,187844,187845,196170,196172,196608,196624,198131,198132,198275,198277,198291,198292,200456,200457,201923,201924,205771,205772,209654,209657,211506,211508,213313,213314,215221,215222,216868,216870,217008,217010,227720,227721,229376,229403,229727,229731,229816,229817,238459,238460,242027,242028,242280,242281,242314,242315,242322,242324,242331,242332,242339,242340,243795,243796,243842,243848,243849,243850,244027,244031,244039,244040,245921,245922,246357,246361,246368,246369,246405,246406,246548,246554,246555,246556,246560,246561,246679,246683,246684,246685,247441,247442,252306,252307,258182,258183,258329,258330,258703,258706,259300,259301,259926,259927,260469,260471,262057,262059,262144,262157,285078,285079,286981,286990,294912,294917,321536,321537,321610,321611,321663,321664,321702,321703,322146,322147,322322,322323,322521,322530,323025,323026,323068,323076,323105,323106,323107,323108,323463,323464,324503,324504,324808,324810,324944,324945,326344,326345,327680,327681,329227,329228,330180,330183,334884,334885,342894,348328,348412,348413") && 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;
if (range_sha1(map_partition("odm"), "14,1,11,12,13,20,21,29,31,285,287,290,299,315,316") == "6ee633df9819cb6b9d9cb570a8eb0dead83f6fd3" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "14,1,11,12,13,20,21,29,31,285,287,290,299,315,316") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "16,1,27,27963,27965,27973,27977,27981,27982,28044,28050,28051,140545,140972,143209,143253,143254") == "29a642c56688239d1cddeb289965dacdeed9956c" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "16,1,27,27963,27965,27973,27977,27981,27982,28044,28050,28051,140545,140972,143209,143253,143254") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


# ---- 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/abl_ecc.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
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/abl_ecc.elf", "/dev/block/bootdevice/by-name/ablbak");
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/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/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

# --- Start patching dynamic partitions ---


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

# Update dynamic partition metadata

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

# Patch partition system

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

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
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 odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:5b83c1738631615806a8652634b47190b89c0a4e"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0930b9dee62d23ea69667d1cfae7f475944cafa5"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:0930b9dee62d23ea69667d1cfae7f475944cafa5")));

# ---- 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");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
