getprop("ro.product.device") == "citrus" || abort("E3004: This package is for \"citrus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.8.0.RJFMIXM:user/release-keys");
ui_print("Target: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.8.0.RJFMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.8.0.RJFMIXM:user/release-keys or POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:bed4e0c60d83371215059a4e98ff3ae5c5ed68ce")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:bed4e0c60d83371215059a4e98ff3ae5c5ed68ce"),"\" has unexpected contents."));
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "522,1,33,45,55,75,79,107,108,21363,21364,21394,21395,27560,27561,28976,56690,56697,56698,58043,58044,60201,60202,63025,63026,63770,63771,65331,65332,65524,65525,65536,65553,66762,66763,71132,71133,72250,72251,74269,74270,74751,74752,77915,77916,78512,78513,78700,78701,79403,79404,79620,79622,79784,79788,79796,79797,84678,84679,84692,84696,84700,84701,86122,86128,86161,86162,86169,86175,86176,86177,86184,86190,86191,86192,89686,89690,89730,89731,90712,90713,91363,91364,93295,93298,93306,93307,93329,93330,93334,93335,93771,93772,93946,93947,93979,93985,93986,93987,94109,94115,94116,95218,95356,98734,98749,98755,98756,98757,103699,103700,104482,104486,104552,104553,105642,105646,105667,105668,106316,106317,106421,106436,106441,106444,106445,106481,106767,106768,106784,106785,106916,106917,106919,106920,106922,106923,114215,114219,114245,114246,114376,114380,114386,114387,114521,114525,114532,114533,119818,119822,119891,119892,119920,119921,119960,119966,119967,119968,120216,120217,120251,120257,120258,120259,120735,120739,120755,120756,121308,121314,121315,121316,123187,123191,123236,123237,123241,123247,123248,123249,123280,123286,123287,123288,124979,124983,125007,125008,129053,129057,129094,129095,130862,130866,130884,130885,130915,130916,130922,130928,130929,130930,131072,131089,132752,132756,132798,132799,135332,135333,136447,136449,136450,136514,136964,136968,137370,137371,138061,138065,138081,138082,140197,140201,140229,140230,140241,140543,140580,140581,143278,143279,149396,149400,149487,149488,150703,150704,150848,150849,151017,151021,151048,151049,151692,151696,151717,151718,154991,154992,158262,158266,158291,158292,158311,158312,160622,160623,161367,161371,161427,161428,163253,163257,163296,163297,163339,163345,163351,167730,167751,167752,171075,171076,173175,173179,173210,173211,174343,174349,174372,174373,174552,174553,175870,175876,175898,175899,177377,177378,177850,177854,177884,177885,178579,178580,179240,179244,179266,179267,181465,181469,181501,181502,188422,188423,196608,196625,204831,204832,204839,204840,204933,204934,204996,204997,204998,204999,206813,206817,206988,206989,207066,207067,213889,213890,214413,214414,223803,223807,223878,223879,223931,223932,225630,225631,226540,226544,226569,226570,226583,226584,226589,226595,226600,226601,229376,229395,229989,229990,231635,231639,231686,231687,231718,231719,231723,231727,231728,231729,231775,231783,231784,231785,234610,234616,234661,234662,234694,234700,234701,234702,234746,234752,234753,307824,307836,307837,307844,307845,307879,307880,307885,307886,307911,307912,307991,307994,307995,307996,308002,308003,308004,308005,308067,308068,308071,308076,308077,308078,308079,308080,308081,308082,309005,309006,309013,309014,309567,309568,309569,309573,309574,309575,309576,309577,309578,309579,309580,309581,309582,309583,309584,309585,309586,309587,309589,309590,309591,309594,310838,310840,310973,310974,310980,310981,310986,310988,311246,311247,311249,311251,311794,311795,311810,311811,311828,311829,311975,311976,311984,311986,311988,311989,321012,321013,327680,327697,328964,328965,330949,330950,331580,331583,331589,331590,331595,331596,331601,331652,331657,334992,334997,335004,335018,335024,335034,335035,335040,335041,335046,335172,335176,335220,335229,335231,335237,335238,335243,335244,335249,335304,335309,339093,339098,339105,339117,339122,339130,339131,339136,339137,339142,339265,339269,339315,339336,339347,339352,339353,339373,339825,340452,340453,341565,655372,655377,661097,663098,673606,673750,673751") == "517a0c8ca0ac7ef2de77e4f72a5f4f7c8b0b8d5e" || 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"), "522,1,33,45,55,75,79,107,108,21363,21364,21394,21395,27560,27561,28976,56690,56697,56698,58043,58044,60201,60202,63025,63026,63770,63771,65331,65332,65524,65525,65536,65553,66762,66763,71132,71133,72250,72251,74269,74270,74751,74752,77915,77916,78512,78513,78700,78701,79403,79404,79620,79622,79784,79788,79796,79797,84678,84679,84692,84696,84700,84701,86122,86128,86161,86162,86169,86175,86176,86177,86184,86190,86191,86192,89686,89690,89730,89731,90712,90713,91363,91364,93295,93298,93306,93307,93329,93330,93334,93335,93771,93772,93946,93947,93979,93985,93986,93987,94109,94115,94116,95218,95356,98734,98749,98755,98756,98757,103699,103700,104482,104486,104552,104553,105642,105646,105667,105668,106316,106317,106421,106436,106441,106444,106445,106481,106767,106768,106784,106785,106916,106917,106919,106920,106922,106923,114215,114219,114245,114246,114376,114380,114386,114387,114521,114525,114532,114533,119818,119822,119891,119892,119920,119921,119960,119966,119967,119968,120216,120217,120251,120257,120258,120259,120735,120739,120755,120756,121308,121314,121315,121316,123187,123191,123236,123237,123241,123247,123248,123249,123280,123286,123287,123288,124979,124983,125007,125008,129053,129057,129094,129095,130862,130866,130884,130885,130915,130916,130922,130928,130929,130930,131072,131089,132752,132756,132798,132799,135332,135333,136447,136449,136450,136514,136964,136968,137370,137371,138061,138065,138081,138082,140197,140201,140229,140230,140241,140543,140580,140581,143278,143279,149396,149400,149487,149488,150703,150704,150848,150849,151017,151021,151048,151049,151692,151696,151717,151718,154991,154992,158262,158266,158291,158292,158311,158312,160622,160623,161367,161371,161427,161428,163253,163257,163296,163297,163339,163345,163351,167730,167751,167752,171075,171076,173175,173179,173210,173211,174343,174349,174372,174373,174552,174553,175870,175876,175898,175899,177377,177378,177850,177854,177884,177885,178579,178580,179240,179244,179266,179267,181465,181469,181501,181502,188422,188423,196608,196625,204831,204832,204839,204840,204933,204934,204996,204997,204998,204999,206813,206817,206988,206989,207066,207067,213889,213890,214413,214414,223803,223807,223878,223879,223931,223932,225630,225631,226540,226544,226569,226570,226583,226584,226589,226595,226600,226601,229376,229395,229989,229990,231635,231639,231686,231687,231718,231719,231723,231727,231728,231729,231775,231783,231784,231785,234610,234616,234661,234662,234694,234700,234701,234702,234746,234752,234753,307824,307836,307837,307844,307845,307879,307880,307885,307886,307911,307912,307991,307994,307995,307996,308002,308003,308004,308005,308067,308068,308071,308076,308077,308078,308079,308080,308081,308082,309005,309006,309013,309014,309567,309568,309569,309573,309574,309575,309576,309577,309578,309579,309580,309581,309582,309583,309584,309585,309586,309587,309589,309590,309591,309594,310838,310840,310973,310974,310980,310981,310986,310988,311246,311247,311249,311251,311794,311795,311810,311811,311828,311829,311975,311976,311984,311986,311988,311989,321012,321013,327680,327697,328964,328965,330949,330950,331580,331583,331589,331590,331595,331596,331601,331652,331657,334992,334997,335004,335018,335024,335034,335035,335040,335041,335046,335172,335176,335220,335229,335231,335237,335238,335243,335244,335249,335304,335309,339093,339098,339105,339117,339122,339130,339131,339136,339137,339142,339265,339269,339315,339336,339347,339352,339353,339373,339825,340452,340453,341565,655372,655377,661097,663098,673606,673750,673751") && 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"), "556,1,31,42,46,51,52,132,140,146,147,1824,1828,2307,2308,2553,2557,2562,2563,2566,2570,2573,2574,2597,2601,2605,2606,2629,2630,2666,2670,2720,2721,2882,2883,2888,2894,2895,2902,2916,2917,4773,4822,5254,5255,7791,7792,9159,9160,9860,9862,9863,9864,9866,9869,9870,9871,9873,9875,9876,9877,9879,9881,9882,9883,9885,9887,9888,9889,9892,9894,9895,9896,9899,9901,9904,9906,9914,9916,9919,9921,9924,9926,9927,9928,9933,9934,9936,9938,9939,9940,9942,9944,9945,9946,9948,9950,9951,9952,9954,9956,9957,9958,9983,9984,9988,9989,9995,9996,9999,10000,10001,10002,10005,10006,10007,10008,10011,10012,10013,10014,10019,10020,10023,10024,10025,10026,10029,10030,10031,10032,10036,10037,10041,10042,10045,10047,10050,10052,10056,10057,10062,10063,10064,10065,10068,10069,10070,10071,10074,10075,10076,10077,10080,10081,10082,10083,10086,10087,10088,10089,10092,10093,10094,10095,10099,10100,10390,10391,11418,11423,18599,18600,18732,18733,18743,18744,27674,27675,27964,27966,28039,28040,29854,29855,32768,32800,34506,34507,35141,35143,35784,35785,36317,36318,36856,36857,36860,36861,37303,37304,38210,38211,38219,38220,38315,38316,40242,40244,51221,51222,51487,51488,51492,51494,51511,51512,51547,51548,51557,51558,51559,51560,51610,51611,51617,51618,53034,53035,57111,57112,57114,57116,57180,57181,57251,57252,57319,57320,57322,57323,57325,57326,57385,57387,57389,57390,57454,57455,57525,57526,57593,57594,57596,57597,57599,57602,57603,57605,57607,57608,57614,57615,57617,57618,57621,57622,57633,57635,57637,57638,57644,57645,57647,57648,57651,57652,57654,57655,57658,57661,57663,57664,57666,57668,57671,57673,57675,57676,57684,57685,57687,57688,57698,57699,57701,57702,57704,57705,57708,57709,57720,57722,57724,57725,57731,57732,57734,57735,57737,57738,57740,57741,57743,57754,57814,57815,57817,57818,57828,57829,57895,57896,57973,57974,57984,57985,58051,58052,58128,58129,58208,58209,58285,58286,58362,58363,58439,58440,58450,58451,58454,58455,58518,58519,58594,58595,58605,58606,58672,58673,58749,58750,58822,58823,58825,58826,58838,58843,58844,58845,58849,58850,58852,58853,58856,58857,59111,59329,59331,59332,60396,60397,60432,60434,60439,60441,60567,60568,60617,60620,60896,60897,60898,60899,62186,62187,63446,63447,64141,64142,64245,64246,64551,64554,65536,65574,65690,65691,66480,66481,70701,72722,74658,74668,75416,75417,75940,75955,76256,76257,83133,83134,84538,84600,88376,88377,88858,88859,95021,95023,97861,97862,98304,98344,101847,101848,101850,101851,108095,108096,108102,108104,108111,108112,108192,108193,108253,108254,114534,114536,114615,114616,120701,120702,125083,129821,130424,130425,130995,131179,131828,131829,140646,140647,143415,143689,145075,146263,146268,148730,149956,149957,152917,152919,155636,155637,156480,156487,156851,156852,163840,163869,189965,192411,195359,195374,195777,195779,196608,196637,196646,196647,204582,204583,206213,206214,207609,207671,211630,211631,211775,211776,212940,212941,218561,218562,221164,221166,224234,224261,226483,226484,229376,229400,231437,231438,239984,239985,239991,239993,240000,240001,240448,240449,247034,247035,247039,247040,247047,247048,252688,252689,252705,252706,252707,252709,252710,252712,252713,252715,252716,252718,252719,252720,252776,252778,252779,252780,252782,252783,252785,252786,252972,252973,258481,258482,259461,294928,294936,308277,308282,312525,313474,318444,318519,318520") == "f287070e2759a9a2671d23c0c5c4df715ebdcd29" || 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"), "556,1,31,42,46,51,52,132,140,146,147,1824,1828,2307,2308,2553,2557,2562,2563,2566,2570,2573,2574,2597,2601,2605,2606,2629,2630,2666,2670,2720,2721,2882,2883,2888,2894,2895,2902,2916,2917,4773,4822,5254,5255,7791,7792,9159,9160,9860,9862,9863,9864,9866,9869,9870,9871,9873,9875,9876,9877,9879,9881,9882,9883,9885,9887,9888,9889,9892,9894,9895,9896,9899,9901,9904,9906,9914,9916,9919,9921,9924,9926,9927,9928,9933,9934,9936,9938,9939,9940,9942,9944,9945,9946,9948,9950,9951,9952,9954,9956,9957,9958,9983,9984,9988,9989,9995,9996,9999,10000,10001,10002,10005,10006,10007,10008,10011,10012,10013,10014,10019,10020,10023,10024,10025,10026,10029,10030,10031,10032,10036,10037,10041,10042,10045,10047,10050,10052,10056,10057,10062,10063,10064,10065,10068,10069,10070,10071,10074,10075,10076,10077,10080,10081,10082,10083,10086,10087,10088,10089,10092,10093,10094,10095,10099,10100,10390,10391,11418,11423,18599,18600,18732,18733,18743,18744,27674,27675,27964,27966,28039,28040,29854,29855,32768,32800,34506,34507,35141,35143,35784,35785,36317,36318,36856,36857,36860,36861,37303,37304,38210,38211,38219,38220,38315,38316,40242,40244,51221,51222,51487,51488,51492,51494,51511,51512,51547,51548,51557,51558,51559,51560,51610,51611,51617,51618,53034,53035,57111,57112,57114,57116,57180,57181,57251,57252,57319,57320,57322,57323,57325,57326,57385,57387,57389,57390,57454,57455,57525,57526,57593,57594,57596,57597,57599,57602,57603,57605,57607,57608,57614,57615,57617,57618,57621,57622,57633,57635,57637,57638,57644,57645,57647,57648,57651,57652,57654,57655,57658,57661,57663,57664,57666,57668,57671,57673,57675,57676,57684,57685,57687,57688,57698,57699,57701,57702,57704,57705,57708,57709,57720,57722,57724,57725,57731,57732,57734,57735,57737,57738,57740,57741,57743,57754,57814,57815,57817,57818,57828,57829,57895,57896,57973,57974,57984,57985,58051,58052,58128,58129,58208,58209,58285,58286,58362,58363,58439,58440,58450,58451,58454,58455,58518,58519,58594,58595,58605,58606,58672,58673,58749,58750,58822,58823,58825,58826,58838,58843,58844,58845,58849,58850,58852,58853,58856,58857,59111,59329,59331,59332,60396,60397,60432,60434,60439,60441,60567,60568,60617,60620,60896,60897,60898,60899,62186,62187,63446,63447,64141,64142,64245,64246,64551,64554,65536,65574,65690,65691,66480,66481,70701,72722,74658,74668,75416,75417,75940,75955,76256,76257,83133,83134,84538,84600,88376,88377,88858,88859,95021,95023,97861,97862,98304,98344,101847,101848,101850,101851,108095,108096,108102,108104,108111,108112,108192,108193,108253,108254,114534,114536,114615,114616,120701,120702,125083,129821,130424,130425,130995,131179,131828,131829,140646,140647,143415,143689,145075,146263,146268,148730,149956,149957,152917,152919,155636,155637,156480,156487,156851,156852,163840,163869,189965,192411,195359,195374,195777,195779,196608,196637,196646,196647,204582,204583,206213,206214,207609,207671,211630,211631,211775,211776,212940,212941,218561,218562,221164,221166,224234,224261,226483,226484,229376,229400,231437,231438,239984,239985,239991,239993,240000,240001,240448,240449,247034,247035,247039,247040,247047,247048,252688,252689,252705,252706,252707,252709,252710,252712,252713,252715,252716,252718,252719,252720,252776,252778,252779,252780,252782,252783,252785,252786,252972,252973,258481,258482,259461,294928,294936,308277,308282,312525,313474,318444,318519,318520") && 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"), "372,1,16,3205,3206,6293,6294,6311,6315,6319,6320,11087,11088,11515,11517,13554,13558,13651,13652,14654,14655,16352,16355,16361,16362,16403,16404,24817,24818,32768,32777,34634,34635,35977,35978,36112,36113,36168,36169,37783,37784,38146,38150,38669,38670,38682,38688,38689,38690,40530,40534,40576,40577,40585,41968,51716,51717,55590,55591,55841,55846,55858,55859,55923,55926,56119,56124,56381,56383,59865,59866,65536,65543,69714,69715,79259,79266,80742,80743,86118,86119,89268,89269,98304,98313,98829,98830,98837,98838,98967,98973,98974,98975,98988,98994,98995,98996,106517,106518,107757,107761,108774,108775,112623,112625,126108,126109,126178,126179,128400,128402,131072,131079,148907,148908,150916,150917,158218,158219,163840,163849,164599,164600,168589,168590,168891,168892,168944,168946,168955,168956,169050,169052,169841,169842,169849,169850,169856,169857,174194,174195,174420,174422,174432,174434,174480,174482,174492,174494,174503,174504,176322,176323,176324,176327,179712,179713,179876,179877,179878,179879,179881,179882,179899,179900,179903,179905,179906,179908,179924,179925,179937,179938,179977,179981,179985,179989,179990,179994,179995,180011,180426,180427,180798,180799,182284,182285,182374,182376,182379,182380,182383,182384,182387,182388,182391,182392,182395,182396,182399,182400,182414,182415,182421,182422,182428,182429,182435,182436,182442,182443,182449,182450,182492,182493,182514,182515,182522,182523,182544,182545,182562,182563,182569,182570,182588,182589,182596,182597,182616,182617,182632,182633,182638,182639,182659,182660,182667,182668,182689,182690,182707,182708,182714,182715,182718,182719,182722,182723,182726,182727,182730,182731,183321,183323,185769,185770,196608,196628,196629,196630,203128,203130,204271,204272,212471,212473,213523,213525,215765,215766,215940,215944,215992,215993,216008,216009,216249,216253,216504,216505,225065,225066,228601,228602,228651,228652,229376,229385,230230,230234,230302,230303,230333,230334,230470,230474,230482,230483,231871,231875,231910,231911,232052,232058,232059,232060,232064,232065,232182,232186,232187,232188,233589,233593,233637,236360,237092,237093,243531,243532,247753,247754,249281,249282,249946,249950,249966,249967,251540,251544,251569,251570,262144,262147,262405,262406,287551,287552,287577,287578,287781,287782,288259,288260,288499,288500,289238,289239,289818,289819,289996,289997,290972,290974,291446,291447,292088,292089,294912,294915,295020,295021,295958,295963,298181,298183,301517,301518,308875,313772,313847,313848") == "09281274853b031ebfe1b0a1346208c2d23f0d7f" || 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"), "372,1,16,3205,3206,6293,6294,6311,6315,6319,6320,11087,11088,11515,11517,13554,13558,13651,13652,14654,14655,16352,16355,16361,16362,16403,16404,24817,24818,32768,32777,34634,34635,35977,35978,36112,36113,36168,36169,37783,37784,38146,38150,38669,38670,38682,38688,38689,38690,40530,40534,40576,40577,40585,41968,51716,51717,55590,55591,55841,55846,55858,55859,55923,55926,56119,56124,56381,56383,59865,59866,65536,65543,69714,69715,79259,79266,80742,80743,86118,86119,89268,89269,98304,98313,98829,98830,98837,98838,98967,98973,98974,98975,98988,98994,98995,98996,106517,106518,107757,107761,108774,108775,112623,112625,126108,126109,126178,126179,128400,128402,131072,131079,148907,148908,150916,150917,158218,158219,163840,163849,164599,164600,168589,168590,168891,168892,168944,168946,168955,168956,169050,169052,169841,169842,169849,169850,169856,169857,174194,174195,174420,174422,174432,174434,174480,174482,174492,174494,174503,174504,176322,176323,176324,176327,179712,179713,179876,179877,179878,179879,179881,179882,179899,179900,179903,179905,179906,179908,179924,179925,179937,179938,179977,179981,179985,179989,179990,179994,179995,180011,180426,180427,180798,180799,182284,182285,182374,182376,182379,182380,182383,182384,182387,182388,182391,182392,182395,182396,182399,182400,182414,182415,182421,182422,182428,182429,182435,182436,182442,182443,182449,182450,182492,182493,182514,182515,182522,182523,182544,182545,182562,182563,182569,182570,182588,182589,182596,182597,182616,182617,182632,182633,182638,182639,182659,182660,182667,182668,182689,182690,182707,182708,182714,182715,182718,182719,182722,182723,182726,182727,182730,182731,183321,183323,185769,185770,196608,196628,196629,196630,203128,203130,204271,204272,212471,212473,213523,213525,215765,215766,215940,215944,215992,215993,216008,216009,216249,216253,216504,216505,225065,225066,228601,228602,228651,228652,229376,229385,230230,230234,230302,230303,230333,230334,230470,230474,230482,230483,231871,231875,231910,231911,232052,232058,232059,232060,232064,232065,232182,232186,232187,232188,233589,233593,233637,236360,237092,237093,243531,243532,247753,247754,249281,249282,249946,249950,249966,249967,251540,251544,251569,251570,262144,262147,262405,262406,287551,287552,287577,287578,287781,287782,288259,288260,288499,288500,289238,289239,289818,289819,289996,289997,290972,290974,291446,291447,292088,292089,294912,294915,295020,295021,295958,295963,298181,298183,301517,301518,308875,313772,313847,313848") && 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("system_ext"), "248,1,31,40,44,48,49,57,63,64,65,81,87,88,89,148,152,157,158,719,721,778,782,797,798,827,833,834,835,1724,1730,1753,1754,1761,1767,1768,1769,1997,2001,2010,2011,2042,2048,2049,2050,2246,2250,2254,2255,2259,2263,2268,2269,2274,2275,2299,2305,2306,2307,2313,2319,2320,2321,2324,2325,2337,2343,2344,2345,2356,2357,2363,2367,2371,2372,2377,2383,2387,2388,2397,2403,2404,2405,2418,2424,2425,2426,2438,2444,2445,2446,2449,2456,2464,2471,2539,2546,2552,2559,2595,2600,2620,2627,2646,2653,2671,2672,2882,2884,2893,2894,2906,2907,2908,2909,2910,2911,2920,2921,2944,2945,2993,2998,3001,3004,3007,3010,3013,3015,3019,3020,3024,3027,3031,3032,3049,3112,3555,3557,3561,3565,3566,3570,3575,3577,3582,3586,3587,3591,3592,3596,3597,3601,3602,3606,3607,3611,3612,3616,3617,3621,3622,3624,3631,3635,3636,3640,3641,3645,3646,3650,3651,3655,3656,3660,3661,3665,3666,3668,3669,3673,3674,3678,3679,3681,3682,3686,3687,3691,3692,3696,3697,3701,3702,3706,3707,3709,3713,3717,3718,3722,3723,3725,3726,3728,3729,3733,3734,3738,3739,3741,3742,3746,3747,3751,3752,3756,3757,3761,3762,3764,3765,3769,3770,3772,3776,3793,3798,3832,3835,3948,6360,6361,6644,7314,7596,7597,8786,8787,9210,10312,10483,98326,98328,118969,119330,121225,121264,121265") == "d47d20809282de36d9fe7e5f1674f72d92f0bafd" || 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"), "248,1,31,40,44,48,49,57,63,64,65,81,87,88,89,148,152,157,158,719,721,778,782,797,798,827,833,834,835,1724,1730,1753,1754,1761,1767,1768,1769,1997,2001,2010,2011,2042,2048,2049,2050,2246,2250,2254,2255,2259,2263,2268,2269,2274,2275,2299,2305,2306,2307,2313,2319,2320,2321,2324,2325,2337,2343,2344,2345,2356,2357,2363,2367,2371,2372,2377,2383,2387,2388,2397,2403,2404,2405,2418,2424,2425,2426,2438,2444,2445,2446,2449,2456,2464,2471,2539,2546,2552,2559,2595,2600,2620,2627,2646,2653,2671,2672,2882,2884,2893,2894,2906,2907,2908,2909,2910,2911,2920,2921,2944,2945,2993,2998,3001,3004,3007,3010,3013,3015,3019,3020,3024,3027,3031,3032,3049,3112,3555,3557,3561,3565,3566,3570,3575,3577,3582,3586,3587,3591,3592,3596,3597,3601,3602,3606,3607,3611,3612,3616,3617,3621,3622,3624,3631,3635,3636,3640,3641,3645,3646,3650,3651,3655,3656,3660,3661,3665,3666,3668,3669,3673,3674,3678,3679,3681,3682,3686,3687,3691,3692,3696,3697,3701,3702,3706,3707,3709,3713,3717,3718,3722,3723,3725,3726,3728,3729,3733,3734,3738,3739,3741,3742,3746,3747,3751,3752,3756,3757,3761,3762,3764,3765,3769,3770,3772,3776,3793,3798,3832,3835,3948,6360,6361,6644,7314,7596,7597,8786,8787,9210,10312,10483,98326,98328,118969,119330,121225,121264,121265") && 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/imagefv.elf", "/dev/block/bootdevice/by-name/ImageFv");
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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
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/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
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/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/ImageFvbak");
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/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
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");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");

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

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

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

# --- End patching dynamic partitions ---

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

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