getprop("ro.product.device") == "perseus" || abort("E3004: This package is for \"perseus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.3.0.QEERUXM:user/release-keys");
ui_print("Target: Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.4.0.QEERUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.3.0.QEERUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.4.0.QEERUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.3.0.QEERUXM:user/release-keys or Xiaomi/perseus_ru/perseus:10/QKQ1.190828.002/V11.0.4.0.QEERUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:67108864:39d78e84d65c5e7c3e4b50eea551c3fb249b5dde",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:23953a8a0c715f9f085933529b34ac89206127e4") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:39d78e84d65c5e7c3e4b50eea551c3fb249b5dde\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:23953a8a0c715f9f085933529b34ac89206127e4\" has unexpected contents.");
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "648,1,651,728,742,774,781,783,784,1030,1035,1037,1038,1144,1145,1629,1630,2318,2319,2321,2323,2324,2325,2340,2341,2522,2523,3694,3695,3697,3698,3702,3703,3711,3712,3713,3714,9071,9072,9074,9075,9479,9480,9482,9483,10478,10480,16419,16420,16553,16554,19323,19325,25572,25574,32768,32770,32990,32991,34739,34740,34742,34744,34803,34804,34937,34939,35062,35066,35073,35074,35086,35090,35094,35095,36302,36308,36340,36341,36347,36351,36355,36356,36361,36365,36369,36370,36487,36493,36499,36500,37821,37825,37843,37844,37874,37878,37882,37883,38094,38098,38106,38107,38204,38208,38212,39625,41362,41366,41387,41388,41401,41405,41409,41410,41412,41413,44268,44272,44300,44301,44671,44675,44683,44684,44812,44816,44822,44823,45226,45230,45245,45246,49713,49717,49802,49803,49808,49812,49816,49817,49822,49823,50505,50509,50531,50532,54223,54224,54385,54386,54435,54439,54443,54444,54628,54632,54638,54639,55056,55060,55064,55065,56303,56307,56342,56343,56347,56351,56355,56356,56378,56382,56406,56407,58666,58670,58700,58701,58769,58773,58777,58778,58861,58865,58871,58872,63515,63517,65536,65537,68626,68627,68814,68818,68960,68961,70263,70267,71934,71935,72207,72211,72223,72224,72256,72260,72270,72272,72276,72277,72282,72283,72733,72737,73140,73141,73823,73827,73843,73844,76113,76117,76164,76165,76558,76562,76575,76576,79373,79374,82829,82833,82899,82900,83825,83829,83854,83855,85838,85842,85848,85849,85892,85896,85901,85902,85977,85981,85985,85986,89057,89063,89069,89070,91959,91963,91981,91982,93377,93378,93797,93801,93807,93808,94150,94154,94167,94168,94529,94530,94766,94770,94786,94787,98304,98306,98526,98527,113782,113786,113980,113981,114403,114409,114427,114428,114438,114442,114449,114450,118058,118062,118114,118115,118489,118493,118506,118507,118558,118562,118567,118568,118571,118577,118582,118583,121357,121361,121407,121408,121491,121495,121501,121502,121504,121508,121512,121513,121557,121561,121565,121566,122275,122281,122298,122299,122664,122670,122680,122681,122877,122881,122886,122887,123541,123547,123570,123571,123611,123615,123619,123620,125522,125526,125550,125551,125571,125572,125642,125646,125651,125652,126389,126393,126411,126412,126446,126450,126454,126455,126555,126559,126565,126566,127553,127557,127582,127583,131072,131073,133938,133942,134032,134033,134041,134045,134049,134050,134185,134189,134195,134196,135662,135666,135682,135683,136949,136955,136971,136972,137865,137869,137896,137897,137901,137905,137909,137910,137932,137936,137940,137941,137945,137949,137952,137953,137957,137958,137973,137977,137981,137982,138006,138010,138014,138015,140816,140820,140866,140867,141135,141139,141149,141150,141501,141507,141516,141517,141520,141521,142439,142443,143264,143265,143684,143688,143700,143703,146227,146231,146246,146247,146733,146737,146745,146746,149374,149379,149395,149400,149417,149418,149754,149755,150915,150927,151173,151182,151498,151499,151933,151934,152797,152908,153691,153692,154047,154056,154323,154387,156441,156447,156453,156454,156765,156766,156778,156779,156789,156792,156793,156794,156795,156796,156798,156799,156800,156801,156841,156842,156848,156849,156937,156940,156943,156944,158051,158052,158292,158293,158299,158300,158323,158324,158390,158391,158394,158399,158400,158401,158402,158403,158404,158405,159816,159817,159823,159824,160287,160288,163040,163041,163042,163044,163507,163509,163510,163511,163512,163513,163514,163515,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163530,163531,163532,163535,163840,163842,164062,164063,165386,165387,166054,166056,166058,166059,166142,166143,166145,166146,166149,166151,166409,166410,166417,166419,166907,166909,167031,167032,167043,167044,167310,167311,167423,167424,167440,167442,167444,167445,176367,176368,184331,184332,186235,186236,186709,186798,187984,188270,189591,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,884738,884958,884959,885464,892491,903007,917316,917503,917504") == "0b98b20d7914962d85a4961fbe5a297bdc44fc25" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "648,1,651,728,742,774,781,783,784,1030,1035,1037,1038,1144,1145,1629,1630,2318,2319,2321,2323,2324,2325,2340,2341,2522,2523,3694,3695,3697,3698,3702,3703,3711,3712,3713,3714,9071,9072,9074,9075,9479,9480,9482,9483,10478,10480,16419,16420,16553,16554,19323,19325,25572,25574,32768,32770,32990,32991,34739,34740,34742,34744,34803,34804,34937,34939,35062,35066,35073,35074,35086,35090,35094,35095,36302,36308,36340,36341,36347,36351,36355,36356,36361,36365,36369,36370,36487,36493,36499,36500,37821,37825,37843,37844,37874,37878,37882,37883,38094,38098,38106,38107,38204,38208,38212,39625,41362,41366,41387,41388,41401,41405,41409,41410,41412,41413,44268,44272,44300,44301,44671,44675,44683,44684,44812,44816,44822,44823,45226,45230,45245,45246,49713,49717,49802,49803,49808,49812,49816,49817,49822,49823,50505,50509,50531,50532,54223,54224,54385,54386,54435,54439,54443,54444,54628,54632,54638,54639,55056,55060,55064,55065,56303,56307,56342,56343,56347,56351,56355,56356,56378,56382,56406,56407,58666,58670,58700,58701,58769,58773,58777,58778,58861,58865,58871,58872,63515,63517,65536,65537,68626,68627,68814,68818,68960,68961,70263,70267,71934,71935,72207,72211,72223,72224,72256,72260,72270,72272,72276,72277,72282,72283,72733,72737,73140,73141,73823,73827,73843,73844,76113,76117,76164,76165,76558,76562,76575,76576,79373,79374,82829,82833,82899,82900,83825,83829,83854,83855,85838,85842,85848,85849,85892,85896,85901,85902,85977,85981,85985,85986,89057,89063,89069,89070,91959,91963,91981,91982,93377,93378,93797,93801,93807,93808,94150,94154,94167,94168,94529,94530,94766,94770,94786,94787,98304,98306,98526,98527,113782,113786,113980,113981,114403,114409,114427,114428,114438,114442,114449,114450,118058,118062,118114,118115,118489,118493,118506,118507,118558,118562,118567,118568,118571,118577,118582,118583,121357,121361,121407,121408,121491,121495,121501,121502,121504,121508,121512,121513,121557,121561,121565,121566,122275,122281,122298,122299,122664,122670,122680,122681,122877,122881,122886,122887,123541,123547,123570,123571,123611,123615,123619,123620,125522,125526,125550,125551,125571,125572,125642,125646,125651,125652,126389,126393,126411,126412,126446,126450,126454,126455,126555,126559,126565,126566,127553,127557,127582,127583,131072,131073,133938,133942,134032,134033,134041,134045,134049,134050,134185,134189,134195,134196,135662,135666,135682,135683,136949,136955,136971,136972,137865,137869,137896,137897,137901,137905,137909,137910,137932,137936,137940,137941,137945,137949,137952,137953,137957,137958,137973,137977,137981,137982,138006,138010,138014,138015,140816,140820,140866,140867,141135,141139,141149,141150,141501,141507,141516,141517,141520,141521,142439,142443,143264,143265,143684,143688,143700,143703,146227,146231,146246,146247,146733,146737,146745,146746,149374,149379,149395,149400,149417,149418,149754,149755,150915,150927,151173,151182,151498,151499,151933,151934,152797,152908,153691,153692,154047,154056,154323,154387,156441,156447,156453,156454,156765,156766,156778,156779,156789,156792,156793,156794,156795,156796,156798,156799,156800,156801,156841,156842,156848,156849,156937,156940,156943,156944,158051,158052,158292,158293,158299,158300,158323,158324,158390,158391,158394,158399,158400,158401,158402,158403,158404,158405,159816,159817,159823,159824,160287,160288,163040,163041,163042,163044,163507,163509,163510,163511,163512,163513,163514,163515,163517,163518,163519,163520,163521,163522,163523,163524,163525,163526,163530,163531,163532,163535,163840,163842,164062,164063,165386,165387,166054,166056,166058,166059,166142,166143,166145,166146,166149,166151,166409,166410,166417,166419,166907,166909,167031,167032,167043,167044,167310,167311,167423,167424,167440,167442,167444,167445,176367,176368,184331,184332,186235,186236,186709,186798,187984,188270,189591,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,884738,884958,884959,885464,892491,903007,917316,917503,917504") && block_image_verify("/dev/block/bootdevice/by-name/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("/dev/block/bootdevice/by-name/vendor", "206,1,224,570,578,588,592,597,598,679,683,688,689,950,954,959,970,982,986,990,991,994,998,1002,1003,1011,1015,1020,1021,1269,1295,3181,3182,3236,3286,3305,3610,3677,3678,4708,4714,6791,6792,6907,6908,7029,7081,7792,7793,8476,8477,9086,9092,11345,11347,14199,14200,15205,15207,15350,15351,15713,15715,16127,16128,16180,16181,19730,19733,19751,19752,19797,19798,19816,19817,19819,19820,19868,19869,19899,19900,20496,20497,20522,20523,20557,20558,20892,20893,20910,20911,32768,32770,32832,32833,34351,34353,40489,40490,40492,40493,41068,41070,47386,47387,47394,47395,47450,47451,47452,47453,47471,47472,47897,47898,47951,47952,48296,48298,48299,48305,48307,48309,48315,48326,48374,48375,48377,48381,48519,48542,56230,56231,56369,56386,56411,56477,56500,56527,56535,56547,56617,56660,56855,56865,57010,57033,64029,64031,65008,65009,65536,65537,66296,67101,76521,76522,96819,96820,98304,98306,98368,98369,99329,99407,99498,99647,121022,121232,121296,121305,121614,121723,121888,121889,122093,122099,125099,125119,131072,131073,135043,135044,135754,135811,136014,136015,136038,136039,136709,137213,137215,163842,163904,163905,164410,196609,197114,229378,229440,229441,229946,244355,257987,262077,262143,262144") == "13e21ccf5d4b91018bb7c13587f62aa5b182989e" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "206,1,224,570,578,588,592,597,598,679,683,688,689,950,954,959,970,982,986,990,991,994,998,1002,1003,1011,1015,1020,1021,1269,1295,3181,3182,3236,3286,3305,3610,3677,3678,4708,4714,6791,6792,6907,6908,7029,7081,7792,7793,8476,8477,9086,9092,11345,11347,14199,14200,15205,15207,15350,15351,15713,15715,16127,16128,16180,16181,19730,19733,19751,19752,19797,19798,19816,19817,19819,19820,19868,19869,19899,19900,20496,20497,20522,20523,20557,20558,20892,20893,20910,20911,32768,32770,32832,32833,34351,34353,40489,40490,40492,40493,41068,41070,47386,47387,47394,47395,47450,47451,47452,47453,47471,47472,47897,47898,47951,47952,48296,48298,48299,48305,48307,48309,48315,48326,48374,48375,48377,48381,48519,48542,56230,56231,56369,56386,56411,56477,56500,56527,56535,56547,56617,56660,56855,56865,57010,57033,64029,64031,65008,65009,65536,65537,66296,67101,76521,76522,96819,96820,98304,98306,98368,98369,99329,99407,99498,99647,121022,121232,121296,121305,121614,121723,121888,121889,122093,122099,125099,125119,131072,131073,135043,135044,135754,135811,136014,136015,136038,136039,136709,137213,137215,163842,163904,163905,164410,196609,197114,229378,229440,229441,229946,244355,257987,262077,262143,262144") && block_image_verify("/dev/block/bootdevice/by-name/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:67108864:39d78e84d65c5e7c3e4b50eea551c3fb249b5dde",
                "EMMC:/dev/block/bootdevice/by-name/boot:67108864:23953a8a0c715f9f085933529b34ac89206127e4",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:23953a8a0c715f9f085933529b34ac89206127e4");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/dsp.img", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_a");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_a");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_a");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_a");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_a");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_a");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_a");
package_extract_file("firmware-update/bluetooth.img", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_a");
package_extract_file("firmware-update/modem.img", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_a");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_a");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_a");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_a");
package_extract_file("firmware-update/cmnlib64.img", "/dev/block/bootdevice/by-name/cmnlib64_b");
package_extract_file("firmware-update/aop.img", "/dev/block/bootdevice/by-name/aop_b");
package_extract_file("firmware-update/devcfg.img", "/dev/block/bootdevice/by-name/devcfg_b");
package_extract_file("firmware-update/qupfw.img", "/dev/block/bootdevice/by-name/qupfw_b");
package_extract_file("firmware-update/tz.img", "/dev/block/bootdevice/by-name/tz_b");
package_extract_file("firmware-update/storsec.img", "/dev/block/bootdevice/by-name/storsec_b");
package_extract_file("firmware-update/keymaster.img", "/dev/block/bootdevice/by-name/keymaster_b");
package_extract_file("firmware-update/xbl.img", "/dev/block/bootdevice/by-name/xbl_b");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl_b");
package_extract_file("firmware-update/xbl_config.img", "/dev/block/bootdevice/by-name/xbl_config_b");
package_extract_file("firmware-update/cmnlib.img", "/dev/block/bootdevice/by-name/cmnlib_b");
package_extract_file("firmware-update/hyp.img", "/dev/block/bootdevice/by-name/hyp_b");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
