getprop("ro.product.device") == "cannong" || abort("E3004: This package is for \"cannong\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.1.0.SJEMIXM:user/release-keys");
ui_print("Target: Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.2.0.SJEMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.1.0.SJEMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.2.0.SJEMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.1.0.SJEMIXM:user/release-keys or Redmi/cannong_global/cannong:12/SP1A.210812.016/V13.0.2.0.SJEMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/by-name/boot",":67108864:865a937c9e8b96e210a162fdea32ac1f3cec3187"),
                      concat("EMMC:","/dev/block/by-name/boot",":67108864:4d1289ab816ca9fcc574cb28108af40b095f6407")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/by-name/boot",":67108864:865a937c9e8b96e210a162fdea32ac1f3cec3187"),"\" or \"",concat("EMMC:","/dev/block/by-name/boot",":67108864:4d1289ab816ca9fcc574cb28108af40b095f6407"),"\" has unexpected contents."));
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "1296,1,31,46,58,60,65,32768,32785,40105,40107,40271,40275,40282,40283,40297,40301,40305,40306,40338,40342,40346,40347,40354,40358,40362,40363,40370,40374,40378,40379,40392,40396,40400,40401,43396,43397,45887,45888,46026,46027,46059,46063,46067,46068,46505,46509,46519,46520,46660,46664,46668,49534,54535,54539,54578,54579,54601,54605,54609,54610,54618,54622,54626,54627,54796,54800,54806,54807,56051,56055,56078,56079,56211,56215,56221,56222,56347,56351,56358,56359,56365,56366,56437,56441,56445,56446,56673,56677,56684,56685,56705,56709,56713,56714,56719,56723,56727,56728,56761,56765,56769,56770,61021,61025,61057,61058,62825,62829,62844,62845,62875,62876,64231,64233,64286,64287,65064,65068,65536,65551,66084,66086,66087,66090,66152,66153,67162,67166,67188,67189,67371,67375,67381,67382,67392,67396,67400,67401,67432,67436,67440,67441,74783,74787,74943,74944,75602,75606,75628,75629,78847,78851,78891,78892,81310,81314,81341,81342,87118,87122,87179,87180,92771,92775,92902,92903,94363,94367,94384,94385,94999,95003,95007,95008,98304,98321,100102,100106,100203,100204,101197,101201,101216,101217,103747,103751,103776,103777,111120,111124,111232,111233,128895,128899,129042,129043,131072,131087,131462,131466,131495,131496,133144,133148,133170,133171,135926,135930,135978,135979,138983,138987,139024,139025,149651,149655,149872,149873,152125,152129,152157,152158,163840,163857,175219,175220,183730,183734,184043,184044,187193,187197,187255,187256,189314,189318,189366,189367,189656,189660,189670,189671,196608,196623,197015,197019,197153,197154,203754,203758,203851,203852,212330,212334,212379,212380,212423,212425,212454,212458,212462,212463,221625,221631,221692,221693,228119,228123,228216,228217,229376,229393,229518,229522,229553,229554,230951,230957,230978,230979,236930,236934,236978,236979,242290,242294,242348,242349,242758,242762,242775,247286,247301,247302,247305,247348,249689,249695,249722,249723,252591,252595,252642,252643,252889,252893,252900,252901,252905,252909,252913,252914,252918,252922,252926,252927,252931,252935,252939,252940,252944,252948,252952,252953,252959,252963,252967,252968,258352,258356,258443,258444,258448,258452,258456,258457,258502,258508,258512,258513,262144,262159,262306,262312,262369,262370,262417,262421,262425,262426,265412,265413,266838,266842,266878,266879,267040,267041,267126,267130,267134,267135,271008,271012,271040,271041,271048,271052,271056,271057,271063,271067,271072,271073,271077,271078,271102,271106,271110,271111,276428,276432,276520,276521,276839,276843,276853,276854,279925,279929,279975,279976,281423,281427,282789,282790,283175,283179,284486,284490,284505,284508,284523,284524,284964,284968,284977,284980,284989,284990,285680,285681,286068,286069,288672,288673,292410,292411,294912,294929,296025,296030,296031,296032,296033,296034,296035,296036,296037,296038,296039,296040,296041,296042,296043,296044,296045,296046,296047,296048,296049,296050,296051,296052,296053,296054,296055,296056,296057,296058,296059,296060,296061,296062,296063,296064,296065,296066,296067,296068,296069,296070,296071,296072,296073,296074,296075,296076,296077,296078,296079,296080,296081,296082,296083,296084,296085,296086,296087,296088,296089,296090,296091,296092,296093,296094,296095,296096,296097,296098,296099,296100,296101,296102,296103,296104,296105,296106,296107,296108,296109,296110,296111,296112,296113,296114,296115,296116,296117,296118,296119,296120,296121,296122,296123,296124,296125,296126,296127,296128,296129,296130,296131,296132,296133,296134,296135,296136,296137,296138,296139,296140,296141,296142,296143,296144,296145,296146,296147,296148,296149,296150,296151,296152,296153,296154,296155,296156,296157,296158,296159,296160,296161,296162,296163,296164,296165,296166,296167,296168,296169,296170,296171,296172,296173,296174,296175,296176,296177,296178,296179,296180,296181,296182,296183,296184,296185,296186,296187,296188,296189,296190,296191,296192,296193,296194,296195,296196,296197,296198,296199,296200,296201,296202,296203,296204,296205,296206,296207,296208,296209,296210,296211,296212,296213,296214,296215,296216,296217,296218,296219,296220,296221,296222,296223,296224,296225,296226,296227,296228,296229,296230,296231,296232,296233,296234,296235,296236,296237,296238,296239,296240,296241,296242,296243,296244,296245,296246,296247,296248,296249,296250,296251,296252,296253,296254,296255,296256,296257,296258,296259,296260,296261,296262,296263,296264,296265,296266,296267,296268,296269,296270,296271,296272,296273,296274,296275,296276,296277,296278,296279,296280,296281,296282,296283,296284,296285,296286,296287,296288,296289,296290,296291,296292,296293,296294,296295,296296,296297,296298,296299,296300,296301,296302,296303,296304,296305,296306,296307,296308,296309,296310,296311,296312,296313,296314,296315,296316,296317,296318,296319,296320,296321,296322,296323,296324,296325,296326,296327,296328,296329,296330,296331,296332,296333,296334,296335,296336,296337,296338,296339,296340,296341,296342,296343,296344,296345,296346,296347,296348,296349,296350,296351,296352,296353,296354,296355,296356,296357,296358,296359,296360,296361,296362,296363,296364,296365,296366,296367,296368,296369,296370,296371,296372,296373,296374,296375,296376,296377,296378,296379,296380,296381,296382,296383,296384,296385,296386,296387,296388,296389,296390,296391,296392,296393,296394,296395,296396,296397,296398,296399,296400,296401,296402,296403,296404,296405,296406,296407,296408,296409,296410,296411,296412,296413,296414,296415,296416,296417,296418,296419,296420,296421,296422,296423,296424,296425,296426,296427,296428,296429,296430,296431,296432,296433,296434,296435,296436,296437,296438,296439,296440,296441,296442,296443,296444,296445,296446,296447,296448,296449,296450,296451,296452,296453,296454,296455,296456,296457,296458,296459,296460,296461,296462,296463,296464,296465,296466,296467,296468,296469,296470,296471,296472,296473,296474,296475,296477,321856,321857,327680,327695,333913,333914,340944,340945,358066,358067,360448,360463,367729,367730,368939,368940,369550,369551,369555,369618,369631,369632,369634,369635,369649,369650,369691,369692,369790,369791,369796,369797,369825,369826,369910,369911,369912,369913,369985,369986,369989,369994,369995,369996,369997,369998,369999,370000,370911,370912,370919,370920,371473,371474,371476,371478,372031,372033,372034,372035,372036,372037,372038,372039,372040,372041,372042,372043,372044,372045,372047,372048,372050,372051,372052,372055,373380,373382,373542,373543,373549,373551,373789,373790,373792,373794,374461,374462,374474,374475,374487,374488,374610,374611,374633,374635,374637,374638,383972,383973,393127,393128,393216,393231,393864,393867,393872,394283,394288,397537,397542,397743,397748,398060,398065,398526,398531,402211,402216,402435,402440,402781,402798,402886,402898,402909,404042,404043,405550,424274,425984,425999,426818,427922,428038,429071,430727,430731,430735,430737,430741,430743,430747,430749,430753,430755,430759,430761,430765,430767,430773,430775,431093,431095,431128,431130,431219,431220,431230,431232,431236,431238,431242,431244,431248,431250,431256,431258,431262,431264,431268,431270,431274,431276,431280,431282,431286,431288,431304,431306,431310,431312,431317,431318,431322,431324,431328,431330,431334,431336,431340,431342,431346,431348,431352,431354,431358,431360,431416,431417,431425,431427,431431,431433,431437,431439,431443,431445,431449,431451,431455,431457,431461,431463,431467,431469,431473,431475,431482,431484,431488,431490,431496,431498,431502,431504,431514,431516,431541,431543,431547,431549,431614,431615,431624,431626,431630,431632,431638,431640,431644,431646,431650,431652,431656,431658,431662,431664,431668,431670,431677,431679,431683,431685,431689,431691,431695,431697,431701,431703,431707,431709,431713,431715,431719,431721,431725,431727,431733,431736,431740,431742,431746,431748,431752,431754,431758,431760,431764,431766,431770,431772,431778,431780,432155,432157,432190,432192,432301,432302,432313,432315,432319,432321,432325,432327,432331,432333,432339,432341,432345,432347,432351,432353,432357,432359,432363,432365,432369,432371,432387,432389,432393,432395,432401,432402,432406,432408,432412,432414,432418,432420,432424,432426,432430,432432,432436,432438,432453,432454,432459,432461,432465,432467,432534,432535,432543,432545,432549,432551,432555,432557,432561,432563,432567,432569,432573,432575,432579,432581,432585,432587,432591,432593,432600,432602,432606,432608,432614,434493,434497,434499,434503,434504,434508,434517,434518,434520,434530,434532,434557,434559,434563,434565,434641,434642,434651,434653,434657,434659,434665,434667,434671,434673,434677,705694,705699,705700,705703,705719,706130,706132,720896,720951,721217,721218,736822,736824,740360,740362,746298,746300,751678,751680,752742,752744,752850,752852,752860,752862,752902,752904,753664,753778,760136,760138,760185,760187,760234,917507,917519,950273,950287,965150,968046,983385,983586,983587") == "5b1a18bbfe1bbbf59eea76cf013e3b94476cbbcb" || 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"), "1296,1,31,46,58,60,65,32768,32785,40105,40107,40271,40275,40282,40283,40297,40301,40305,40306,40338,40342,40346,40347,40354,40358,40362,40363,40370,40374,40378,40379,40392,40396,40400,40401,43396,43397,45887,45888,46026,46027,46059,46063,46067,46068,46505,46509,46519,46520,46660,46664,46668,49534,54535,54539,54578,54579,54601,54605,54609,54610,54618,54622,54626,54627,54796,54800,54806,54807,56051,56055,56078,56079,56211,56215,56221,56222,56347,56351,56358,56359,56365,56366,56437,56441,56445,56446,56673,56677,56684,56685,56705,56709,56713,56714,56719,56723,56727,56728,56761,56765,56769,56770,61021,61025,61057,61058,62825,62829,62844,62845,62875,62876,64231,64233,64286,64287,65064,65068,65536,65551,66084,66086,66087,66090,66152,66153,67162,67166,67188,67189,67371,67375,67381,67382,67392,67396,67400,67401,67432,67436,67440,67441,74783,74787,74943,74944,75602,75606,75628,75629,78847,78851,78891,78892,81310,81314,81341,81342,87118,87122,87179,87180,92771,92775,92902,92903,94363,94367,94384,94385,94999,95003,95007,95008,98304,98321,100102,100106,100203,100204,101197,101201,101216,101217,103747,103751,103776,103777,111120,111124,111232,111233,128895,128899,129042,129043,131072,131087,131462,131466,131495,131496,133144,133148,133170,133171,135926,135930,135978,135979,138983,138987,139024,139025,149651,149655,149872,149873,152125,152129,152157,152158,163840,163857,175219,175220,183730,183734,184043,184044,187193,187197,187255,187256,189314,189318,189366,189367,189656,189660,189670,189671,196608,196623,197015,197019,197153,197154,203754,203758,203851,203852,212330,212334,212379,212380,212423,212425,212454,212458,212462,212463,221625,221631,221692,221693,228119,228123,228216,228217,229376,229393,229518,229522,229553,229554,230951,230957,230978,230979,236930,236934,236978,236979,242290,242294,242348,242349,242758,242762,242775,247286,247301,247302,247305,247348,249689,249695,249722,249723,252591,252595,252642,252643,252889,252893,252900,252901,252905,252909,252913,252914,252918,252922,252926,252927,252931,252935,252939,252940,252944,252948,252952,252953,252959,252963,252967,252968,258352,258356,258443,258444,258448,258452,258456,258457,258502,258508,258512,258513,262144,262159,262306,262312,262369,262370,262417,262421,262425,262426,265412,265413,266838,266842,266878,266879,267040,267041,267126,267130,267134,267135,271008,271012,271040,271041,271048,271052,271056,271057,271063,271067,271072,271073,271077,271078,271102,271106,271110,271111,276428,276432,276520,276521,276839,276843,276853,276854,279925,279929,279975,279976,281423,281427,282789,282790,283175,283179,284486,284490,284505,284508,284523,284524,284964,284968,284977,284980,284989,284990,285680,285681,286068,286069,288672,288673,292410,292411,294912,294929,296025,296030,296031,296032,296033,296034,296035,296036,296037,296038,296039,296040,296041,296042,296043,296044,296045,296046,296047,296048,296049,296050,296051,296052,296053,296054,296055,296056,296057,296058,296059,296060,296061,296062,296063,296064,296065,296066,296067,296068,296069,296070,296071,296072,296073,296074,296075,296076,296077,296078,296079,296080,296081,296082,296083,296084,296085,296086,296087,296088,296089,296090,296091,296092,296093,296094,296095,296096,296097,296098,296099,296100,296101,296102,296103,296104,296105,296106,296107,296108,296109,296110,296111,296112,296113,296114,296115,296116,296117,296118,296119,296120,296121,296122,296123,296124,296125,296126,296127,296128,296129,296130,296131,296132,296133,296134,296135,296136,296137,296138,296139,296140,296141,296142,296143,296144,296145,296146,296147,296148,296149,296150,296151,296152,296153,296154,296155,296156,296157,296158,296159,296160,296161,296162,296163,296164,296165,296166,296167,296168,296169,296170,296171,296172,296173,296174,296175,296176,296177,296178,296179,296180,296181,296182,296183,296184,296185,296186,296187,296188,296189,296190,296191,296192,296193,296194,296195,296196,296197,296198,296199,296200,296201,296202,296203,296204,296205,296206,296207,296208,296209,296210,296211,296212,296213,296214,296215,296216,296217,296218,296219,296220,296221,296222,296223,296224,296225,296226,296227,296228,296229,296230,296231,296232,296233,296234,296235,296236,296237,296238,296239,296240,296241,296242,296243,296244,296245,296246,296247,296248,296249,296250,296251,296252,296253,296254,296255,296256,296257,296258,296259,296260,296261,296262,296263,296264,296265,296266,296267,296268,296269,296270,296271,296272,296273,296274,296275,296276,296277,296278,296279,296280,296281,296282,296283,296284,296285,296286,296287,296288,296289,296290,296291,296292,296293,296294,296295,296296,296297,296298,296299,296300,296301,296302,296303,296304,296305,296306,296307,296308,296309,296310,296311,296312,296313,296314,296315,296316,296317,296318,296319,296320,296321,296322,296323,296324,296325,296326,296327,296328,296329,296330,296331,296332,296333,296334,296335,296336,296337,296338,296339,296340,296341,296342,296343,296344,296345,296346,296347,296348,296349,296350,296351,296352,296353,296354,296355,296356,296357,296358,296359,296360,296361,296362,296363,296364,296365,296366,296367,296368,296369,296370,296371,296372,296373,296374,296375,296376,296377,296378,296379,296380,296381,296382,296383,296384,296385,296386,296387,296388,296389,296390,296391,296392,296393,296394,296395,296396,296397,296398,296399,296400,296401,296402,296403,296404,296405,296406,296407,296408,296409,296410,296411,296412,296413,296414,296415,296416,296417,296418,296419,296420,296421,296422,296423,296424,296425,296426,296427,296428,296429,296430,296431,296432,296433,296434,296435,296436,296437,296438,296439,296440,296441,296442,296443,296444,296445,296446,296447,296448,296449,296450,296451,296452,296453,296454,296455,296456,296457,296458,296459,296460,296461,296462,296463,296464,296465,296466,296467,296468,296469,296470,296471,296472,296473,296474,296475,296477,321856,321857,327680,327695,333913,333914,340944,340945,358066,358067,360448,360463,367729,367730,368939,368940,369550,369551,369555,369618,369631,369632,369634,369635,369649,369650,369691,369692,369790,369791,369796,369797,369825,369826,369910,369911,369912,369913,369985,369986,369989,369994,369995,369996,369997,369998,369999,370000,370911,370912,370919,370920,371473,371474,371476,371478,372031,372033,372034,372035,372036,372037,372038,372039,372040,372041,372042,372043,372044,372045,372047,372048,372050,372051,372052,372055,373380,373382,373542,373543,373549,373551,373789,373790,373792,373794,374461,374462,374474,374475,374487,374488,374610,374611,374633,374635,374637,374638,383972,383973,393127,393128,393216,393231,393864,393867,393872,394283,394288,397537,397542,397743,397748,398060,398065,398526,398531,402211,402216,402435,402440,402781,402798,402886,402898,402909,404042,404043,405550,424274,425984,425999,426818,427922,428038,429071,430727,430731,430735,430737,430741,430743,430747,430749,430753,430755,430759,430761,430765,430767,430773,430775,431093,431095,431128,431130,431219,431220,431230,431232,431236,431238,431242,431244,431248,431250,431256,431258,431262,431264,431268,431270,431274,431276,431280,431282,431286,431288,431304,431306,431310,431312,431317,431318,431322,431324,431328,431330,431334,431336,431340,431342,431346,431348,431352,431354,431358,431360,431416,431417,431425,431427,431431,431433,431437,431439,431443,431445,431449,431451,431455,431457,431461,431463,431467,431469,431473,431475,431482,431484,431488,431490,431496,431498,431502,431504,431514,431516,431541,431543,431547,431549,431614,431615,431624,431626,431630,431632,431638,431640,431644,431646,431650,431652,431656,431658,431662,431664,431668,431670,431677,431679,431683,431685,431689,431691,431695,431697,431701,431703,431707,431709,431713,431715,431719,431721,431725,431727,431733,431736,431740,431742,431746,431748,431752,431754,431758,431760,431764,431766,431770,431772,431778,431780,432155,432157,432190,432192,432301,432302,432313,432315,432319,432321,432325,432327,432331,432333,432339,432341,432345,432347,432351,432353,432357,432359,432363,432365,432369,432371,432387,432389,432393,432395,432401,432402,432406,432408,432412,432414,432418,432420,432424,432426,432430,432432,432436,432438,432453,432454,432459,432461,432465,432467,432534,432535,432543,432545,432549,432551,432555,432557,432561,432563,432567,432569,432573,432575,432579,432581,432585,432587,432591,432593,432600,432602,432606,432608,432614,434493,434497,434499,434503,434504,434508,434517,434518,434520,434530,434532,434557,434559,434563,434565,434641,434642,434651,434653,434657,434659,434665,434667,434671,434673,434677,705694,705699,705700,705703,705719,706130,706132,720896,720951,721217,721218,736822,736824,740360,740362,746298,746300,751678,751680,752742,752744,752850,752852,752860,752862,752902,752904,753664,753778,760136,760138,760185,760187,760234,917507,917519,950273,950287,965150,968046,983385,983586,983587") && 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"), "170,1,36,44,48,52,53,56,57,60,61,67,71,75,76,79,83,89,93,97,98,101,102,105,106,115,119,123,124,127,128,1026,1027,3569,3570,4943,4944,5222,5230,14848,14849,32768,32816,65536,65571,98304,98374,131072,131133,133183,133184,134266,134267,137296,137299,137345,137346,137702,137703,138979,138980,149013,149015,149019,149021,158811,158812,163840,163880,167350,167351,171974,171975,173487,173645,175884,175885,178844,180181,182781,182782,183126,183127,183749,183750,184345,184346,185760,185762,196608,196640,206247,206248,222912,222913,229376,229412,250171,250172,255611,255612,258984,258985,260650,260651,262144,262171,281503,281504,286894,286895,293120,293121,293126,293128,294912,294937,300377,300378,300399,300400,301040,301041,304677,304678,304943,304944,305337,305338,306011,306012,306705,306706,307640,307641,311592,311593,312589,312591,312665,312667,312674,312676,312677,312680,312683,312684,312688,312689,312693,312694,312697,312698,312701,312702,312706,312708,312711,316117,318066,318067,318577,318579,320801,320803,320804,320805,321778,326878,326957,326958") == "1dc2d6c08fd11cfe02e1f8708f1309b7b9659190" || 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"), "170,1,36,44,48,52,53,56,57,60,61,67,71,75,76,79,83,89,93,97,98,101,102,105,106,115,119,123,124,127,128,1026,1027,3569,3570,4943,4944,5222,5230,14848,14849,32768,32816,65536,65571,98304,98374,131072,131133,133183,133184,134266,134267,137296,137299,137345,137346,137702,137703,138979,138980,149013,149015,149019,149021,158811,158812,163840,163880,167350,167351,171974,171975,173487,173645,175884,175885,178844,180181,182781,182782,183126,183127,183749,183750,184345,184346,185760,185762,196608,196640,206247,206248,222912,222913,229376,229412,250171,250172,255611,255612,258984,258985,260650,260651,262144,262171,281503,281504,286894,286895,293120,293121,293126,293128,294912,294937,300377,300378,300399,300400,301040,301041,304677,304678,304943,304944,305337,305338,306011,306012,306705,306706,307640,307641,311592,311593,312589,312591,312665,312667,312674,312676,312677,312680,312683,312684,312688,312689,312693,312694,312697,312698,312701,312702,312706,312708,312711,316117,318066,318067,318577,318579,320801,320803,320804,320805,321778,326878,326957,326958") && 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"), "220,1,15,6545,6546,14371,14375,17233,17236,20094,20095,29017,29018,32768,32776,39747,39748,43087,43088,43472,43476,44025,44026,44039,44043,44047,44048,45888,45892,47251,47252,57172,57173,65276,65277,65536,65542,74850,74851,86038,86039,97168,97169,98304,98312,111763,111764,111771,111772,111775,111776,111906,111910,111914,111915,120962,120963,127406,127410,128796,128797,131072,131078,146903,146904,163840,163848,170253,170254,172286,172287,180371,180372,192248,192249,192256,192257,192263,192264,196608,196614,199404,199405,199419,199421,199422,199423,199429,199430,199431,199432,199445,199446,199449,199451,199453,199454,199465,199466,199467,199470,199919,199920,200291,200292,201777,201778,201868,201869,201893,201894,201901,201902,201909,201910,201917,201918,201925,201926,201936,201937,202063,202064,202067,202068,202072,202073,202077,202078,202082,202083,202090,202091,202102,202104,210923,210925,211870,211874,211897,211898,213851,213855,213947,213948,215433,215434,229376,229384,229385,229386,241855,241857,245690,245694,245780,245781,246058,246062,246374,246375,255385,255386,260959,260960,261006,261010,261014,261015,261192,261196,261204,261205,262144,262150,263500,263504,263551,263552,263722,263726,263730,263731,263887,263891,263895,263896,264912,264916,264940,264941,278300,278301,279957,279958,280500,280504,280518,280519,282214,282218,282242,282243,294912,294917,306481,306482,327680,327681,347758,347759,351639,351644,353862,353864,360448,360449,366667,372479,372565,372566") == "2b4b2ae31798b2198f3d8b6766e18b9b70b758a4" || 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"), "220,1,15,6545,6546,14371,14375,17233,17236,20094,20095,29017,29018,32768,32776,39747,39748,43087,43088,43472,43476,44025,44026,44039,44043,44047,44048,45888,45892,47251,47252,57172,57173,65276,65277,65536,65542,74850,74851,86038,86039,97168,97169,98304,98312,111763,111764,111771,111772,111775,111776,111906,111910,111914,111915,120962,120963,127406,127410,128796,128797,131072,131078,146903,146904,163840,163848,170253,170254,172286,172287,180371,180372,192248,192249,192256,192257,192263,192264,196608,196614,199404,199405,199419,199421,199422,199423,199429,199430,199431,199432,199445,199446,199449,199451,199453,199454,199465,199466,199467,199470,199919,199920,200291,200292,201777,201778,201868,201869,201893,201894,201901,201902,201909,201910,201917,201918,201925,201926,201936,201937,202063,202064,202067,202068,202072,202073,202077,202078,202082,202083,202090,202091,202102,202104,210923,210925,211870,211874,211897,211898,213851,213855,213947,213948,215433,215434,229376,229384,229385,229386,241855,241857,245690,245694,245780,245781,246058,246062,246374,246375,255385,255386,260959,260960,261006,261010,261014,261015,261192,261196,261204,261205,262144,262150,263500,263504,263551,263552,263722,263726,263730,263731,263887,263891,263895,263896,264912,264916,264940,264941,278300,278301,279957,279958,280500,280504,280518,280519,282214,282218,282242,282243,294912,294917,306481,306482,327680,327681,347758,347759,351639,351644,353862,353864,360448,360449,366667,372479,372565,372566") && 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 ---


# Patch partition system

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

# Update dynamic partition metadata

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

# 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 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/by-name/boot",":67108864:865a937c9e8b96e210a162fdea32ac1f3cec3187"),
                concat("EMMC:","/dev/block/by-name/boot",":67108864:4d1289ab816ca9fcc574cb28108af40b095f6407"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/by-name/boot",":67108864:4d1289ab816ca9fcc574cb28108af40b095f6407")));
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("audio_dsp.img", "/dev/block/by-name/audio_dsp");
package_extract_file("pi_img.img", "/dev/block/by-name/pi_img");
package_extract_file("cam_vpu3.img", "/dev/block/by-name/cam_vpu3");
package_extract_file("dtbo.img", "/dev/block/by-name/dtbo");
package_extract_file("logo.bin", "/dev/block/by-name/logo");
package_extract_file("cam_vpu1.img", "/dev/block/by-name/cam_vpu1");
package_extract_file("cam_vpu2.img", "/dev/block/by-name/cam_vpu2");
package_extract_file("md1img.img", "/dev/block/by-name/md1img");
package_extract_file("spmfw.img", "/dev/block/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/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/by-name/tee2");
package_extract_file("scp.img", "/dev/block/by-name/scp2");
package_extract_file("mcupm.img", "/dev/block/by-name/mcupm_2");
package_extract_file("gz.img", "/dev/block/by-name/gz2");
package_extract_file("lk.img", "/dev/block/by-name/lk2");
package_extract_file("dpm.img", "/dev/block/by-name/dpm_2");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/sdb"));
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("scp1", "scp2");
switch_active("mcupm_1", "mcupm_2");
switch_active("gz1", "gz2");
switch_active("lk", "lk2");
switch_active("dpm_1", "dpm_2");
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/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/by-name/tee1");
package_extract_file("scp.img", "/dev/block/by-name/scp1");
package_extract_file("mcupm.img", "/dev/block/by-name/mcupm_1");
package_extract_file("gz.img", "/dev/block/by-name/gz1");
package_extract_file("lk.img", "/dev/block/by-name/lk");
package_extract_file("dpm.img", "/dev/block/by-name/dpm_1");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/sda"));
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("scp2", "scp1");
switch_active("mcupm_2", "mcupm_1");
switch_active("gz2", "gz1");
switch_active("lk2", "lk");
switch_active("dpm_2", "dpm_1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta_system.img", "/dev/block/by-name/vbmeta_system");
package_extract_file("vbmeta.img", "/dev/block/by-name/vbmeta");
package_extract_file("vbmeta_vendor.img", "/dev/block/by-name/vbmeta_vendor");
post_ota_action();
set_progress(1.000000);
