getprop("ro.product.device") == "E6746" || abort("E3004: This package is for \"E6746\" devices; this is a \"" + getprop("ro.product.device") + "\"."); ui_print("Source: Micromax/E6746/E6746:10/QP1A.190711.020/1615426476:user/release-keys"); ui_print("Target: Micromax/E6746/E6746:10/QP1A.190711.020/1618569804:user/release-keys"); ui_print("Verifying current system..."); getprop("ro.build.fingerprint") == "Micromax/E6746/E6746:10/QP1A.190711.020/1615426476:user/release-keys" || getprop("ro.build.fingerprint") == "Micromax/E6746/E6746:10/QP1A.190711.020/1618569804:user/release-keys" || abort("E3001: Package expects build fingerprint of Micromax/E6746/E6746:10/QP1A.190711.020/1615426476:user/release-keys or Micromax/E6746/E6746:10/QP1A.190711.020/1618569804:user/release-keys; this device has " + getprop("ro.build.fingerprint") + "."); patch_partition_check("EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:cd79e09b1f4035fca3c1f5fc68db0f88c72583c4", "EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:35f2fc16a4a2c214159f18ef4f40231bb9533a4d") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:cd79e09b1f4035fca3c1f5fc68db0f88c72583c4\" or \"EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:35f2fc16a4a2c214159f18ef4f40231bb9533a4d\" has unexpected contents."); apply_patch_space(42971136) || abort("E3006: Not enough free space on /cache to apply patches."); patch_partition_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188576:1eee54a12b8a9ad3926b79837d1c838470a25174", "EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188368:43cc177ffb59e4d5f9678dc8cc61019f6365209d") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188576:1eee54a12b8a9ad3926b79837d1c838470a25174\" or \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188368:43cc177ffb59e4d5f9678dc8cc61019f6365209d\" has unexpected contents."); apply_patch_space(55188576) || abort("E3006: Not enough free space on /cache to apply patches."); if (range_sha1(map_partition("system"), "502,1,105,122,133,149,150,32768,32770,32829,32860,32889,32891,32907,32911,32915,32916,32935,32939,32943,32944,32957,32961,32965,32966,32973,32977,32981,32982,32989,32993,32997,32998,33084,33090,33095,33096,33126,33130,33134,33135,33216,33220,33224,33225,33239,33243,33247,33248,33250,33251,33404,33408,33414,33415,33786,33790,33798,33799,34396,34397,34420,34424,34428,34429,34449,34453,34457,34458,34462,34466,34470,34471,34493,34497,34521,34522,34529,34533,34537,34538,34567,34571,34593,34594,35333,35337,35353,35354,35528,35532,35539,35540,35643,35644,35654,35658,35662,35663,35694,35698,35702,35703,36692,36698,36722,37386,37406,37410,37414,37415,37468,37472,37477,37478,37482,37488,37493,37494,37501,37505,37509,37510,37539,37540,37789,37790,38020,38026,38035,38051,38055,38056,38094,38098,38102,38103,38175,38179,38184,38185,42286,42290,42297,42298,43761,43765,43781,43782,43788,43792,43796,43797,43802,43806,43814,43815,43884,43888,43893,43894,44347,44348,46050,46051,46479,46480,48255,48256,50680,50682,50990,50991,50996,51015,51048,51049,51081,51082,51145,51146,51185,51186,51189,51190,51270,51271,51275,51276,51279,51281,65536,65576,69340,69341,71346,71347,71440,71441,72068,76623,77017,77614,77631,78109,78875,78876,78896,78897,79637,85308,85775,86502,86523,87174,88079,88088,98304,98306,98365,98396,99066,105693,108541,108545,108549,108551,108555,108557,108563,108565,108569,108571,108575,108577,108581,108583,108587,108589,108593,108595,108599,108601,108605,108607,108611,108613,108617,108619,108623,108625,108634,108636,108640,108642,108646,108648,108652,108654,108658,108660,108664,108666,108670,108672,108677,108679,108683,108685,108689,108691,108695,108697,108701,108703,108707,108709,108713,108715,108719,108721,108726,108728,108733,108735,108742,108744,108748,108750,108754,108756,108836,108838,108842,108844,108848,108850,108854,108856,108860,108862,108868,108870,108874,108876,108880,108883,108887,108889,108893,108895,108901,108903,108907,108909,108913,108915,108919,108921,108925,108927,108931,108933,108937,108939,108943,108945,108949,108951,108955,108957,108961,108963,108973,108975,108979,108981,108985,108987,108991,108993,108997,108999,109003,109005,109009,109011,109032,109034,109039,109041,109045,109047,109051,109053,109057,109059,109063,109065,109069,109071,109075,109077,109081,109083,109088,109090,109095,109097,109104,109106,109110,109112,109116,109118,109210,109212,109216,109635,116389,116391,116395,116397,116401,116403,116407,116409,116415,116417,116421,116423,116427,116429,122986,122987,127283,127284,127562,127563,127844,127845,127860,127861,127901,127902,131072,131103,134447,134448,144111,144112,146863,146864,150440,150441,155795,155796,163840,163842,163901,163936,164410,164411,164789,164790,164810,164811,164844,164845,165168,165169,176944,176945,185385,185386,196501,196502,196608,196639,197784,197785,202654,202655,209905,209906,210415,210416,210635,210636,212296,212297,213160,213162,213168,213172,213176,213178,213182,213185,213189,213191,213195,213197,213244,213248,213252,213253,213331,213335,213340,213341,213350,213354,213374,213376,214966,214968,215010,215012,216251,216253,216278,216280,216413,216415,217734,217736,217789,217791,217807,217809,218301,218303,218312,229378,229437,229466,229468,243772,244518,248396,248460,248461") == "27fa79535e526bd5a4d436033484b9f215eed1f8" || 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"), "502,1,105,122,133,149,150,32768,32770,32829,32860,32889,32891,32907,32911,32915,32916,32935,32939,32943,32944,32957,32961,32965,32966,32973,32977,32981,32982,32989,32993,32997,32998,33084,33090,33095,33096,33126,33130,33134,33135,33216,33220,33224,33225,33239,33243,33247,33248,33250,33251,33404,33408,33414,33415,33786,33790,33798,33799,34396,34397,34420,34424,34428,34429,34449,34453,34457,34458,34462,34466,34470,34471,34493,34497,34521,34522,34529,34533,34537,34538,34567,34571,34593,34594,35333,35337,35353,35354,35528,35532,35539,35540,35643,35644,35654,35658,35662,35663,35694,35698,35702,35703,36692,36698,36722,37386,37406,37410,37414,37415,37468,37472,37477,37478,37482,37488,37493,37494,37501,37505,37509,37510,37539,37540,37789,37790,38020,38026,38035,38051,38055,38056,38094,38098,38102,38103,38175,38179,38184,38185,42286,42290,42297,42298,43761,43765,43781,43782,43788,43792,43796,43797,43802,43806,43814,43815,43884,43888,43893,43894,44347,44348,46050,46051,46479,46480,48255,48256,50680,50682,50990,50991,50996,51015,51048,51049,51081,51082,51145,51146,51185,51186,51189,51190,51270,51271,51275,51276,51279,51281,65536,65576,69340,69341,71346,71347,71440,71441,72068,76623,77017,77614,77631,78109,78875,78876,78896,78897,79637,85308,85775,86502,86523,87174,88079,88088,98304,98306,98365,98396,99066,105693,108541,108545,108549,108551,108555,108557,108563,108565,108569,108571,108575,108577,108581,108583,108587,108589,108593,108595,108599,108601,108605,108607,108611,108613,108617,108619,108623,108625,108634,108636,108640,108642,108646,108648,108652,108654,108658,108660,108664,108666,108670,108672,108677,108679,108683,108685,108689,108691,108695,108697,108701,108703,108707,108709,108713,108715,108719,108721,108726,108728,108733,108735,108742,108744,108748,108750,108754,108756,108836,108838,108842,108844,108848,108850,108854,108856,108860,108862,108868,108870,108874,108876,108880,108883,108887,108889,108893,108895,108901,108903,108907,108909,108913,108915,108919,108921,108925,108927,108931,108933,108937,108939,108943,108945,108949,108951,108955,108957,108961,108963,108973,108975,108979,108981,108985,108987,108991,108993,108997,108999,109003,109005,109009,109011,109032,109034,109039,109041,109045,109047,109051,109053,109057,109059,109063,109065,109069,109071,109075,109077,109081,109083,109088,109090,109095,109097,109104,109106,109110,109112,109116,109118,109210,109212,109216,109635,116389,116391,116395,116397,116401,116403,116407,116409,116415,116417,116421,116423,116427,116429,122986,122987,127283,127284,127562,127563,127844,127845,127860,127861,127901,127902,131072,131103,134447,134448,144111,144112,146863,146864,150440,150441,155795,155796,163840,163842,163901,163936,164410,164411,164789,164790,164810,164811,164844,164845,165168,165169,176944,176945,185385,185386,196501,196502,196608,196639,197784,197785,202654,202655,209905,209906,210415,210416,210635,210636,212296,212297,213160,213162,213168,213172,213176,213178,213182,213185,213189,213191,213195,213197,213244,213248,213252,213253,213331,213335,213340,213341,213350,213354,213374,213376,214966,214968,215010,215012,216251,216253,216278,216280,216413,216415,217734,217736,217789,217791,217807,217809,218301,218303,218312,229378,229437,229466,229468,243772,244518,248396,248460,248461") && 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"), "24,1,73,846,852,870,871,912,918,923,924,1463,1469,1486,1487,1684,32770,32793,65574,65576,94701,95021,96530,96564,96565") == "450f4247df2b27025fd8f42f6b3243c0c6391eb8" || 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"), "24,1,73,846,852,870,871,912,918,923,924,1463,1469,1486,1487,1684,32770,32793,65574,65576,94701,95021,96530,96564,96565") && 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"), "20,1,32770,32882,98306,98418,163842,163954,229378,229490,294914,295026,425988,425989,458753,458757,460633,462021,469344,469448,469449") == "1ca846b190e79039981d8ded891403233d2759f2" || 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"), "20,1,32770,32882,98306,98418,163842,163954,229378,229490,294914,295026,425988,425989,458753,458757,460633,462021,469344,469448,469449") && 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.800000, 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 product ui_print("Patching product image after verification."); block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") || abort("E2001: Failed to update product image."); # Patch partition 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."); # --- End patching dynamic partitions --- ui_print("Patching boot image..."); show_progress(0.100000, 10); patch_partition("EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:cd79e09b1f4035fca3c1f5fc68db0f88c72583c4", "EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:35f2fc16a4a2c214159f18ef4f40231bb9533a4d", package_extract_file("boot.img.p")) || abort("E3008: Failed to apply patch to EMMC:/dev/block/platform/bootdevice/by-name/boot:33554432:35f2fc16a4a2c214159f18ef4f40231bb9533a4d"); 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("dtbo.img", "/dev/block/platform/bootdevice/by-name/dtbo"); package_extract_file("vbmeta_system.img", "/dev/block/platform/bootdevice/by-name/vbmeta_system"); package_extract_file("vbmeta_vendor.img", "/dev/block/platform/bootdevice/by-name/vbmeta_vendor"); ui_print("Patching md1img image..."); show_progress(0.100000, 10); patch_partition("EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188576:1eee54a12b8a9ad3926b79837d1c838470a25174", "EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188368:43cc177ffb59e4d5f9678dc8cc61019f6365209d", package_extract_file("patch/md1img.img.p")) || abort("E3008: Failed to apply patch to EMMC:/dev/block/platform/bootdevice/by-name/md1img:55188368:43cc177ffb59e4d5f9678dc8cc61019f6365209d"); package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/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/platform/bootdevice/by-name/sspm_2"); package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2"); package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2"); package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2"); if get_storage_type() then assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot1")); 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("lk", "lk2"); 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/platform/bootdevice/by-name/sspm_1"); package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1"); package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1"); package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk"); if get_storage_type() then assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot0")); 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("lk2", "lk"); switch_active("preloader2", "preloader"); ), ui_print("main loader images are already updated"); ); delete("/cache/recovery/last_mtupdate_stage"); package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta"); post_ota_action(); set_progress(1.000000);