getprop("ro.product.device") == "platina" || abort("E3004: This package is for \"platina\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.5.0.PDTCNXM:user/release-keys");
ui_print("Target: Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.7.0.PDTCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.5.0.PDTCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.7.0.PDTCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.5.0.PDTCNXM:user/release-keys or Xiaomi/platina/platina:9/PKQ1.181007.001/V10.3.7.0.PDTCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:54146378:283b14b9ab30535955b6bf2bcd92dfe57d2e4a88:54146378:c083d8fbb54445d73356cd9da4264e6ea765e364") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:54146378:283b14b9ab30535955b6bf2bcd92dfe57d2e4a88:54146378:c083d8fbb54445d73356cd9da4264e6ea765e364\" has unexpected contents.");
apply_patch_space(213139456) || 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", "676,1,208,223,527,8303,8377,8396,8510,8553,8623,8675,8681,8691,8747,8752,8763,9097,9142,9167,9196,9425,9446,9479,9637,9660,9720,9864,9866,9970,9981,10096,10423,10452,10510,10526,10554,10693,11057,11192,11225,11690,11694,11733,11741,11748,11812,11909,11913,11962,12003,12019,12106,12156,12255,12335,12623,12678,12718,12792,12819,12841,12969,13259,14211,14285,14845,15034,19291,19448,19453,19589,19640,19758,19832,19843,19847,19963,20161,20169,20180,20195,20218,20345,20496,20526,20541,20587,20659,20669,20732,20820,20861,20888,20924,21277,21343,21362,21574,21604,21611,21859,21903,22280,22311,22532,25076,25187,25206,25467,25519,25554,25564,25649,25695,25799,25936,25946,26005,26042,29328,29336,29374,29386,29392,29495,29543,29700,29720,30115,30119,30181,30228,30287,30300,30368,30410,30492,30497,30515,30608,30627,30632,30726,30739,30792,30839,30867,30896,30990,31033,31108,32479,32484,32496,32726,32733,32767,32770,32959,33023,33032,33157,33280,36535,36548,36608,36657,37111,37320,39852,41307,64931,65240,66834,67620,67621,67743,68124,68643,69003,69675,69728,71821,71822,73092,98306,98495,121328,122644,122659,122780,122797,122910,122915,122925,122930,122944,122947,123440,123447,123467,123473,123499,123655,123663,123732,123759,124185,124320,155695,156798,163842,164031,194210,195892,195894,197582,197776,198136,229378,229567,277257,281797,294914,295103,323430,331622,443802,444139,444305,444688,445376,445810,482926,484921,484922,484955,492539,493487,493652,494064,494070,494091,494537,495030,495238,495767,495819,496152,496182,496323,497159,497225,497289,497359,505711,506873,506976,507093,507120,507128,507273,507324,507377,507444,507463,507729,507764,507795,507837,507969,507990,508062,510382,511783,524293,524295,524296,528344,555937,555938,555940,555942,555954,555955,555957,555959,555967,555968,555971,555973,555986,555989,559023,559025,559068,559071,559710,559711,559714,559716,559725,559726,561133,561135,562765,562768,562792,562795,566512,566513,568605,568607,569019,569020,569023,569025,569222,569223,569295,569596,569605,569608,570829,570830,570832,570834,570851,570852,570891,570893,571802,571803,571808,571810,571894,571895,573069,573071,574191,574192,574200,574202,574650,574651,575646,575648,576767,576768,576780,576782,576806,576807,576809,576811,576824,576825,577131,577133,578363,578364,578927,578929,579198,579201,579207,579209,579248,579249,579259,579261,579436,579437,579454,579456,579595,579596,579599,579601,579626,579627,579629,579631,579669,579670,579672,579674,579684,579685,582650,582652,586323,586324,586327,586329,586449,586452,586864,586865,586867,586869,586894,586897,587627,587628,587630,587632,587653,587656,587696,587697,587699,587701,587715,587716,587764,587766,588016,588017,588019,588021,588036,588037,588044,588046,588057,588058,590128,590130,592315,592318,592334,592335,592360,592361,592363,592365,592371,592372,592385,592387,592414,592415,594063,594064,596292,596294,596883,596886,597276,597278,597827,597828,597833,597835,597844,597845,599535,599536,617506,617507,628997,628999,629540,629541,630078,630081,630130,630132,630248,630249,630296,630298,630418,630421,630423,630425,630457,630458,630465,630467,630475,630476,630478,630480,630507,630508,630510,630512,630536,630537,630892,630894,630948,630949,630951,630953,630962,630965,631028,631030,631429,631430,631484,631486,631568,631569,631573,631575,631630,631631,631638,631640,632032,632033,632036,632038,632048,632049,632051,632052,632166,632168,632665,632666,632701,632702,632917,632918,632926,632928,632973,632974,632976,632977,632990,632992,633009,633010,633013,633015,633024,633025,640641,640643,643114,643115,643981,643982,643991,643993,644008,644258,644648,644649,644848,644850,645658,647181,647184,647186,647197,647200,648746,648748,649090,649091,649094,649096,649246,649247,649249,649251,649341,649342,649369,649371,649578,649579,649581,649583,649628,649629,649868,649870,650636,650637,650641,650643,650660,650661,650685,650687,650841,650842,653736,653737,653782,653784,654191,654192,654357,654359,655058,655059,655066,655068,655082,655083,658005,658007,659869,660233,660317,660319,660330,663879,664053,664055,664733,664736,664762,664764,665029,665030,665089,665091,665226,665227,665230,665232,665274,665277,665279,665281,665289,665294,666525,666526,666589,666591,666850,666851,671443,671480,671490,671509,671517,671551,671554,671592,671621,671636,671660,673647,673859,679904,680305,680472,680475,680809,680890,681014,681110,683011,683168,684043,684554,684555,687539,687540,687987,774346,780254,780261,786432") == "2f13a3aac323b7ac7f71fc91e70dd0048c06bd51" || 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", "676,1,208,223,527,8303,8377,8396,8510,8553,8623,8675,8681,8691,8747,8752,8763,9097,9142,9167,9196,9425,9446,9479,9637,9660,9720,9864,9866,9970,9981,10096,10423,10452,10510,10526,10554,10693,11057,11192,11225,11690,11694,11733,11741,11748,11812,11909,11913,11962,12003,12019,12106,12156,12255,12335,12623,12678,12718,12792,12819,12841,12969,13259,14211,14285,14845,15034,19291,19448,19453,19589,19640,19758,19832,19843,19847,19963,20161,20169,20180,20195,20218,20345,20496,20526,20541,20587,20659,20669,20732,20820,20861,20888,20924,21277,21343,21362,21574,21604,21611,21859,21903,22280,22311,22532,25076,25187,25206,25467,25519,25554,25564,25649,25695,25799,25936,25946,26005,26042,29328,29336,29374,29386,29392,29495,29543,29700,29720,30115,30119,30181,30228,30287,30300,30368,30410,30492,30497,30515,30608,30627,30632,30726,30739,30792,30839,30867,30896,30990,31033,31108,32479,32484,32496,32726,32733,32767,32770,32959,33023,33032,33157,33280,36535,36548,36608,36657,37111,37320,39852,41307,64931,65240,66834,67620,67621,67743,68124,68643,69003,69675,69728,71821,71822,73092,98306,98495,121328,122644,122659,122780,122797,122910,122915,122925,122930,122944,122947,123440,123447,123467,123473,123499,123655,123663,123732,123759,124185,124320,155695,156798,163842,164031,194210,195892,195894,197582,197776,198136,229378,229567,277257,281797,294914,295103,323430,331622,443802,444139,444305,444688,445376,445810,482926,484921,484922,484955,492539,493487,493652,494064,494070,494091,494537,495030,495238,495767,495819,496152,496182,496323,497159,497225,497289,497359,505711,506873,506976,507093,507120,507128,507273,507324,507377,507444,507463,507729,507764,507795,507837,507969,507990,508062,510382,511783,524293,524295,524296,528344,555937,555938,555940,555942,555954,555955,555957,555959,555967,555968,555971,555973,555986,555989,559023,559025,559068,559071,559710,559711,559714,559716,559725,559726,561133,561135,562765,562768,562792,562795,566512,566513,568605,568607,569019,569020,569023,569025,569222,569223,569295,569596,569605,569608,570829,570830,570832,570834,570851,570852,570891,570893,571802,571803,571808,571810,571894,571895,573069,573071,574191,574192,574200,574202,574650,574651,575646,575648,576767,576768,576780,576782,576806,576807,576809,576811,576824,576825,577131,577133,578363,578364,578927,578929,579198,579201,579207,579209,579248,579249,579259,579261,579436,579437,579454,579456,579595,579596,579599,579601,579626,579627,579629,579631,579669,579670,579672,579674,579684,579685,582650,582652,586323,586324,586327,586329,586449,586452,586864,586865,586867,586869,586894,586897,587627,587628,587630,587632,587653,587656,587696,587697,587699,587701,587715,587716,587764,587766,588016,588017,588019,588021,588036,588037,588044,588046,588057,588058,590128,590130,592315,592318,592334,592335,592360,592361,592363,592365,592371,592372,592385,592387,592414,592415,594063,594064,596292,596294,596883,596886,597276,597278,597827,597828,597833,597835,597844,597845,599535,599536,617506,617507,628997,628999,629540,629541,630078,630081,630130,630132,630248,630249,630296,630298,630418,630421,630423,630425,630457,630458,630465,630467,630475,630476,630478,630480,630507,630508,630510,630512,630536,630537,630892,630894,630948,630949,630951,630953,630962,630965,631028,631030,631429,631430,631484,631486,631568,631569,631573,631575,631630,631631,631638,631640,632032,632033,632036,632038,632048,632049,632051,632052,632166,632168,632665,632666,632701,632702,632917,632918,632926,632928,632973,632974,632976,632977,632990,632992,633009,633010,633013,633015,633024,633025,640641,640643,643114,643115,643981,643982,643991,643993,644008,644258,644648,644649,644848,644850,645658,647181,647184,647186,647197,647200,648746,648748,649090,649091,649094,649096,649246,649247,649249,649251,649341,649342,649369,649371,649578,649579,649581,649583,649628,649629,649868,649870,650636,650637,650641,650643,650660,650661,650685,650687,650841,650842,653736,653737,653782,653784,654191,654192,654357,654359,655058,655059,655066,655068,655082,655083,658005,658007,659869,660233,660317,660319,660330,663879,664053,664055,664733,664736,664762,664764,665029,665030,665089,665091,665226,665227,665230,665232,665274,665277,665279,665281,665289,665294,666525,666526,666589,666591,666850,666851,671443,671480,671490,671509,671517,671551,671554,671592,671621,671636,671660,673647,673859,679904,680305,680472,680475,680809,680890,681014,681110,683011,683168,684043,684554,684555,687539,687540,687987,774346,780254,780261,786432") && 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", "26,1,197,207,208,223,453,8303,32770,32959,98306,98495,163842,164031,194508,229376,229378,294912,294914,524288,524289,524295,524296,774155,780254,780261,786432") == "0c4939880469e5414b15600c9b6047d4e3d141bb" || 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", "26,1,197,207,208,223,453,8303,32770,32959,98306,98495,163842,164031,194508,229376,229378,294912,294914,524288,524289,524295,524296,774155,780254,780261,786432") && 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);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:54146378:283b14b9ab30535955b6bf2bcd92dfe57d2e4a88:54146378:c083d8fbb54445d73356cd9da4264e6ea765e364",
            "-", c083d8fbb54445d73356cd9da4264e6ea765e364, 54146378,
            283b14b9ab30535955b6bf2bcd92dfe57d2e4a88, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
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.");

# ---- 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/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/pmic.elf", "/dev/block/bootdevice/by-name/pmic");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/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/pmic.elf", "/dev/block/bootdevice/by-name/pmicbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
show_progress(0.100000, 2);
